前言
安装Redis请参考
本文按照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
将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
出现如下界面执行成功
输入yes
,同意本次分配,分配结果如下
3.进入6381端口下的redis,查看集群状态
docker exec -it redis-node-1 /bin/bash
进入redis客户端
## 此处的 -c 参数的作用是,优化路由,
##避免在不加当前参数直接连接redis的情况下,存入数据时,因为存在哈希槽分配,
##从而导致不是该哈希槽内的数据无法存入,指定 -c 以后,不是该哈希槽内的数据,
##在存储时,就会从定向到指定哈希槽内
redis-cli -p 6381 -c
查看集群状态
cluster info
查看节点状态
cluster nodes
默认分配的节点关系为:(此处的节点关系由系统分配,所以每一次可能都不一样)
主机(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
出现如下界面表示执行成功
4.查看集群情况,此时的6387是没有槽位的
# redis-cli --cluster check 真实ip地址:6381
redis-cli --cluster check 172.31.126.115:6381
5.重新分配槽位
# redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 172.31.126.115:6381
输入yes
同意本次分配
6.再次查看集群情况
# redis-cli --cluster check 真实ip地址:6381
redis-cli --cluster check 172.31.126.115:6381
注意:此处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
出现如下界面扩容成功
- 集群缩容
对集群进行缩容时,应该先删除从机,再删除主机
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
3.删除6387节点
# redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli --cluster del-node 172.31.126.115:6387 3d6a4344dd6d80bc2eb1971a183817a9d15c5d72