1. 背景
redis 集群的搭建不仅仅是运维同学的必备技能,也是开发同学学习redis的必经历程,在以后的学习生涯中,学习每一门技术栈,搭建高可用的集群是必不可少的
2. 演练
2.1 集群搭建
docker create --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6381
docker create --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6382
docker create --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6383
docker create --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6384
docker create --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6385
docker create --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6386
docker create //创建容器的命令
--name redis-node-1 //容器的名字 例如 redis-node-1
--net host //docker网络,使用宿主机的IP和端口
--privileged=true //docker容器 获取宿主机root权限
-v /data/redis/share/redis-node-4:/data //容器的data目录 映射到 宿主机/data/redis/share/redis-node-1
redis:5.0.7 //redis镜像名称和版本号
--cluster-enabled yes //redis.conf的配置:开启redis集群
--appendonly yes //redis.conf的配置:开启数据持久化
--port 6381 //redis.conf的配置:redis端口号
docker start redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5 redis-node-6
docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 10.0.4.5:6381 10.0.4.5:6382 10.0.4.5:6383 10.0.4.5:6384 10.0.4.5:6385 10.0.4.5:6386 --cluster-replicas 1
参数create表示创建一个新的集群,--replicas 1 表示为每个master创建一个slave。
使用cluster info命令查看集群状态。
redis-cli -h 192.168.1.138 -p 6381 -c
cluster info
cluster info结果展示:
使用cluster nodes命令查看节点状态。cluster nodes
搭建好的集群
2.2 主从切换演练
操作:停掉 6381, 6386 会升级为主集群
docker exec -it 467cbac73df7 /bin/bash
redis-cli -h 10.0.4.5 -p 6386 -c
cluster nodes
2.3 hash 槽扩容演练
准备两个节点并启动
docker create --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6387
docker create --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6388
docker start redis-node-7 redis-node-8
节点加入集群并且重新分配槽
docker exec -it redis-node-7 /bin/bash
redis-cli --cluster add-node 10.0.4.5:6387 10.0.4.5:6381
第一个节点192.168.1.138:6387 代表新增的
第二个节点192.168.1.138:6381 代表原集群里面的任意节点
redis-cli --cluster reshard 10.0.4.5:6381
新的节点加入集群,就需要重新分配槽,用redis-cli --cluster reshard ip:port 命令来重新分配槽;
ip:port指集群中任意一个节点就行
为master分配slave的命令
redis-cli --cluster add-node 10.0.4.5:6388 10.0.4.5:6387 --cluster-slave --cluster-master-id 7bc0d31d32206d0baea8f5a79c9c32fea34fc09a
新加入的slave : slave对应的master: 表示加入的是slave节点: 表示slave对应的master的node ID
add-node: 后面的分别跟着新加入的slave和slave对应的master
cluster-slave:表示加入的是slave节点
--cluster-master-id:表示slave对应的master的node ID
2.4 hash 槽缩容演练
查看一下,集群情况: redis-cli --cluster check 10.0.4.5:6387
步骤1: 把6387master对应的slave6388删除
redis-cli --cluster del-node 10.0.4.5:6388 aef44ab8b032bf371dde7deb37908d40ed232590
del-node后面跟着slave节点的 ip:port 和node ID
步骤2: redis-cli --cluster reshard 10.0.4.5:6381
步骤3:master的slave已清除,可直接删除
redis-cli --cluster del-node 10.0.4.5:6387 7bc0d31d32206d0baea8f5a79c9c32fea34fc09a
del-node后面跟着slave节点的 ip:port 和node ID