前言

本文按照3个主机,3个从机的架构进行搭建,当其中任何一个主机挂掉以后,他所对应的从机都会上位,成为主机,接替他的工作,并且数据也不会丢失,当挂掉的主机复机以后,将不会再是主机,而是作为从机,若是还想让其恢复主机的身份,那么可以将刚才上位的从机停止,再重启

搭建步骤

  • 此处按照3主3从的架构搭建
    1.新建6个docker容器redis实例
docker run -d --name redis-node-1 --net host --privileged=true -v /myredisdata/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 /myredisdata/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 /myredisdata/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 /myredisdata/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 /myredisdata/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 /myredisdata/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

上诉命令解释:
docker run:创建并运行docker容器实例
-d:后台运行
--name redis-node-6:容器名称
--net host:使用宿主机的IP和端口,默认
--privileged=true:获取宿主机root用户权限
-v /myredisdata/redis/share/redis-node-6:/data:容器卷,宿主机地址:docker内部地址
redis:6.0.8:redis镜像和版本号
--cluster-enabled yes:开启redis集群
--appendonly yes:开启持久化
--port 6386:redis端口号

2·进入容器redis-node-1并为6台机器构建集群关系

进入容器

docker exec -it redis-node-1 /bin/bash

构建集群关系
获取IP

ifconfig

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_redis


将IP替换到如下命令中,执行

redis-cli
--cluster create
172.31.126.115:6381
172.31.126.115:6382
172.31.126.115:6383
172.31.126.115:6384
172.31.126.115:6385
172.31.126.115:6386
--cluster-replicas 1

出现如下界面执行成功

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_redis_02


输入yes,同意本次分配,分配结果如下

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_容器_03


3.进入6381端口下的redis,查看集群状态

docker exec -it redis-node-1 /bin/bash

进入redis客户端

## 此处的 -c 参数的作用是,优化路由,
##避免在不加当前参数直接连接redis的情况下,存入数据时,因为存在哈希槽分配,
##从而导致不是该哈希槽内的数据无法存入,指定 -c 以后,不是该哈希槽内的数据,
##在存储时,就会从定向到指定哈希槽内

 redis-cli -p 6381 -c

查看集群状态

cluster info

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_容器_04


查看节点状态

cluster nodes

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_redis_05

默认分配的节点关系为:(此处的节点关系由系统分配,所以每一次可能都不一样)

主机(Master)

从机(Slave)

端口号6381

端口号6485

端口号6382

端口号6486

端口号6383

端口号6484

-集群扩容
对之前的3主3从进行扩容,扩容到4主4从
1.额外启动6387、6388两个节点

docker run -d --name redis-node-7 --net host --privileged=true -v /data/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 /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

2.进入6387容器实例内部

docker exec -it redis-node-7 /bin/bash

3.将新增的6387节点(空槽号)作为master节点加入原集群

## 将新增的6387作为master节点加入集群
## redis-cli --cluster add-node 自己实际IP地址:本次添加的节点端口号  自己实际IP地址:目标集群节点的端口号


redis-cli --cluster add-node 172.31.126.115:6387 172.31.126.115:6381

出现如下界面表示执行成功

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_容器_06


4.查看集群情况,此时的6387是没有槽位的

# redis-cli --cluster check 真实ip地址:6381
redis-cli --cluster check 172.31.126.115:6381

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_端口号_07

5.重新分配槽位

# redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 172.31.126.115:6381

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_容器_08


输入yes同意本次分配

6.再次查看集群情况

# redis-cli --cluster check 真实ip地址:6381
redis-cli --cluster check 172.31.126.115:6381

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_docker_09


注意:此处6387的槽位,并不是按照每个主机4096个槽位重新均等分配,因为重新分配成本太高,所以前3个主机各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387,所以会出现图中的3个区间

7.·为主节点6387分配从节点6388

# redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 主机节点ID

redis-cli --cluster add-node 172.31.126.115:6388 172.31.126.115:6387 --cluster-slave --cluster-master-id 3d6a4344dd6d80bc2eb1971a183817a9d15c5d72

出现如下界面扩容成功

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_redis_10

  • 集群缩容
    对集群进行缩容时,应该先删除从机,再删除主机

1.移除从机

# redis-cli --cluster del-node ip:从机端口 从机6388节点ID
 
redis-cli --cluster del-node 172.31.126.115:6388  001092b879da488f2944d23e2bc37c1ac08a1114

2.将6387的槽号清空,重新分配

redis-cli --cluster reshard 172.31.126.115:6381

一台机器redis搭建一主两从三哨兵集群 redis三主三从集群搭建_docker_11


3.删除6387节点

# redis-cli --cluster del-node ip:端口 6387节点ID
 
redis-cli --cluster del-node 172.31.126.115:6387  3d6a4344dd6d80bc2eb1971a183817a9d15c5d72