一、集群算法
二、主从集群配置
首选安装 redis:docker 第7.3章 常规安装-安装redis
新建 6 个
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
docker ps
命令分步解释:
docker run:创建并运行docker容器实例
--name redis-node-6:容器名字
--net host:使用宿主机的IP和端口,默认
--privileged=true:获取宿主机 root 用户权限
-v /data/redis/share/redis-node-6:/data:容器卷,宿主机地址:docker内部地址
redis:6.0.8:redis镜像和版本号
--cluster-enabled yes:开启 redis 集群
--appendonly yes:开启持久化
--port 6386:redis端口号
进入容器 redis-node-1并为 6 台机器构建集群关系
进入容器
docker exec -it redis-node-1 /bin/bash
构建主从关系
redis-cli --cluster create ip:6381 ip:6382 ip:6383 ip:6384 ip:6385 ip:6386 --cluster-replicas 1
yes
--cluster-replicas 1 表示为每个 master 创建一个 slave 节点
一切 OK 的话,3 主 3 从搞定
链接进入 6381 作为切入点,查看集群状态
redis-cli -p 6381
cluster info
cluster nodes
exit
三、主从容错切换迁移案例
对 6381 新增两个 key,防止路由失效加参数 -c 并新增两个 key
redis-cli -p 6381
set k1 v1
exit
redis-cli -p 6381 -c
set k1 v-cluser1
set k2 v-cluser2
exit
redis-cli -p 6381 -c
get k1
get k2
exit
redis-cli -p 6382 -c
get k1
get k2
exit
查看集群信息
redis-cli --cluster check ip:6381
exit
容错切换迁移:主 6381 和从机切换,先停止主机 6381,6381主机停了,对应的真实从机上位。
6381 作为 1 号主机分配的从机以实际情况为准,具体是几号机器就是几号
docker stop redis-node-1
docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c
cluster nodes
exit
exit
6381 宕机了,6386上位成为了新的 master。
备注:本次测试 6381 为主下面挂从 6386。每次案例下面挂的从机以实际情况为准,具体是几号机器就是几号。
恢复 6381 的 master,6386 的 slave。
备注:主从机器分配情况以实际情况为准。
docker start redis-node-1
docker stop redis-node-6
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c
cluster nodes
exit
exit
docker start redis-node-6
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c
cluster nodes
exit
exit
四、主从扩容案例
新建 6387、6388 两个节点+新建后启动+查看是否 8 节点
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
docker ps
进入 6387 容器实例内部,将新增的 6387 节点(空槽号)作为 master 节点加入原集群
docker exec -it redis-node-7 /bin/bash
redis-cli --cluster add-node IP:6387 IP:6381
第一次检查集群情况
redis-cli --cluster check IP:6381
暂时没有槽号,重新分派槽号
redis-cli --cluster reshard IP:6381
4096
9c12cf267ae08ef371b54bd077dde89093d7b8c1-------这个是6387的编号,按照自己实际情况
all
yes
备注:16384/master台数=16384/4=4096
第二次检查集群情况
redis-cli --cluster check IP:6381
槽号分派说明:为什么 6387 是 3 个新的区间,以前的还是连续?重新分配成本太高,所以前 3 家各自匀出来一部分,从 6381/6382/6383 三个旧节点分别匀出 1364 个坑位给新节点 6387。
为主节点6387分配从节点6388
redis-cli --cluster add-node IP:6388 IP:6387 --cluster-slave --cluster-master-id 6387节点ID
第三次检查集群情况
redis-cli --cluster check IP:6381
这里得到的 6388 的节点ID:3ce43009eb53a9ce30499f908598a99452b97b74
五、主从缩容案例
目的:6387 和 6388 下线
将 6388 删除 从集群中将 4 号从节点 6388 删除
redis-cli --cluster del-node IP:6388 6388节点ID
第一次检查集群情况
redis-cli --cluster check IP:6381
检查一下发现,6388 被删除了,只剩下 7 台机器了
将 6387 的槽号清空,重新分配,本例将清出来的槽号都给 6381
redis-cli --cluster reshard IP:6381
4096
0b9f807f3adb20b993fdcd04781eb5fcdbbc24fa-------这个是6381的编号,按照自己实际情况
9c12cf267ae08ef371b54bd077dde89093d7b8c1-------这个是6387的编号,按照自己实际情况
done
yes
第二次检查集群情况
redis-cli --cluster check IP:6381
4096 个槽位都指给 6381,它变成了 8192 个槽位,相当于全部都给 6381 了
将 6387 删除
redis-cli --cluster del-node IP:6387 6387节点ID
第三次检查集群情况
redis-cli --cluster check IP:6381
发现 6387 已经删除成功