1、3主3从redis集群配置

1.1、新建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 run:创建并运行docker实例

-d:后台守护线程

--name:容器实例名称

--net host:使用宿主机的ip和端口,默认

--privileged=true:获取宿主机root权限

-v:挂载容器数据卷

--cluster-enabled yes:开启redis集群

--appendonly yes:开启redis持久化

--port:redis端口

1.2、进入容器redis-node-1并为6台机器创建集群关系

redis-cli --cluster create 宿主机IP:6381 宿主机IP:6382 宿主机IP:6383 宿主机IP:6384 宿主机IP:6385 宿主机IP:6386 --cluster-replicas 1

--cluster-replicas 1 表示为每个master创建一个slave节点

可以看到三台master分别对应槽位0-5460,5461-10922,10923-16383

yes 等待集群加入

分配完成

进入节点1这台机器

redis-cli -p 8631

查看集群信息

cluster info

可以看到一共16384个槽位,已经分配了全部槽位,一共6个节点

cluster nodes

查看节点信息

当前所在节点myself,master,6381、6382、6383分别是三个主节点,三个从节点6385、6384、6386,从节点后面分别跟着主节点的节点id表示此从节点挂在此主节点上,实现一主一从

2、主从容错迁移切换

2.1、数据读写存储

目前我们已经搭建6个节点实现3主3从,如何是实现集群所有节点直接数据共存呢?

登录节点1服务器

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

redis-cli -p 6381

keys * 没有任何数据

插入数据发现报错,这是为什么?

原因:因为redis默认一共是16384个槽位,三台主节点分别评分这些槽位,可以看见报错提示槽位是12706,而节点1实际分到的槽位是0-5460,所以说他超过了这个范围就报错了,再试几次插入数据,发现有的可以插入有的却不行,说明只要不超过这个范围就是正常的

redis-cli -p 6381 连接属于单机连接,我们现在的环境是集群环境,所以集群命令去连接 redis-cli -p 6381 -c

可以看到再次插入数据时如果超出当前节点的槽位就会转发到对应节点上,6381转发到6383上

2.2、查看集群信息(新命令)

redis-cli --cluster check 192.168.0.2:6381

可以看到我们有三个主节点,1个key在主机节点3上(之前set k1 v1,对应的hash槽位是12706,正好是主节点3所在的范围)

Performing Cluster Check对应集群节点信息

        M                       S

节点1:6381--节点5:6385

节点2:6382--节点6:6386

节点3:6383--节点4:6384

2.3、容错切换迁移

假设某个主节点挂了会怎么?挂掉主节点突然又恢复会怎样?

docker ps 查看所有节点都是正常活跃状态,这时我们停掉节点1,再次查看发现节点1已经处于退出状态

登录节点2

使用集群模式登录节点2

查看节点信息看到有4台master有一台挂掉了(fail),反而6385(接点5)成为了新的master主节点,所以一旦某个主节点挂掉,对应的从节点就会上位成主节点

恢复主节点1

6个节点正常

再次查看节点信息

刚才死掉的节点1(6381)已经成为从节点挂在主节点6385下

如果想恢复以前的对应关系

可以重复上面的操作,停掉6385,让6381重新上位,在开启6385让其挂在6381下

3、主从扩缩容

3.1、扩容

3.1.1、新建两台主机

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

新建两台节点redis-node-7、redis-node-8

进入节点7

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

3.1.2、将新增的6387作为master节点加入集群

redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381

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

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

3.1.3、检查集群情况

redis-cli --cluster check 192.168.0.2:6381

已经有4台master,但是6387这台节点并没有槽位

3.1.4、重新分配槽号

redis-cli --cluster reshard 192.168.0.2:6381

16384个槽位怎么分?现在有4台master平均分配 16384/4=4096

分配给节点7(6387)填写节点id

all全部分配 yes

3.1.5、检查集群情况

发现每台主节点都是4096个槽位,并且6387节点的槽位是有三段槽位组合而成,说明6387节点的槽位是由前三个主节点一人分一点给他的

3.1.6、为主节点6387分配从节点6388

redis-cli --cluster add-node 192.168.0.2:新slave端口 192.168.0.2:新master端口 --cluster-slave --cluster-master-id 新主机节点ID 

3.1.7、检查集群情况

redis-cli --cluster check 192.168.0.2:6382

4主4从,并且6388已经挂在6387下

3.2、缩容

目的:关闭6387、6388

3.2.1、查看集群情况

redis-cli --cluster check 192.168.0.2:6382 (6382只是操作集群的切入点,只要是master节点都可以操作集群)

3.2.2、删掉6388

redis-cli --cluster del-node 192.168.0.2:端口 从机6388 节点ID

3.2.3、清空6387的槽号并重新分配

redis-cli --cluster reshard 192.168.0.2:6381 (6381只是操作集群的切入点,只要是master节点都可以操作集群)

receiving 接收,Source node源节点(发送),意思是将6387的4096个槽位发给6383,done 回车 yes 回车

3.2.4、检查集群

redis-cli --cluster check 192.168.0.2:6381

6387槽位已经空了,6383槽位增加了4096

3.2.5、删除6387

redis-cli --cluster del-node 192.168.0.2:6387 节点ID

删除成功3主3从

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐