Docker 学习笔记 – 进阶二 安装redis集群 3主3从

  • Post author:
  • Post category:其他

Docker 学习笔记 – 进阶二 安装redis集群

笔记记录尚硅谷周阳老师的 docker 教程
链接地址: https://www.bilibili.com/video/BV1gr4y1U7CY?p=1

2. cluster(集群)模式-docker 版

本教程集群方案:使用哈希槽分区进行亿级数据存储

2.1 可行方案

问题: 1~2亿条数据需要缓存,请问如何设计这个存储案例
回答: 单机单台100%不可能,肯定是分布式存储,用redis如何落地?
方案: 一般业界有3种解决方案

2.1.1 哈希取余分区

在这里插入图片描述
2亿条记录就是2亿个k,v,单机不行必须要分布式多机,
假设有3台机器构成一个集群,用户每次读写操作都是根据公式:
hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。

2.1.1.1 优点

简单粗暴,直接有效,只需要预估好数据规划好节点,
例如3台、8台、10台,就能保证一段时间的数据支撑。

使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求
(并维护这些请求的信息),起到负载均衡+分而治之的作用。

2.1.1.2 缺点

原来规划好的节点,进行扩容或者缩容就比较麻烦了,不管扩缩,每次数据变动导致节点有变动,
映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,
原来的取模公式就会发生变化:Hash(key)/3会变成Hash(key) /?。
此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。

某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。

2.1.2 一致性哈希算法分区

一致性哈希算法详解
参考资料: https://blog.csdn.net/qq_40378034/article/details/117870061

2.1.2.1 一致性Hash算法背景

一致性哈希算法在1997年由麻省理工学院中提出的,设计目标是为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不OK了。

1.1.2.2 能做什么

提出一致性Hash解决方案。目的是当服务器个数发生变动时,
尽量减少影响客户端到服务器的映射关系

2.1.2.3 步骤一 算法构建一致性哈希环

一致性哈希环:

    一致性哈希算法必然有个hash函数并按照算法产生hash值,这个算法的所有可能哈希值
会构成一个全量集,这个集合可以成为一个hash空间  [0,2^32-1] ,
这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0 = 2^32),
这样让它逻辑上形成了一个环形空间。
    它也是按照使用取模的方法,前面笔记介绍的节点取模法是对节点(服务器)的数量进行取模。
而一致性Hash算法是对2^32取模,简单来说,一致性Hash算法将整个哈希值空间组织成一个
虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),
整个哈希环如下图:整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个
点代表1,以此类推,2、3、4、……直到2^32-1,也就是说0点左侧的第一个点代表2^32-1, 
0和2^32-1在零点中方向重合,我们把这个由2^32个点组成的圆环称为Hash环。

在这里插入图片描述

2.1.2.4 步骤二 服务器IP节点映射

节点映射:

将集群中各个IP节点映射到环上的某一个位置。将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置。假如4个节点NodeA、B、C、D,经过IP地址的哈希函数计算(hash(ip)),使用IP地址哈希后在环空间的位置如下:
在这里插入图片描述

2.1.2.5 步骤三 key落到服务器的落键规则

当我们需要存储一个kv键值对时,首先计算key的hash值,hash(key),将这个key使用相同的函数Hash计算出哈希值并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。

如我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上。
在这里插入图片描述

2.1.2.6 优点一: 一致性哈希算法的容错性

假设Node C宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。简单说,就是C挂了,受到影响的只是B、C之间的数据,并且这些数据会转移到D进行存储。
在这里插入图片描述

2.1.2.7 优点二:一致性哈希算法的扩展性

数据量增加了,需要增加一台节点NodeX,X的位置在A和B之间,那收到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,

不会导致hash取余全部数据重新洗牌。
在这里插入图片描述

2.1.2.8 缺点一:一致性哈希算法的倾斜问题

Hash环的数据倾斜问题
一致性Hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,

例如系统中只有两台服务器:
在这里插入图片描述

2.1.2.9 小总结

为了在节点数目发生改变时尽可能少的迁移数据
将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临近的存储节点存放。
而当有节点加入或退出时仅影响该节点在Hash环上顺时针相邻的后续节点。

优点:
加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。

缺点 :
数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。

2.1.3 哈希槽分区算法

2.1.3.1 为什么出现

为了解决一致性哈希算法分区的 数据倾斜 问题
哈希槽实质就是一个数组,数组[0,2^14 -1]形成hash slot空间。

2.1.3.2 能干什么

解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。
在这里插入图片描述
槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。
哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。

2.1.3.3 多少个hash槽

一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

2.1.3.4 哈希槽计算

Redis 集群中内置了 16384 个哈希槽(redis 默认),redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 CRC16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上

在这里插入图片描述
在这里插入图片描述

2.2 三主三从 redis 集群配置

2.2.0 开启宿主机(128)防火墙端口

注意:这里必须开启,否则外面连接不进来

[root@vm001 redis]# firewall-cmd --zone=public --add-port=6381-6390/tcp --permanent
success
[root@vm001 redis]# firewall-cmd --reload
success

2.2.1 配置案例设计

master 6381-6383
slave 6384-6386
master1() – slave1()
master2() – slave2()
master3() – slave3()
master-slave实例具体的映射关系,会由redis自己匹配

2.2.2 新建6个docker容器实例

# 这里redis 使用的是latest版本,所以最后没有带版本号
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis --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 --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 --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 --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 --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 --cluster-enabled yes --appendonly yes --port 6386

在这里插入图片描述

[root@vm001 admin]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS             PORTS                                                                                         NAMES
1f8035e5c36b   redis          "docker-entrypoint.s…"   5 seconds ago   Up 4 seconds                                                                                                     redis-node-6
a7254d1a38fc   redis          "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds                                                                                                     redis-node-5
1c884b08b592   redis          "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds                                                                                                     redis-node-4
713269dad74c   redis          "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds                                                                                                     redis-node-3
99d5a40de91f   redis          "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds                                                                                                     redis-node-2
49089ac6960d   redis          "docker-entrypoint.s…"   8 seconds ago   Up 6 seconds                                                                                                     redis-node-1

2.2.3 命令分步解析

docker run							-------- 创建并运行docker容器实例
--name redis-node-4					-------- 容器名字
--net host							-------- 使用宿主机的IP和端口,默认
--privileged=true					-------- 获取宿主机root用户权限
-v /data/redis/share/redis-node-4:/data			-------- 容器卷,宿主机地址:docker内部地址
redis											-------- redis镜像和版本号,这里redis是latest版本,所以不显示
--cluster-enabled yes							-------- 开启redis集群
 --appendonly yes 								-------- 开启持久化
 --port 6384									-------- redis端口号

2.2.4 进入容器redis-node-1并为6台机器构建集群关系

# 进入容器
docker exec -it redis-node-1 /bin/bash

注意,进入docker容器后才能执行一下命令,且注意自己的真实IP地址
通过 ifconfig 查看自己的机器的ip地址

# 构建集群关系
redis-cli --cluster create 192.168.226.128:6381 192.168.226.128:6382 192.168.226.128:6383 192.168.226.128:6384 192.168.226.128:6385 192.168.226.128:6386 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
## 槽位分配
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.226.128:6385 to 192.168.226.128:6381
Adding replica 192.168.226.128:6386 to 192.168.226.128:6382
Adding replica 192.168.226.128:6384 to 192.168.226.128:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
### M: 指 master(主), S: 指 slave(从)   三主三从
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[0-5460] (5461 slots) master
M: aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382
   slots:[5461-10922] (5462 slots) master
M: 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383
   slots:[10923-16383] (5461 slots) master
S: 8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384
   replicates aa89bba715780e6bf30ecbb734580b9da68e394f
S: e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385
   replicates 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2
S: 71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386
   replicates 94714f899698acb6e3d3584474c8bbbc7677e882
## 尝试自动分配槽位并请求确认,此时需要打 'yes'
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.226.128:6381)
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385
   slots: (0 slots) slave
   replicates 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2
S: 8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384
   slots: (0 slots) slave
   replicates aa89bba715780e6bf30ecbb734580b9da68e394f
S: 71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386
   slots: (0 slots) slave
   replicates 94714f899698acb6e3d3584474c8bbbc7677e882
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
## 告诉用户所有槽位都得到覆盖
[OK] All 16384 slots covered.

一切OK的话,3主3从搞定

2.2.5 以6381作为切入点,查看集群状态

链接进入6381作为切入点,查看节点状态

root@vm001:/data# redis-cli -p 6381
## cluster info
127.0.0.1:6381> cluster info
cluster_state:ok
cluster_slots_assigned:16384		# 节点分配
cluster_slots_ok:16384				# 节点个数
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6				# 集群内部总实例个数
cluster_size:3
cluster_current_epoch:6				# 集群内如当前运行实例个数
cluster_my_epoch:1
cluster_stats_messages_ping_sent:469
cluster_stats_messages_pong_sent:448
cluster_stats_messages_sent:917
cluster_stats_messages_ping_received:443
cluster_stats_messages_pong_received:469
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:917
root@vm001:/data# redis-cli -p 6381
## cluster nodes
127.0.0.1:6381> cluster nodes
# master
56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383@16383 master - 0 1651595835135 3 connected 10923-16383
# master
aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382@16382 master - 0 1651595837279 2 connected 5461-10922
# slave, 挂载在6383 master机上---根据id可得出
e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385@16385 slave 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 0 1651595832000 3 connected
# slave,挂载在6382 master机上---根据id可得出
8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384@16384 slave aa89bba715780e6bf30ecbb734580b9da68e394f 0 1651595836216 2 connected
# slave,挂载在6381 master机上---根据id可得出
71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386@16386 slave 94714f899698acb6e3d3584474c8bbbc7677e882 0 1651595834063 1 connected
# master, 当前机器
94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381@16381 myself,master - 0 1651595835000 1 connected 0-5460

所以可以得出本次配置的具体映射如下:
master1(6381) – slave1(6386)
master2(6382) – slave2(6384)
master3(6383) – slave3(6385)

2.3 主从容错切换迁移案例

2.3.1 数据的读写储存

  • 1). 启动6机构成的集群并通过exec进入6381, 并新增几个key
[root@vm001 admin]# docker exec -it redis-node-1 /bin/bash
root@vm001:/data# redis-cli -p 6381
127.0.0.1:6381> keys *
(empty array)
127.0.0.1:6381> set k1 v1
(error) MOVED 12706 192.168.226.128:6383
127.0.0.1:6381> set k2 v2
OK
127.0.0.1:6381> set k3 v3
OK
127.0.0.1:6381> set k4 v4
(error) MOVED 8455 192.168.226.128:6382
127.0.0.1:6381> exit

上面出现某些key不能设置的原因:
这是一个使用了哈希槽分区算法的redis集群,但是我们连接的是其中的某一台机器,如果设置的key不在它的槽位范围,那么会报错,无法设置值

  • 2). 为了防止路由失效加参数-c并新增两个key
redis-cli -p 6381 -c			##	-c: cluster
root@vm001:/data# redis-cli -p 6381 -c
127.0.0.1:6381> flushall
OK
127.0.0.1:6381> keys *
(empty array)
## 如果在6381其能力范围之外,则会跳转到集群中另外的机器6383上,以下同理
127.0.0.1:6381> set k1 v1
-> Redirected to slot [12706] located at 192.168.226.128:6383
OK
## 同上理
192.168.226.128:6383> set k2 v2
-> Redirected to slot [449] located at 192.168.226.128:6381
OK
192.168.226.128:6381> set k3 v3
OK
## 同上理
192.168.226.128:6381> set k4 v4
-> Redirected to slot [8455] located at 192.168.226.128:6382
OK
192.168.226.128:6382> 
  • 3). 查看集群信息
    redis-cli –cluster check 192.168.226.128:6381
    通过任何一台机器都可以查询,可以看到:
    —-a. 目前机器有3主3从,以及相应的映射关系
    —-b. 而且集群目前储存了5个key
root@vm001:/data# redis-cli --cluster check 192.168.226.128:6381
192.168.226.128:6381 (94714f89...) -> 2 keys | 5461 slots | 1 slaves.
192.168.226.128:6382 (aa89bba7...) -> 1 keys | 5462 slots | 1 slaves.
192.168.226.128:6383 (56f6c3cc...) -> 2 keys | 5461 slots | 1 slaves.
[OK] 5 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.226.128:6381)
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385
   slots: (0 slots) slave
   replicates 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2
M: aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386
   slots: (0 slots) slave
   replicates 94714f899698acb6e3d3584474c8bbbc7677e882
M: 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384
   slots: (0 slots) slave
   replicates aa89bba715780e6bf30ecbb734580b9da68e394f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

2.3.2 容错(主从)切换迁移

2.3.2.1 主机6381和从机切换

6381主机停了,对应的真实从机上位
6381作为1号主机分配的从机以实际情况为准,具体是几号机器就是几号

############# 停止主机 redis-node-1  ###########
[root@vm001 admin]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS          PORTS                                                                                         NAMES
1f8035e5c36b   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-6
a7254d1a38fc   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-5
1c884b08b592   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-4
713269dad74c   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-3
99d5a40de91f   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-2
49089ac6960d   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-1
[root@vm001 admin]# docker stop redis-node-1
redis-node-1
[root@vm001 admin]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS          PORTS                                                                                         NAMES
1f8035e5c36b   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-6
a7254d1a38fc   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-5
1c884b08b592   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-4
713269dad74c   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-3
99d5a40de91f   redis          "docker-entrypoint.s…"   24 hours ago   Up 31 minutes                                                                                                 redis-node-2


####### 从另外的机器 redis-node-2 登入并查询集群状态  ######
####### 看到 redis-node-1 状态是 disconnected,其从机上位成为新的master #######
[root@vm001 admin]# docker exec -it redis-node-2 /bin/bash
root@vm001:/data# redis-cli -p 6382 -c
127.0.0.1:6382> cluster nodes
56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383@16383 master - 0 1651681548597 3 connected 10923-16383
94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381@16381 master,fail - 1651681440022 1651681437000 1 disconnected
8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384@16384 slave aa89bba715780e6bf30ecbb734580b9da68e394f 0 1651681547575 2 connected
e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385@16385 slave 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 0 1651681549000 3 connected
aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382@16382 myself,master - 0 1651681546000 2 connected 5461-10922
71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386@16386 master - 0 1651681549619 7 connected 0-5460

####### 而且可以成功获取其中存放的值  #######
127.0.0.1:6382> get k1
-> Redirected to slot [12706] located at 192.168.226.128:6383
"v1"
192.168.226.128:6383> get k2
-> Redirected to slot [449] located at 192.168.226.128:6386
"v2"
192.168.226.128:6386> get k3
"v3"
192.168.226.128:6386> get k4
-> Redirected to slot [8455] located at 192.168.226.128:6382
"v4"
192.168.226.128:6382> 

2.3.2.2 重新启动6381,查看集群关系

重新启动 redis-node-1(6381),6381变成slave
已经变成master的redis-node-6(6386)仍然保持master

[root@vm001 admin]# docker start redis-node-1 
redis-node-1
[root@vm001 admin]# docker exec -it redis-node-2 /bin/bash
root@vm001:/data# redis-cli -p 6382 -c
127.0.0.1:6382> cluster nodes
56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383@16383 master - 0 1651682704000 3 connected 10923-16383
94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381@16381 slave 71d1bc72e53985d25570ccd1accea81c7989b008 0 1651682705386 7 connected
8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384@16384 slave aa89bba715780e6bf30ecbb734580b9da68e394f 0 1651682706401 2 connected
e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385@16385 slave 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 0 1651682704000 3 connected
aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382@16382 myself,master - 0 1651682705000 2 connected 5461-10922
71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386@16386 master - 0 1651682704367 7 connected 0-5460

2.3.2.3 还原原来的三主三从

停止 redis-node-6(6386), 经过心跳时间后,此时6381变成master
再次启动 redis-node-6, 变成slave

[root@vm001 admin]# docker stop redis-node-6
redis-node-6
127.0.0.1:6382> cluster nodes
56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383@16383 master - 0 1651682809848 3 connected 10923-16383
94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381@16381 master - 0 1651682810873 8 connected 0-5460
8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384@16384 slave aa89bba715780e6bf30ecbb734580b9da68e394f 0 1651682811902 2 connected
e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385@16385 slave 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 0 1651682809000 3 connected
aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382@16382 myself,master - 0 1651682811000 2 connected 5461-10922
71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386@16386 master,fail - 1651682784251 1651682781000 7 disconnected

2.4 主从扩容 – 四主四从或更多

2.4.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
# 结果显示8个节点

进入6387容器实例内部

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

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

# redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
# 6387 就是将要作为master新增节点
# 6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
redis-cli --cluster add-node 192.168.226.128:6387 192.168.226.128:6381

在这里插入图片描述

2.4.3 检查集群情况第1次

redis-cli –cluster check 真实ip地址:6381
redis-cli –cluster check 192.168.226.128:6381

############ 检查集群情况
root@vm001:/data# redis-cli --cluster check 192.168.226.128:6381
192.168.226.128:6381 (94714f89...) -> 2 keys | 5461 slots | 1 slaves.
192.168.226.128:6382 (aa89bba7...) -> 1 keys | 5462 slots | 1 slaves.
############## 新增 redis server 没有分配到槽
192.168.226.128:6387 (cd58f466...) -> 0 keys | 0 slots | 0 slaves.
192.168.226.128:6383 (56f6c3cc...) -> 2 keys | 5461 slots | 1 slaves.
[OK] 5 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.226.128:6381)
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386
   slots: (0 slots) slave
   replicates 94714f899698acb6e3d3584474c8bbbc7677e882
############ 新增 redis master
M: cd58f46691ae515f63739726b0c70018cd765bc7 192.168.226.128:6387
   slots: (0 slots) master
S: e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385
   slots: (0 slots) slave
   replicates 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2
S: 8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384
   slots: (0 slots) slave
   replicates aa89bba715780e6bf30ecbb734580b9da68e394f
M: 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

2.4.4 重新分派槽号:

# redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.226.128:6381

在这里插入图片描述

2.4.5 检查集群情况第2次

# redis-cli --cluster check 真实ip地址:6381
root@vm001:/data# redis-cli --cluster check 192.168.226.128:6381
192.168.226.128:6381 (94714f89...) -> 1 keys | 4096 slots | 1 slaves.
192.168.226.128:6382 (aa89bba7...) -> 1 keys | 4096 slots | 1 slaves.
192.168.226.128:6387 (cd58f466...) -> 1 keys | 4096 slots | 0 slaves.
192.168.226.128:6383 (56f6c3cc...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 5 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.226.128:6381)
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386
   slots: (0 slots) slave
   replicates 94714f899698acb6e3d3584474c8bbbc7677e882
############### 新增 redis server 分配到槽号了 [0-1364],[5461-6826],[10923-12287] 
############### 每个其他节点都分部分槽号给到6387
M: cd58f46691ae515f63739726b0c70018cd765bc7 192.168.226.128:6387
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
S: e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385
   slots: (0 slots) slave
   replicates 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2
S: 8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384
   slots: (0 slots) slave
   replicates aa89bba715780e6bf30ecbb734580b9da68e394f
M: 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

2.4.6 为主节点6387分配从节点6388

# 命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
  redis-cli --cluster add-node 192.168.226.128:6388 192.168.226.128:6387 --cluster-slave --cluster-master-id cd58f46691ae515f63739726b0c70018cd765bc7 
##  cd58f46691ae515f63739726b0c70018cd765bc7 这个是6387的编号,按照自己实际情况
root@vm001:/data# redis-cli --cluster add-node 192.168.226.128:6388 192.168.226.128:6387 --cluster-slave --cluster-master-id cd58f46691ae515f63739726b0c70018cd765bc7 
>>> Adding node 192.168.226.128:6388 to cluster 192.168.226.128:6387
>>> Performing Cluster Check (using node 192.168.226.128:6387)
M: cd58f46691ae515f63739726b0c70018cd765bc7 192.168.226.128:6387
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
M: aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386
   slots: (0 slots) slave
   replicates 94714f899698acb6e3d3584474c8bbbc7677e882
S: 8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384
   slots: (0 slots) slave
   replicates aa89bba715780e6bf30ecbb734580b9da68e394f
M: 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
S: e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385
   slots: (0 slots) slave
   replicates 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.226.128:6388 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 192.168.226.128:6387.
[OK] New node added correctly.

2.4.7 检查集群情况第3次

四主四从成功配置
redis-cli –cluster check 192.168.226.128:6381

root@vm001:/data# redis-cli --cluster check 192.168.226.128:6381
192.168.226.128:6381 (94714f89...) -> 1 keys | 4096 slots | 1 slaves.
192.168.226.128:6382 (aa89bba7...) -> 1 keys | 4096 slots | 1 slaves.
192.168.226.128:6387 (cd58f466...) -> 1 keys | 4096 slots | 1 slaves.
192.168.226.128:6383 (56f6c3cc...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 5 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.226.128:6381)
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386
   slots: (0 slots) slave
   replicates 94714f899698acb6e3d3584474c8bbbc7677e882
M: cd58f46691ae515f63739726b0c70018cd765bc7 192.168.226.128:6387
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385
   slots: (0 slots) slave
   replicates 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2
S: 3e67538095c080957dbafbc596b8cb8a5f7a9702 192.168.226.128:6388
   slots: (0 slots) slave
   replicates cd58f46691ae515f63739726b0c70018cd765bc7
S: 8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384
   slots: (0 slots) slave
   replicates aa89bba715780e6bf30ecbb734580b9da68e394f
M: 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

2.5 主从缩容

目的:6387和6388下线

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

redis-cli --cluster check 192.168.226.128:6381

S: 3e67538095c080957dbafbc596b8cb8a5f7a9702 192.168.226.128:6388
   slots: (0 slots) slave
   replicates cd58f46691ae515f63739726b0c70018cd765bc7

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

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

## redis-cli --cluster del-node 192.168.226.128:6388 3e67538095c080957dbafbc596b8cb8a5f7a9702
root@vm001:/data# redis-cli --cluster del-node 192.168.226.128:6388 3e67538095c080957dbafbc596b8cb8a5f7a9702
>>> Removing node 3e67538095c080957dbafbc596b8cb8a5f7a9702 from cluster 192.168.226.128:6388
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

root@vm001:/data# redis-cli --cluster check 192.168.226.128:6382
## 结果只有 7 台机器

2.5.3 将6387的槽号清空,重新分配

本例将清出来的槽号都给6381,4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端

命令:redis-cli –cluster reshard 192.168.226.128:6381

root@vm001:/data# redis-cli --cluster reshard 192.168.226.128:6381
>>> Performing Cluster Check (using node 192.168.226.128:6381)
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: aa89bba715780e6bf30ecbb734580b9da68e394f 192.168.226.128:6382
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 71d1bc72e53985d25570ccd1accea81c7989b008 192.168.226.128:6386
   slots: (0 slots) slave
   replicates 94714f899698acb6e3d3584474c8bbbc7677e882
M: cd58f46691ae515f63739726b0c70018cd765bc7 192.168.226.128:6387
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
S: e4c3904b51cfed5a8f9e6d2a4d83236a906fda33 192.168.226.128:6385
   slots: (0 slots) slave
   replicates 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2
S: 8bd2ff973fa218f9022262c0815a9e5bd3c192d4 192.168.226.128:6384
   slots: (0 slots) slave
   replicates aa89bba715780e6bf30ecbb734580b9da68e394f
M: 56f6c3cc46dc5fa3eac29ccfa01d755f346fa2c2 192.168.226.128:6383
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
######## 本次移动 6387 上面所有4096个槽
How many slots do you want to move (from 1 to 16384)? 4096
######## 移动的槽由 6381 接收
What is the receiving node ID? 94714f899698acb6e3d3584474c8bbbc7677e882
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
######## 输入 6387 的ID
Source node #1: cd58f46691ae515f63739726b0c70018cd765bc7
Source node #2: done

########## xxxxxxxxxxxxx 前面会刷新很多槽的信息
Do you want to proceed with the proposed reshard plan (yes/no)? yes
########## xxxxxxxxxxxxx 后面会刷新很多槽的信息

2.5.4 检查集群情况第二次

root@vm001:/data# redis-cli --cluster check 192.168.226.128:6382
# 6381 的槽变成8192 个
M: 94714f899698acb6e3d3584474c8bbbc7677e882 192.168.226.128:6381
   slots:[0-6826],[10923-12287] (8192 slots) master
   1 additional replica(s)
# 6387 的槽变成0 个
M: cd58f46691ae515f63739726b0c70018cd765bc7 192.168.226.128:6387
   slots: (0 slots) master

2.5.5 删除6387 服务

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

root@vm001:/data# redis-cli --cluster del-node 192.168.226.128:6387 cd58f46691ae515f63739726b0c70018cd765bc7
>>> Removing node cd58f46691ae515f63739726b0c70018cd765bc7 from cluster 192.168.226.128:6387
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

2.5.6 检查集群情况第三次

root@vm001:/data# redis-cli --cluster check 192.168.226.128:6382
192.168.226.128:6382 (aa89bba7...) -> 1 keys | 4096 slots | 1 slaves.
192.168.226.128:6381 (94714f89...) -> 2 keys | 8192 slots | 1 slaves.
192.168.226.128:6383 (56f6c3cc...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 5 keys in 3 masters.
## 剩下三主三从了

2.6 命令总结

  • 构建集群关系: redis-cli –cluster create
# 进入容器
docker exec -it redis-node-1 /bin/bash

注意,进入docker容器后才能执行一下命令,且注意自己的真实IP地址
通过 ifconfig 查看自己的机器的ip地址

# 构建集群关系
redis-cli --cluster create 192.168.226.128:6381 192.168.226.128:6382 192.168.226.128:6383 192.168.226.128:6384 192.168.226.128:6385 192.168.226.128:6386 --cluster-replicas 1
  • 检查集群情况
# redis-cli --cluster check 真实ip地址:6381
root@vm001:/data# redis-cli --cluster check 192.168.226.128:6381
  • 添加节点:redis-cli –cluster add-node
# redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
# 6387 就是将要作为master新增节点
# 6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
redis-cli --cluster add-node 192.168.226.128:6387 192.168.226.128:6381
  • 分配槽号:redis-cli –cluster reshard
# redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.226.128:6381
  • 删除节点:redis-cli –cluster del-node
## redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.226.128:6388 3e67538095c080957dbafbc596b8cb8a5f7a9702

版权声明:本文为BogerPeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。