1. 环境软件版本
环境&软件 | 版本 |
---|---|
虚拟机&VMware Workstation Pro | VMwareworkstation15.5.6 |
服务器&Centos | CentOS-7-x86_64-DVD-1503-01.iso |
redis | redis-5.0.10 |
远程连接&Xshell | 5 |
远程文件传输&Xftp | 5 |
2. 环境架构设计
机器名称 | IP:port | 角色 |
---|---|---|
redis | 192.168.5.136:7001 | redis节点 |
redis | 192.168.5.136:7002 | redis节点 |
redis | 192.168.5.136:7003 | redis节点 |
redis | 192.168.5.136:7004 | redis节点 |
redis | 192.168.5.136:7005 | redis节点 |
redis | 192.168.5.136:7006 | redis节点 |
redis | 192.168.5.136:7007 | redis节点 |
redis | 192.168.5.136:7008 | redis节点 |
3.搭建步骤
- 解压redis压缩包,进入redis目录,进行编译,安装
make #编译
#编译完进入src目录,将redis安装到指定的文件夹下
make install PREFIX=/var/redis-cluster/7001
#并且将redis解压目录下的redis.conf拷贝到/var/redis-cluster/7001/bin
#编辑redis.conf
port 7001 #修改端口
cluster-enabled yes #开启cluster
#bind 127.0.0.1 #注释该行,允许远程访问
protected-mode no #关闭保护模式
接着拷贝7001到其他节点目录下,并修改redis.conf里的端口配置
#拷贝
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7002
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7003
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7004
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7005
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7006
在redis-cluster建立启动脚本start.sh
cd 7001/bin
./redis-server redis.conf
cd ..
cd ..
cd 7002/bin
./redis-server redis.conf
cd ..
cd ..
cd 7003/bin
./redis-server redis.conf
cd ..
cd ..
cd 7004/bin
./redis-server redis.conf
cd ..
cd ..
cd 7005/bin
./redis-server redis.conf
cd ..
cd ..
cd 7006/bin
./redis-server redis.conf
cd ..
cd ..
修改start.sh执行权限,启动redis节点
chmod u+x start.sh
启动好redis节点后,进入其中一个的bin目录,创建cluster集群
./redis-cli --cluster create 192.168.5.136:7001 192.168.5.136:7002 192.168.5.136:7003 192.168.5.136:7004 192.168.5.136:7005 192.168.5.136:7006 --cluster-replicas 1
# cluster-replicas : 1 1从机 前三个为主
可以看到效果:
连接集群
./redis-cli -h 127.0.0.1 -p 7001 -c
# -c:以集群方式连接
重定向
moved重定向
1.每个节点通过通信都会共享Redis Cluster中槽和集群中对应节点的关系
2.客户端向Redis Cluster的任意节点发送命令,接收命令的节点会根据CRC16规则进行hash运算与
16384取余,计算自己的槽和对应节点
3.如果保存数据的槽被分配给当前节点,则去槽中执行命令,并把命令执行结果返回给客户端
4.如果保存数据的槽不在当前节点的管理范围内,则向客户端返回moved重定向异常
5.客户端接收到节点返回的结果,如果是moved异常,则从moved异常中获取目标节点的信息
6.客户端向目标节点发送命令,获取命令执行结果
- 扩容
#新建7007目录,安装一个新的redis(无数据)到7007目录下,拷贝7001中的redis.conf到7007的bin下,复制7007到7008
mkdir /var/redis-cluster/7007
#进入redis的src目录下进行安装
make install PREFIX=/var/redis-cluster/7007
#进入/var/redis-cluster目录,拷贝
cp 7001/bin/redis.conf 7007/bin/
启动7007节点,进入7007/bin
#启动7007
./redis-server redis.conf
#将7007加入cluster集群
./redis-cli --cluster add-node 192.168.5.136:7007 192.168.5.136:7001
cluster nodes查看节点信息
可见7007目前是没有分配槽位,分配槽位
./redis-cli --cluster reshard 192.168.5.136:7007
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:
#输入all表示从其他节点平均分配到目标节点
#done是指,可以选择提供槽位的节点,最后输入done结束,进行分配
新增节点7008作为7007的从节点,启动7008节点,将7008挂载到7007下
./redis-cli --cluster add-node 新节点的ip和端口 旧节点ip和端口 --cluster-slave -- cluster-master-id 主节点id
最后节点分布效果
4.jedisCluster连接redis-cluster
依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
public class JedisClusterDemo {
public static void main(String[] args) {
JedisPoolConfig config = new JedisPoolConfig();
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("192.168.5.136", 7001));
jedisClusterNode.add(new HostAndPort("192.168.5.136", 7002));
jedisClusterNode.add(new HostAndPort("192.168.5.136", 7003));
jedisClusterNode.add(new HostAndPort("192.168.5.136", 7004));
jedisClusterNode.add(new HostAndPort("192.168.5.136", 7005));
jedisClusterNode.add(new HostAndPort("192.168.5.136", 7006));
jedisClusterNode.add(new HostAndPort("192.168.5.137", 7006));
jedisClusterNode.add(new HostAndPort("192.168.5.138", 7006));
JedisCluster jcd = new JedisCluster(jedisClusterNode, config);
jcd.set("name:003","wangwu");
String value = jcd.get("name:003");
System.out.println(value);
}
}