Docker-Redis3主3从配置

  • --clusten-enabled yes  是否开启集群
  • --appendonly no ##默认是不开启aof模式的, 默认是使用rdb方式持久化,在大部分所有的情况下,rdb完全够用
docker run -d --name redis-node-1 --net host --privileged=true -v /soft/redis-cluster/redis-node-1:/data redis --cluster-enabled yes --appendonly yes --port 6381

docker run -d --name redis-node-2 --net host --privileged=true -v /soft/redis-cluster/redis-node-2:/data redis --cluster-enabled yes --appendonly yes --port 6382

docker run -d --name redis-node-3 --net host --privileged=true -v /soft/redis-cluster/redis-node-3:/data redis --cluster-enabled yes --appendonly yes --port 6383

docker run -d --name redis-node-4 --net host --privileged=true -v /soft/redis-cluster/redis-node-4:/data redis --cluster-enabled yes --appendonly yes --port 6384

docker run -d --name redis-node-5 --net host --privileged=true -v /soft/redis-cluster/redis-node-5:/data redis --cluster-enabled yes --appendonly yes --port 6385

docker run -d --name redis-node-6 --net host --privileged=true -v /soft/redis-cluster/redis-node-6:/data redis --cluster-enabled yes --appendonly yes --port 6386

以6381作为切入点进入其中:执行以下命令:注意真实IP地址

  • --cluster create 构建集群
  • --cluster-replicas 1 表示为每个master创建一个slave节点
redis-cli --cluster create 192.168.19.133:6381 192.168.19.133:6382 192.168.19.133:6383 192.168.19.133:6384 192.168.19.133:6385 192.168.19.133:6386 --cluster-replicas 1

进入redis

docker exec -it redis-node-1 /bin/bash

进入单机连接

集群这样子会出问题

redis-cli -p 6381

cluster info

cluster nodes  查看所有节点信息

集群方式链接redis

redis-cli -c -p 6381

应为redis用的是哈希槽算法

127.0.0.1:6381>set k1 v1    ()不同的key会跳转到不同的槽

进入其中一台容器执行

redis-cli --cluster check 192.168.19.133:6381

主从容错切换迁移

场景:主机宕机 从机切换

1.停掉redis master1

docker stop redis-node-1

2.进入redis查看

docker exec -it redis-node-2 /bin/bash

redis-cli -c -p 6382

cluster nodes

正常来说可以看到master1 宕机了  fail

他的从机会切换成master

继续:恢复master1

docker start redis-noded-1

再次查看集群状态

cluster nodes

正常来说从机已经篡位变成主机

主从扩容

1.新建6387、6388两个节点+新建后启动+查看是否8节点

docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis --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 --cluster-enabled yes --appendonly yes --port 6388

docker ps

2.进入6387容器实例内部

docker exec -it redis-node-7 /bin/bash

3.将新增的6387节点(空槽号)作为master节点加入原集群

|将新增的主从节点加入集群

|redis-cli --cluster add-node 实际ip地址:6387 实际ip地址:6381

|6387就是将要作为master新增节点

|6381就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

redis-cli --cluster add-node 192.168.19.133:6387 192.168.19.133:6381

4.检查集群情况第1次

root@zzyy: /data# redis-cli --cluster check 192.168.19.133:6381   现在是没有槽位的

5.重新分派槽号

命令:redis-cli --cluster reshard lP地址:端口号

redis-cli --cluster reshard 192.168.19.133:6381

4096怎么来的

16394个槽分成4分  现在是4主4从

16384 / 4(master台数) = 4096

all

6.检查集群情况第2次1

root@zzyy: /data# redis-cli --cluster check 192.168.19.133:6381

为什么6387是3个新的区间,以前的还是连续?

重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387

7.为主节点6387分配从节点6388

redis-cli --cluster add-node 192.168.19.133:6388 192.168.19.133:6387 --cluster-slave --cluster-master-id

473ee1852959c0957f7d58bd794963a5011c3ff9

e4781f644d4a4e4d4b4d107157b9ba8144631451-------这个是6387的编号,按照自己实际情况

8.检查集群情况第3次

root@zzyy: /data# redis-cli --cluster check 192.168.19.133:6381

主从缩容

  • 需求顺序

1先清除从节点6388

2清出来的槽号重新分配

3再删除6387

4恢复成3主3从

  • 案例演示

目的:6387和6388下线

检查集群情况 获得6388的节点ID

root@zzyy: /data# redis-cli --cluster check 192.168.19.133:6381

将6388删除

从集群中将4号从节点6388删除

命令: redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.19.133:6388 5d14907457e57b802287d1797a874ed7a1a284a8

将6387的槽号清空,重新分配,本例将清出来的槽号都给6381

root@zzyy: /data# redis-cli --cluster reshard 192.168.19.133:6381

检查集群情况第二次

root@zzyy: /data# redis-cli --cluster check 192.168.19.133:6381

将6387删除

命令: redis-cli --cluster del-node ip:端口6387节点ID

redis-cli --cluster del-node 192.168.19.133:6387 e4781f644d4a4e4d4b4d107157b9ba8144631451I

-检查集群情况第三次

docker start redis-node-1
docker start redis-node-2
docker start redis-node-3
docker start redis-node-4
docker start redis-node-5
docker start redis-node-6