创建开启六台redis容器
systemctl restart docker
docker pull redis:6.0.8 根据需求下载redis的镜像版本
配置3主3从 开启六台redis容器 分别用node-1 ~ node-6 来区分
docker run -d --name redis-node-1 --net host --privileged=true -v /tmp/redis/share/redis-node-1:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /tmp/redis/share/redis-node-2:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /tmp/redis/share/redis-node-3:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /tmp/redis/share/redis-node-4:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /tmp/redis/share/redis-node-5:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /tmp/redis/share/redis-node-6:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
--net host 使用宿主机的IP和端口(默认)
--cluster-enabled yes 表示是否打开redis集群
--privileged=true 获取宿主机root权限
--appendonly yes 开启持久化
启动结果 如图所示
进入 node-1 为6台机器构建集群关系(分配哈希槽)
docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 192.168.20.128:6381 192.168.20.128:6382 192.168.20.128:6383 192.168.20.128:6384 192.168.20.128:6385 192.168.20.128:6386 --cluster-replicas 1
执行结果如下图所示
按图中所示:M为主,S为从。即:6381~6383 (node-1~3为主,node-4~6为从)
PS:IP地址为真是宿主机的IP + 每个redis容器的端口号
redis-cli 进入到redis
--cluster create 构建集群
--cluster-replicas 1 表示为每一个 master 创建一个 slave 节点 (六台机器,1:1一个对一个)
以node-1 作为切入点 查看集群状态
redis-cli -p 6381
cluster info 查看集群信息 如下图一所示
cluster nodes 查看3主3从都是谁挂在谁下 如下图二所示
PS:根据图中红框所示,以红框1的端口号确认是哪台机器(确认为node-1节点)
红框2跟右侧红框3比对,即知道红框3的端口号为6386(确认node-6节点)
以此类推即 6台机器的挂载对象分别为:
node节点123为主,456为从,1-6 、2-4、3-5 分别为一对(一主一从)
redis 单机、集群方式连接的区别
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 单机方式连接
redis-cli -p 6381 -c 集群方式连接
二者的区别在于,
单机方式连接: 创建数据时,会根据自己分配的槽位数进行创建,如果创建的数据槽位
超过登入本机分配的槽位数时创建失败。
集群方式连接: 创建数据时,创建的数据槽位数如果超过登入的本机分配的槽位数量时,
会自动跳到对应槽位数的服务器节点上。
槽位是根据CRC算法生成的
PS: 个节点槽位数分配如图所示
docker exec -it redis-node-1 /bin/bash 以node1节点演示
redis-cli -p 6381 单机方式连接 如下图所示
防止路由失效 -c 集群环境连接
docker exec -it redis-node-1 /bin/bash 以node1节点演示
redis-cli -p 6381 -c 集群方式连接 如下图所示
查看集群内的详细信息
redis-cli --cluster check 192.168.20.128:6381 如图所示
--cluster check 集群检查
容错切换迁移
由上图得知 有两个key在两个主节点上,节点1上有一个key,而节点1是主,节点6是从,
测试主节点1宕机,从节点6是否能正常上位接收数据。
docker stop redis-node-1 停掉节点1
docker exec -it redis-node-2 /bin/bash 以主节点2登入
redis-cli -p 6382 -c
如下图一所示:也能使用 get 查询出数据
而如果node1节点重新启动后
如图所示:
节点1会从原来的主服务器(master)变成节点6的从服务器(slave)。
即因master主服务器停机后,slave从服务器上位变成master主服务器,
不会因为原来的master主服务器重新启动后,就会变回去,而是由原来的主从身份对换。
PS:如果还想让节点1变成主服务器,就将节点六容器重启下,就会主从身份再次对调。
redis-cli --cluster check 192.168.20.128:6382 查看验证本机数据是否有丢失……
主从扩容
需求: 3主3从 扩容成4主4从,且将6388(从 node-8)挂载到6387(主 node-7)
docker run -d --name redis-node-7 --net host --privileged=true -v /tmp/redis/share/redis-node-7:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /tmp/redis/share/redis-node-8:/data/ redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
新建6387、6388两个节点
docker ps 查看验证是否为八个节点
docker exec -it redis-node-7 /bin/bash 登入想要作为master节点的7号机
redis-cli --cluster add-node 192.168.20.128:6387 192.168.20.128:6381
如下图一所示,需要将7号机加入原有集群的6381(主节点1号机)
redis-cli --cluster check 192.168.20.128:6381
如下图二所示,查看新增主节点的信息(6387)
重新为新添加的节点分配槽位数
redis-cli --cluster reshard 192.168.20.128:6381 重新分配槽位
如下图所示(16384➗master数(4))
如图依次按步骤执行即可
redis-cli --cluster check 192.168.20.128:6381 再次验证 如下图所示
PS: 新增加的节点的槽位,是前面三个分别每个匀了一些凑出来给的,并不是全部重新删除分配的。
为主节点6387分配从节点6388
redis-cli --cluster add-node 192.168.20.128:6388 192.168.20.128:6387 --cluster-slave --cluster-master-id 5ebc7fe6e01400fbadd07be045bcdd4fbdb437de
最后面的id 是 6387 的id 注意不要写错。 ip地址为自己宿主机的ip
如图所示:
redis-cli --cluster check 192.168.20.128:6381
如图所示 4主4从 扩容完成
主从缩容
需求: 将4主4从缩容为3主3从
删除从机6388节点
# 因为主机负责写如,所以删除(缩容)最好是以从机先开始删除
redis-cli --cluster del-node 192.168.20.128:6388 5b5dcbff222267e9949e64e07499313acf0fc89d
删除6388从节点
命令:del-node 删除节点 + 宿主机i:从机端口 + 从机6388节点ID
redis-cli --cluster check 192.168.20.128:6381
查看验证 如图所示 已删除从机6388节点
删除从节点之后重新分配槽位
redis-cli --cluster reshard 192.168.20.128:6381
重新分配槽位以6381为切入点操作整个集群,(也可选择别的主机点)
因为要删除节点,节点删除之后空出来的槽位
如下图所示:
验证槽位分配情况
redis-cli --cluster check 192.168.20.128:6381
查看验证 确认 6387节点槽位数为零 而6381槽位数增加
如图所示
删除6387主节点 并验证
redis-cli --cluster del-node 192.168.20.128:6387 5ebc7fe6e01400fbadd07be045bcdd4fbdb437de
删除6387主节点
命令:del-node 删除节点 + 宿主机i:从机端口 + 从机6388节点ID
redis-cli --cluster check 192.168.20.128:6381
查看验证 如图所示 已删除主机6387节点
标签:缩容,node,--,redis,192.168,cluster,哈希,节点
From: https://blog.51cto.com/cyfang/6750000