redis集群:
1.hash取余算法
2.一致性hash算法
3.哈希槽算法
以下使用哈希槽算法
Redis 3主3从搭建
新建6个Redis Docker容器实例
docker run -d --name redis-node-1 --net host --privileged=true -v /usr/local/develop/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 /usr/local/develop/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 /usr/local/develop/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 /usr/local/develop/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 /usr/local/develop/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 /usr/local/develop/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
--net host会使用宿主机的网络 所以端口区分
现在6台Redis不分主从 下面构建6台Redis的主从机制
docker exec -it redis-node-1 /bin/bash
创建集群 并指定(说明)是一主一从 我这里是在一台ECS服务器演示,因此可以使用127.0.0.1
redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1
redis-cli -p 6381
查看集群信息
cluster info
查看本集群节点
cluster nodes
也就是说 1和5 2和6 3和4 对应关系要从上图去看 这个看实际情况(不是固定的)
现在如果忘redis 1存数据 会出现下面这样情况 原因是对Key槽位计算
现在是集群环境 不能再 redis-cli -p 6381 进入某一个单一Redis服务器进行如上设置
可以进入某一个Redis服务器 通过集群环境
例如 进入某一个Redis服务器
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c -c代表集群环境
现在就都可以存了
查看集群信息状态
redis-cli --cluster check 127.0.0.1:6381
演示主从容错切换迁移
例如 1号宕机 5号从机上位
docker stop redis-node-1
进入redis-node-2查看
docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c
cluster nodes
比如说 1号机宕机后 现在修复了 看看情况
docker start redis-node-1
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c
cluster nodes
如果你想把1号机恢复为主 那么停掉5号机 自己测试如果直接重启无效 再重启就好了
主从扩容演示
比如扛不住了 从3主3从 扩至4主4从 就是加一组
主要涉及槽位分配问题
注意下图对应关系 以自己为主 不是固定的 我这里是1和5 2和6 3和4
新增6387和6388节点
docker run -d --name redis-node-7 --net host --privileged=true -v /usr/local/develop/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 /usr/local/develop/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
现在上面两个节点和原集群没在一起,进入6387节点 将节点做为master节点加入集群
加入后是空槽位的需要重新分配槽位
docker exec -it redis-node-7 /bin/bash
将新增的6387做为master节点加入集群
redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6381
redis-cli --cluster check 127.0.0.1:6381
可以看到没有槽位
重新分配槽位
redis-cli --cluster reshard 127.0.0.1:6381
然后会重新分配槽位
再次检查集群情况
redis-cli --cluster check 127.0.0.1:6381
可以看出是原先槽位各自分配了点槽位给扩展机
将6388做为从机挂到6377上
redis-cli --cluster add-node 127.0.0.1:6388 127.0.0.1:6387 --cluster-slave --cluster-master-id 66d270319f66339c4a9040f842dba6fa561e8909
注意最后是6377的编号 看自己实际情况
再次检查集群情况
redis-cli --cluster check 127.0.0.1:6381 4主4从配置成功
主从缩容演示
同样 缩容 槽位也要重新分配
步骤:先清除从节点6388,清空6387槽位重新分配,删除6387,恢复3主3从
检查集群情况,获取6388的节点id
88ca21d614ee3faf6bc6cd544356a38a15b4746c
删除6388节点
redis-cli --cluster del-node 127.0.0.1:6388 88ca21d614ee3faf6bc6cd544356a38a15b4746c
查看
redis-cli --cluster check 127.0.0.1:6383 因为在一个集群中 6381 6382 6383 随便 如果在不同ECS服务器 注意IP
剩下7台
清空6387槽位 重新分配 本例将清出来的槽位都给6381
redis-cli --cluster reshard 127.0.0.1:6381
检查集群情况
redis-cli --cluster check 127.0.0.1:6381
可以看到6377已经没有槽位了 并且把槽位都给了6381
删除6387
redis-cli --cluster del-node 127.0.0.1:6387 66d270319f66339c4a9040f842dba6fa561e8909
检查集群
redis-cli --cluster check 127.0.0.1:6381