docker分布式存储之哈希槽3主3从redis集群配置+主从扩容缩容
  HataGTb8c2ak 2023年11月02日 41 0

创建开启六台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	 开启持久化

启动结果 如图所示

image.png

进入 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一个对一个)

image.png

以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 分别为一对(一主一从)
   

image.png

image.png

redis 单机、集群方式连接的区别

docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381     单机方式连接
redis-cli -p 6381 -c  集群方式连接

二者的区别在于,
单机方式连接: 创建数据时,会根据自己分配的槽位数进行创建,如果创建的数据槽位
		       超过登入本机分配的槽位数时创建失败。
集群方式连接: 创建数据时,创建的数据槽位数如果超过登入的本机分配的槽位数量时,
			   会自动跳到对应槽位数的服务器节点上。
			   
槽位是根据CRC算法生成的

PS: 个节点槽位数分配如图所示

image.png

docker exec -it redis-node-1 /bin/bash    以node1节点演示
redis-cli -p 6381        单机方式连接 如下图所示

image.png

防止路由失效 -c 集群环境连接

docker exec -it redis-node-1 /bin/bash    以node1节点演示
redis-cli -p 6381 -c     集群方式连接 如下图所示

image.png

查看集群内的详细信息

redis-cli --cluster check 192.168.20.128:6381    如图所示
--cluster check        集群检查

image.png

容错切换迁移

由上图得知 有两个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 查询出数据

image.png image.png

而如果node1节点重新启动后

如图所示:
节点1会从原来的主服务器(master)变成节点6的从服务器(slave)。
即因master主服务器停机后,slave从服务器上位变成master主服务器,
不会因为原来的master主服务器重新启动后,就会变回去,而是由原来的主从身份对换。

PS:如果还想让节点1变成主服务器,就将节点六容器重启下,就会主从身份再次对调。

redis-cli --cluster check 192.168.20.128:6382  查看验证本机数据是否有丢失……

image.png

主从扩容

需求: 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)

image.png

image.png

重新为新添加的节点分配槽位数

redis-cli --cluster reshard 192.168.20.128:6381   重新分配槽位 
如下图所示(16384➗master数(4)) 
如图依次按步骤执行即可

image.png image.png image.png

redis-cli --cluster check 192.168.20.128:6381    再次验证 如下图所示

PS: 新增加的节点的槽位,是前面三个分别每个匀了一些凑出来给的,并不是全部重新删除分配的。

image.png

为主节点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

如图所示:

image.png

redis-cli --cluster check 192.168.20.128:6381  
如图所示 4主4从 扩容完成

image.png

主从缩容

需求: 将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节点

image.png

删除从节点之后重新分配槽位

redis-cli --cluster reshard 192.168.20.128:6381 
重新分配槽位以6381为切入点操作整个集群,(也可选择别的主机点)
因为要删除节点,节点删除之后空出来的槽位

如下图所示:

image.png image.png

验证槽位分配情况

redis-cli --cluster check 192.168.20.128:6381  
查看验证 确认 6387节点槽位数为零 而6381槽位数增加 
如图所示

image.png

删除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节点

image.png

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  wwLZeziuqjLR   2023年12月11日   30   0   0 Dockercentos
  MCWYWqSAMsot   2023年12月11日   31   0   0 Docker
  nIt0XG0acU8j   2023年12月11日   29   0   0 linuxhtop
HataGTb8c2ak