Redis高可用集群水平扩展

前言

《Redis高可用集群部署》中我们部署了Redis高可用架构。整个集群由6个节点组成,这6个节点分布在三台机器上,采用了三主三从模式。

Redis高可用三主三从架构

1、启动集群

启动《Redis高可用集群部署》中搭建好的三主三从高可用集群

1
2
3
4
5
6
/home/redis/build/bin/redis-server /home/redis/cluster/8001/redis.conf
/home/redis/build/bin/redis-server /home/redis/cluster/8002/redis.conf
/home/redis/build/bin/redis-server /home/redis/cluster/8003/redis.conf
/home/redis/build/bin/redis-server /home/redis/cluster/8004/redis.conf
/home/redis/build/bin/redis-server /home/redis/cluster/8005/redis.conf
/home/redis/build/bin/redis-server /home/redis/cluster/8006/redis.conf

登录端口为8001的redis客户端

1
/home/redis/build/bin/redis-cli -c -h 192.168.31.16 -p 8001

查看集群状态

1
192.168.31.16:8001> cluster nodes

Redis高可用集群节点状态

从上面的集群状态信息中可以看出,这个集群运行正常,三个master节点和三个slave节点,8001端口的实例节点存储0-5460这些hash slot,8002端口的节点存储5461-10922这个范围的hash slot;8003端口的实例节点存储10923-16383这个范围的hash slot;这三个master节点存储的所有hash slot组成整个集群的存储槽位,slave节点是每个主节点的备份从节点,不会显示存储槽位。

2、集群操作

我们在原始的集群基础上在新增一主(8007)一从(8008),增加节点后的集群架构如下图:虚线节点为新加入的节点

新增节点之后集群架构

增加Redis节点实例

在/home/redis/cluster下新建8007和8008文件夹

1
mkdir 8007 8008

创建文件夹

并把8006文件夹下的redis.conf配置文件拷贝到8007和8008两个文件夹中,如下

拷贝配置文件

修改8007文件夹下的redis.conf配置文件

1
vim ./8007/redis.conf

修改内容如下:

1
2
3
port: 8007
dir /home/redis/cluster/8007/
cluster-config-file nodes-8007.conf

修改8008文件下的redis.conf配置文件

1
vim ./8008/redis.conf

修改内容如下:

1
2
3
port: 8008
dir /home/redis/cluster/8008/
cluster-config-file nodes-8008.conf

启动8007和8008两个服务,并查看启动状态

1
2
3
/home/redis/buile/bin/redis-server /home/redis/cluster/8007/redis.conf
/home/redis/buile/bin/redis-server /home/redis/cluster/8008/redis.conf
ps -ef | grep redis

通过redis帮助命令查找加入节点的命令

1
/home/redis/build/bin/redis-cli --cluster help

cluster help手册

create 创建一个集群环境host1:port1……hostN:portN
call 可以知晓redis命令
add-node 将一个节点添加到集群里,第一个参数为新节点的IP:Port,第二个参数为集群中任意一个已经存在的节点的IP:Port
del-node 删除一个节点
reshard 重新分片
check 检查集群状态

配置8007为集群主节点

使用add-node 命令新增一个主节点8007(master),前面的IP:Port为新增节点,后面的IP:Port为已知存活的节点。

1
/home/redis/build/bin/redis-cli --cluster add-node 192.168.31.80:8007 192.168.31.80:8003

新节点加入集群

出现”[OK] New node added correctly”表示新节点加入成功。

再查看集群状态,确认一下是否真正加入成功

1
2
/home/redis/build/bin/redis-cli -c -h 192.168.31.80 -p 8003
192.168.31.80:8003> cluster nodes

8007节点加入成功

注意:当添加节点成功之后,新增的节点不会有任何数据,因为它还没有分配任何的slot(hash槽),我们需要手动为新节点分配hash槽

使用redis-cli命令为8007分配hash槽,找到集群中的任意一个主节点,对其进行重新分片工作

1
/home/redis/build/bin/redis-cli --cluster reshard 192.168.31.80:8006

输出信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 600
# (ps:需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)
What is the receiving node ID? a269eb14c20c00bce5277f1ab7d185a0b4ff7081
# (ps:把这600个hash槽移动到哪个节点上去,需要指定节点id)
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.
Source node #1: all
# (ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)

Ready to move 600 slots.
Source nodes:
M: 9733f9dcf9f49366c20ba48e9255ed8dacbf3ce9 192.168.31.16:8004
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 7335dcf54192b1015ff9b386391e424bd5379bb3 192.168.31.224:8002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 1e0e204666cc8eab8c138913df4dd23135b38a05 192.168.31.16:8001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
Destination node:
M: a269eb14c20c00bce5277f1ab7d185a0b4ff7081 192.168.31.80:8007
slots: (0 slots) master
Resharding plan:
Moving slot 5461 from 7335dcf54192b1015ff9b386391e424bd5379bb3
Moving slot 5462 from 7335dcf54192b1015ff9b386391e424bd5379bb3
……………………

Do you want to proceed with the proposed reshard plan (yes/no)? yes
# (ps:输入yes确认开始执行分片任务)
……………………

查看最新集群状态

1
/home/redis/build/bin/redis-cli -c -h 192.168.31.16 -p 8004

最新集群状态

如上图所示,现在我们的8007已经有hash槽了,也就是现在可以在8007上写数据了,到此为止8007已经加入到集群中,并且是主节点(master)

配置8008为8007的从节点

添加从节点8008到集群中去并查看集群状态

1
/home/redis/build/bin/redis-cli --cluster add-node 192.168.31.80:8008 192.168.31.80:8007

配置8008为8007的从节点

查看集群状态信息:

集群状态

如图所示,存在一个master(8008)节点,没有被分配任何的hash槽。

我们需要执行replicate命令来指定当前节点(从节点)的主节点id为哪个,首先需要连接新加的8008节点的客户端,然后使用集群命令进行操作,把当前的8008(slave)节点指定到一个主节点下(这里使用之前创建的8007主节点)

1
2
/home/redis/build/bin/redis-cli -c -h 192.168.31.80 -p 8008
cluster replicate a269eb14c20c00bce5277f1ab7d185a0b4ff7081 #后面这串id为8007的节点id

查看集群状态,8008节点已成功添加为8007节点的从节点

集群状态

删除8008从节点

del-node删除从节点8008,指定删除节点IP和端口,以及节点id

1
/home/redis/build/bin/redis-cli --cluster del-node 192.168.31.80:8008 63aef88d1fda94a340f045f386eef8f61453c755

192.168.31.80:8008 为要删除节点的IP和端口
63aef88d1fda94a340f045f386eef8f61453c755 为要删除节点的id

删除8008节点

查看集群状态,如下图所示,8008这个slave节点已经移除了。

集群状态

查看redis运行的实例,并关掉8008服务

1
2
ps -ef | grep redis
kill 进程ID

关闭8008进程

删除8007主节点

最后,我们删除之前加入的主节点8007,这个步骤比较麻烦,因为主节点的里面是有分配hash槽的,所以我们这里必须要先把8007里的hash槽放入到其他可用主节点中去,然后进行移除节点操作,不然会出现数据丢失问题(目前只能把master的数据迁移到一个节点上,暂时做不了平均分配功能),执行命令如下:

1
/home/redis/build/bin/redis-cli --cluster reshard 192.168.31.80:8007

输出如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@MiWiFi-R1CM-srv cluster]# /home/redis/build/bin/redis-cli --cluster reshard 192.168.31.80:8007
>>> Performing Cluster Check (using node 192.168.31.80:8007)
M: a269eb14c20c00bce5277f1ab7d185a0b4ff7081 192.168.31.80:8007
slots:[0-198],[5461-5661],[10923-11121] (599 slots) master
S: 93b31cae2f224d31c3c2e64c72ae3415dda34b2c 192.168.31.80:8006
slots: (0 slots) slave
replicates 7335dcf54192b1015ff9b386391e424bd5379bb3
M: 9733f9dcf9f49366c20ba48e9255ed8dacbf3ce9 192.168.31.16:8004
slots:[11122-16383] (5262 slots) master
1 additional replica(s)
S: caf9f23f9e339c640d35d181f2c5c398b5ba2f30 192.168.31.224:8005
slots: (0 slots) slave
replicates 1e0e204666cc8eab8c138913df4dd23135b38a05
S: 37e9a109f56d0e86995ff02482df4d0d94b6fc2c 192.168.31.80:8003
slots: (0 slots) slave
replicates 9733f9dcf9f49366c20ba48e9255ed8dacbf3ce9
M: 1e0e204666cc8eab8c138913df4dd23135b38a05 192.168.31.16:8001
slots:[199-5460] (5262 slots) master
1 additional replica(s)
M: 7335dcf54192b1015ff9b386391e424bd5379bb3 192.168.31.224:8002
slots:[5662-10922] (5261 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.
How many slots do you want to move (from 1 to 16384)? 600
What is the receiving node ID? 1e0e204666cc8eab8c138913df4dd23135b38a05
# (ps:这里是需要把数据移动到哪?我们这里指定8001的主节点id)
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.
Source node #1: a269eb14c20c00bce5277f1ab7d185a0b4ff7081
# (ps:这里是需要数据源,也就是我们要移除的8007节点id)
Source node #2: done
# (ps:这里直接输入done 开始生成迁移计划)

Ready to move 600 slots.
Source nodes:
M: a269eb14c20c00bce5277f1ab7d185a0b4ff7081 192.168.31.80:8007
slots:[0-198],[5461-5661],[10923-11121] (599 slots) master
Destination node:
M: 1e0e204666cc8eab8c138913df4dd23135b38a05 192.168.31.16:8001
slots:[199-5460] (5262 slots) master
1 additional replica(s)
Resharding plan:
Moving slot 0 from a269eb14c20c00bce5277f1ab7d185a0b4ff7081
Moving slot 1 from a269eb14c20c00bce5277f1ab7d185a0b4ff7081
………………
Moving slot 11121 from a269eb14c20c00bce5277f1ab7d185a0b4ff7081
Do you want to proceed with the proposed reshard plan (yes/no)? yes
# (ps:这里输入yes开始迁移)

致此,我们已经成功把8007主节点的数据迁移到8001上去了,我们可以看一下集群状态:

集群节点状态

从上图可以看出8007下面已经没有任何hash槽了,证明数据迁移成功!

最后直接使用del-node命令删除8007主节点即可

1
/home/redis/build/bin/redis-cli --cluster del-node 192.168.31.80:8007 a269eb14c20c00bce5277f1ab7d185a0b4ff7081

删除8007主节点

在查看集群状态,还原到了原来的状态:

集群状态

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信