演示只用一台虚拟机,多机记得把对应ip给换了
1.docker启动六台容器实例
docker run -d --name redis-node-1 --net host --privileged=true -v /data/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 /data/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 /data/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 /data/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 /data/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 /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
- --net host:使用默认宿主机的ip和端口
- --cluster-enabled:开启redis集群
- --appendonly:开启持久化
2.进入任意一台容器实例来构建集群关系,以第一台为例
docker exec -it redis-node-1 /bin/bash
然后执行
redis-cli --cluster create 192.168.101.21:6381 192.168.101.21:6382 192.168.101.21:6383 192.168.101.21:6384 192.168.101.21:6385 192.168.101.21:6386 --cluster-replicas 1
ip为自己的ip地址,在下方选择yes既可
3.进入6381的redis查看集群
redis-cli -p 6381
cluster nodes
然后我们进入6381随便存入一些key,发现有些无法存入
这是由于哈希槽对集群环境进行了分段,一共有0-16383也就是16384个槽位
从上的截图可以看到每个主机的槽位不同,而失败的k1由内部哈希算法得出的槽位已经超过所以添加失败。
因此需要改用集群方式连接,先退出exit,然后
redis-cli -p 6381 -c
清空里面的数据
添加k1 v1
可以看到,它自动跳转到6383
不同的key有不同的槽位范围,他可以自动帮我们跳转过去
4.验证6381挂了之后从机是否会自动顶替上来
关闭6381
进入6382
查看集群状态可以发现6381已经fail,而原属6381的从机6385已经上位
可以看到死了一台根本无所谓,数据依然存在
重启发现,6381已经变为6385的slave
5.扩容
新建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
进入6387,然后将6387master节点加入集群,记得将6381换回master,把他重启后挂掉6385一会在启动6385就回来了
redis-cli --cluster add-node 192.168.101.21:6387 192.168.101.21:6381
查看发现已经加入,但还没有分配槽位
重新分配槽位
redis-cli --cluster reshard 自己的ip:6381
然后查看可以看到由于重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387
接下来将6388挂到6387下面成为从机
redis-cli --cluster add-node 自己ip:6388 自己ip:6387 --cluster-slave --cluster-master-id 6387的编号
查看发现,已成功扩容
6.缩容
恢复到3主3从的状态
先获取6388的id
redis-cli --cluster check 192.168.101.21:6387
删除6388从机节点
redis-cli --cluster del-node 192.168.101.21:6388 a69b2622f7d85a83857c698ae77c3b05f23ab2c0
检查发现已经剩下7台机器
将6387的槽位分给6381
redis-cli --cluster reshard 192.168.101.21:6381
由6381接收6387的4096个槽位
查看发现6387的槽位已经为0,全部由6381接手
删除6387节点
redis-cli --cluster del-node ip:端口 6387节点ID
检查发现已经恢复3主3从