以6台机器构成集群关系为例:
3主3从redis集群配置
创建容器
docker run -d --name=redis-node-1 --net host --privileged=true -v /data/server/docker_redis_share/redis-node-1/data:/data redis:6.2.1 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name=redis-node-2 --net host --privileged=true -v /data/server/docker_redis_share/redis-node-2/data:/data redis:6.2.1 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name=redis-node-3 --net host --privileged=true -v /data/server/docker_redis_share/redis-node-3/data:/data redis:6.2.1 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name=redis-node-4 --net host --privileged=true -v /data/server/docker_redis_share/redis-node-4/data:/data redis:6.2.1 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name=redis-node-5 --net host --privileged=true -v /data/server/docker_redis_share/redis-node-5/data:/data redis:6.2.1 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name=redis-node-6 --net host --privileged=true -v /data/server/docker_redis_share/redis-node-6/data:/data redis:6.2.1 --cluster-enabled yes --appendonly yes --port 6386
解释:
--name 容器名
--net host 使用宿主机的ip和端口
--privileged=true 获取宿主机的root权限
-v /data/server/docker_redis_share/redis-node-1/data:/data 容器卷,宿主机地址:容器地址
redis:6.2.1 redis镜像和版本号
--cluster-enabled yes 开启集群
--appendonly yes 开启持久化
--port 6386 端口号
构建集群关系
任意选择一个容器执行
[root@base server]# docker exec -it redis-node-1 /bin/bash
root@base:/data# redis-cli --cluster create 192.168.0.130:6381 192.168.0.130:6382 192.168.0.130:6383 192.168.0.130:6384 192.168.0.130:6385 192.168.0.130:6386 --cluster-replicas 1
解释:
192.168.0.130 宿主机ip地址
--cluster-replicas 1 表示为每个master创建一个slave节点
执行结果:
查看集群关系
以6381节点为例查看集群关系
redis-cli -p 6381
cluster info 查看集群信息
cluster nodes 查看集群构建状态,此处也能看到主从对应关系
主从容错切换迁移
数据读写存储
哈希槽下槽位被分成3段,3段代表3个主机,key进入后存在哪以及怎么实现在集群里数据传递后台共享
在使用单机版命令时出现(error) MOVED 12706 192.168.0.130:6383 错误 是因为高出了当前容器的槽位范围
此时需要 防止路由失效加参数-c
不同的key 有不同的槽位对应范围,所以会出现重定向到其他redis服务
查看集群信息
redis-cli --cluster check 192.168.0.130:6381
容错切换迁移
当前集群情况
关闭主机6381,进入6382查看集群情况
同样此时仍然可以查到刚刚存入的key
重新启动6381,查看集群情况
可以看到的是6381新启动后,6384仍是master,要还原成之前的3主3从需要在启动6381之后关闭6384过几分钟再启动6384
主从扩容
高并发情况下3主3从不能满足当前数据需要扩容到4主4从时,6387(master)挂在6388(slave)下,此时哈希槽的槽位如何分配
新建2个节点
docker run -d --name=redis-node-7 --net host --privileged=true -v /data/server/docker_redis_share/redis-node-7/data:/data redis:6.2.1 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name=redis-node-8 --net host --privileged=true -v /data/server/docker_redis_share/redis-node-8/data:/data redis:6.2.1 --cluster-enabled yes --appendonly yes --port 6388
进入6387容器
docker exec -it redis-node-7 /bin/bash
将新增的6387节点(空槽号)作为master节点加入原集群
redis-cli --cluster add-node 192.168.0.130:6387 192.168.0.130:6381
查看集群情况
redis-cli --cluster check 192.168.0.130:6387
重新分配槽号
命令 redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.0.130:6387
1. 新的节点加入后需要重新洗牌,4个节点AA分配 (16384/4=4096)
2. 要分配给新加入的机器(需要输入的是节点id编号)
再次查看集群情况
为什么6387是3个新的区间,以前的还是连续:重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387
为主节点6387分配从节点6388
命令: redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点id编号
redis-cli --cluster add-node 192.168.0.130:6388 192.168.0.130:6387 --cluster-slave --cluster-master-id ded65a8e2342b01efc6a8874946fef2412d2f55b
再次查看集群情况
redis-cli --cluster check 192.168.0.130:6381
最后集群情况
主从缩容
目的:6387(master)和6388(slave)下线
检测集群情况,得到从机6388 节点id编号
删除6388从节点
命令: redis-cli --cluster del-node ip:从机端口 从机节点id
redis-cli --cluster del-node 192.168.0.130:6388 f4a2ede9a29eb7816bb065999a31427cae8f327c
命令执行结果
将6387的槽号清空,重新分配,将清出来的槽号都分配给6381
redis-cli --cluster reshard 192.168.0.130:6381
检测集群情况
redis-cli --cluster check 192.168.0.130:6381
(此时是将4096个槽位都指给了6381,它变成了8192个槽位,相当于全部给了6381)
删除6387
redis-cli --cluster del-node 192.168.0.130:6387 ded65a8e2342b01efc6a8874946fef2412d2f55b
检测集群情况
redis-cli --cluster check 192.168.0.130:6381