Redis Cluster 集群节点后期维护

Redis Cluster 集群节点后期维护

后期维护redis的注意事项

1、后期redis集群监控

2、监控他的运行内存

# 登录至 redis
[09:06:28 root@a7 ~]#redis-cli -a 12345

# 输入 info memory 查看内存
127.0.0.1:6379> INFO memory

3、通过链接到redis cluster集群端口上输入 cluster info查看集群状态是否OK

# 登录至 redis
[09:27:38 root@a7 ~]#redis-cli -a 12345

# 输出 cluster info 查看当前集群状态
127.0.0.1:6379> cluster info
cluster_state:ok                    # 状态为 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:7
cluster_my_epoch:1
cluster_stats_messages_ping_sent:11180
cluster_stats_messages_pong_sent:10496
cluster_stats_messages_auth-ack_sent:1
cluster_stats_messages_sent:21677
cluster_stats_messages_ping_received:10491
cluster_stats_messages_pong_received:11179
cluster_stats_messages_meet_received:5
cluster_stats_messages_fail_received:1
cluster_stats_messages_auth-req_received:1
cluster_stats_messages_received:21677

集群运行时间长久之后,难免由于硬件故障、网络规划、业务增长等原因对已有集群进行相应的调整, 比如增加

Redis node节点、减少节点、节点迁移、更换服务器等。增加节点和删除节点会涉及到已有的槽位重新分配及数据迁移。

4.2.5.1 集群维护之动态添加节点步骤

扩容就是增加 Redis node节点,需要与之前的Redis node版本相同、配置一致,然后分别启动两台Redis node,因为一主一从。而且扩容主要用于分布式存储,以及数据库等等。这就只能加节点

4.2.5.1.1 添加新节点至 redis 集群案例

因公司业务发展迅猛,现有的三主三从 redis cluster 架构可能无法满足现有业务的并发写入需求,因此公司紧急采购一台服务器 10.0.0.77,需要将其动态添加到集群当中其不能影响业务使用和数据丢失,则添加过程如下:

同步之前 Redis node 的配置文件拷贝到 10.0.0.77 Redis编译安装目录,注意配置文件的监听 IP。

现在我们又加入两台机器让他支持横向扩容。当用户写入数据的时候就通过算法将他的数据存放的某个槽位上。但是现在为了让黄色区域的两台主机支持横向扩展就要给他分配槽位。

4.2.5.1.2 添加新节点至 redis 集群

1、先将10.0.0.77这个主机启动然后再将C7主机上的redis安装包拷贝过去。然后再把 77 这个ip 的主机添加到集群中。先在在 10.0.0.77(g7)主机上创建一个 apps 的目录

[09:06:24 root@g7 ~]#mkdir /apps/

2、在 A7 主机上将 redis 安装包和 redis.service 启动文件拷贝至 G7

# 进入到 /apps 目录下
[10:18:54 root@a7 ~]#cd /apps/

# 将 redis 整个打包
[10:19:23 root@a7 apps]#tar czvf redis.tar.gz redis/*

# 拷贝 redis 安装包至 G7 主机
[10:19:26 root@a7 apps]#scp redis.tar.gz 10.0.0.67:/apps/

# 拷贝 redis 启动文件至 G7 
[10:24:08 root@a7 ~]#scp /usr/lib/systemd/system/redis.service 10.0.0.67:/usr/lib/systemd/system/redis.service

3、在g7上进行解压然后创建redis这个用户以及修改目录权限

# 进入到 /apps 目录
[10:13:51 root@g7 ~]#cd /apps/

# 解压 redis 安装包
[10:21:20 root@g7 apps]#tar xf redis.tar.gz

# 创建redis这个用户和指定他的权限给/apps/redis目录
[10:21:23 root@g7 apps]#useradd redis

# 指定 redis 用户授权
[10:22:09 root@g7 apps]#chown -R redis.redis /apps/redis/

4、给 G7 主机上的 redis 做一个软连接

[10:22:22 root@g7 apps]#ln /apps/redis/bin/redis-* /usr/bin/

5、在 G7 主机上启动 redis

# 启动 redis
[10:23:13 root@g7 apps]#systemctl start redis

# 查看端口开启
[10:26:10 root@g7 apps]#ss -ntl

6、在 G7 主机上将 redis /data/ 目录下的数据清除干净

[10:26:13 root@g7 apps]#rm -fr /apps/redis/data/*

7、在 A7 主机上将 G7 主机添加到 redis 集群中。

[10:56:07 root@a7 ~]#redis-cli -a 12345 --cluster add-node 10.0.0.67:6379 10.0.0.7:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 10.0.0.67:6379 to cluster 10.0.0.7:6379
>>> Performing Cluster Check (using node 10.0.0.7:6379)
M: 37903f7ed95fc5a8921cd304f24d9d115643e253 10.0.0.7:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 9126302c57e8f36a965b0a400028f2dd73f8a283 10.0.0.47:6379
   slots: (0 slots) slave
   replicates 37903f7ed95fc5a8921cd304f24d9d115643e253
S: 773f0187feeee85963a9ddb3c804b853e7fa3a74 10.0.0.27:6379
   slots: (0 slots) slave
   replicates 6158b52ba6d3356b5b78dde250ec4a10a34f2e19
M: 6158b52ba6d3356b5b78dde250ec4a10a34f2e19 10.0.0.37:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: ed472ec36e9341a51c758df67b16facb4ef7173b 10.0.0.17:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 7890dd9f85280ab32d8b04c95e31bf0b92bee1a7 10.0.0.57:6379
   slots: (0 slots) slave
   replicates ed472ec36e9341a51c758df67b16facb4ef7173b
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.0.0.67:6379 to make it join the cluster.
[OK] New node added correctly.      # 提示添加成功

4.2.5.1.3 为 G7 服务器上的 redis 重新分槽

1、在 A7 主机上通过redis-cli -a 12345 --cluster check 10.0.0.7:6379命令查看 redis 集群中已经有了 10.0.0.67(G7)主机。但是这个时候我们的G7主机上面没有槽位

[11:15:34 root@a7 ~]#redis-cli -a 12345  --cluster check 10.0.0.7:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.0.0.7:6379 (37903f7e...) -> 0 keys | 5461 slots | 1 slaves.
10.0.0.67:6379 (82d94747...) -> 0 keys | 0 slots | 0 slaves.
10.0.0.37:6379 (6158b52b...) -> 1 keys | 5461 slots | 1 slaves.
10.0.0.17:6379 (ed472ec3...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 1 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.7:6379)
M: 37903f7ed95fc5a8921cd304f24d9d115643e253 10.0.0.7:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 9126302c57e8f36a965b0a400028f2dd73f8a283 10.0.0.47:6379
   slots: (0 slots) slave
   replicates 37903f7ed95fc5a8921cd304f24d9d115643e253
M: 82d947471b1b78ace45b99295346be1149fa19e5 10.0.0.67:6379
   slots: (0 slots) master                              # 0 槽位所以我们要重新分片
S: 773f0187feeee85963a9ddb3c804b853e7fa3a74 10.0.0.27:6379
   slots: (0 slots) slave
   replicates 6158b52ba6d3356b5b78dde250ec4a10a34f2e19
M: 6158b52ba6d3356b5b78dde250ec4a10a34f2e19 10.0.0.37:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: ed472ec36e9341a51c758df67b16facb4ef7173b 10.0.0.17:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 7890dd9f85280ab32d8b04c95e31bf0b92bee1a7 10.0.0.57:6379
   slots: (0 slots) slave
   replicates ed472ec36e9341a51c758df67b16facb4ef7173b
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

-a 12345        # 这个是登录 redis 的密码

2、然后通过对每个 redis 集群中的 master 主机进行 KEYS * 检查发现我们的 D7 主机上有一个数据。在生产中需要将这个 rdb 文件将他拷贝走进行改名。然后将分片完了之后将rdb文件移动回来进行改成rdb的文件后缀即可

# A7 上做检查
[11:15:42 root@a7 ~]#redis-cli -a 12345
127.0.0.1:6379> KEYS *
(empty array)

# B7 上做检测
[09:06:06 root@B7 ~]#redis-cli -a 12345
127.0.0.1:6379> KEYS *
(empty array)

# D7 上做检测,发现有数据
[09:06:11 root@D7 ~]#redis-cli -a 12345
127.0.0.1:6379> KEYS *
1) "redis-cluster-key1"
127.0.0.1:6379> FLUSHDB         # 通过 flushdb 在 D7 上将数据清除
OK

# G7 上做检测
[10:57:51 root@g7 data]#redis-cli -a 12345
127.0.0.1:6379> KEYS *
(empty array)

3、这个时候我们就要使用redis-cli -a 12345 --cluster reshard连接到我们的任何一台redis集群主机中,然后他会提示 How many slots do you want to move (您要移动多少个插槽) 这个时候我们要将 redis 集群中每个 master 主机的数据都删除了才能进行重新分片否则是分片不成功的,像这种情况我们可以再工作的晚上凌晨的时候将我们的 rdb 文件进行备份然后还原每个 master 数据库。

# 由于是 4 个 master 主机所以我们就要让 16384 的槽位进行除以 4 来分片。我们分出 5000 来将他分给10.0.0.67 的这个主机 id 。 然后我们写 all 让 redis 自动帮我们分片

[11:33:36 root@a7 ~]#redis-cli -a 12345  --cluster reshard 10.0.0.7:6379

>>> Performing Cluster Check (using node 10.0.0.7:6379)
M: 37903f7ed95fc5a8921cd304f24d9d115643e253 10.0.0.7:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 9126302c57e8f36a965b0a400028f2dd73f8a283 10.0.0.47:6379
   slots: (0 slots) slave
   replicates 37903f7ed95fc5a8921cd304f24d9d115643e253
M: 82d947471b1b78ace45b99295346be1149fa19e5 10.0.0.67:6379
   slots: (0 slots) master
S: 773f0187feeee85963a9ddb3c804b853e7fa3a74 10.0.0.27:6379
   slots: (0 slots) slave
   replicates 6158b52ba6d3356b5b78dde250ec4a10a34f2e19
M: 6158b52ba6d3356b5b78dde250ec4a10a34f2e19 10.0.0.37:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: ed472ec36e9341a51c758df67b16facb4ef7173b 10.0.0.17:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 7890dd9f85280ab32d8b04c95e31bf0b92bee1a7 10.0.0.57:6379
   slots: (0 slots) slave
   replicates ed472ec36e9341a51c758df67b16facb4ef7173b
[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)?5000 # 您要移动多少个插槽,这里我移动 5000
What is the receiving node ID? 82d947471b1b78ace45b99295346be1149fa19e5 #G7主机的 redis 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                                     # all 将所有 redis 节点重新分槽
# 最后会问我是否确认分配,输入 yes
Do you want to proceed with the proposed reshard plan (yes/no)? yes

4、分完之后在 A7 主机上输入 --cluster info参数查看 10.0.0.67 主机的槽位事 5000 (因为是从0开始计算) 然后 slave 节点为 0 。所以我们要给 10.0.0.67 添加一个从节点

[11:43:32 root@a7 ~]#redis-cli -a 12345  --cluster info 10.0.0.7:6379

10.0.0.7:6379 (37903f7e...) -> 0 keys | 3795 slots | 1 slaves.
10.0.0.67:6379 (82d94747...) -> 0 keys | 4999 slots | 0 slaves. # 0 个 slave 节点
10.0.0.37:6379 (6158b52b...) -> 0 keys | 3795 slots | 1 slaves.
10.0.0.17:6379 (ed472ec3...) -> 0 keys | 3795 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.

4.2.5.1.4 为 G7 主节点分配一个 slave 节点

现在我们开启一台新的 H7 机器,然后将刚才拷贝至 G7 的 redis 安装压缩包拷贝至 H7 ,然后在 H7 上安装 redis

1、在 H7 主机上创建 apps 这个目录

[11:49:33 root@h7 ~]#mkdir /apps/

2、将 G7 上的 redis 安装包和 redis.service 文件拷贝到 H7 上

# 拷贝 redis 安装包
[11:51:22 root@g7 data]#scp /apps/redis.tar.gz 10.0.0.77:/apps/redis.tar.gz

# 拷贝 redis 启动文件
[11:51:42 root@g7 data]#scp /usr/lib/systemd/system/redis.service 10.0.0.77:/usr/lib/systemd/system/redis.service 

3、回到 H7 操作,解压 redis 安装包,并创建 redis 用户授权 redis 用户权限。

# 进入 apps 目录下 解压 redis 安装包
[11:50:31 root@h7 ~]#cd /apps/
[11:52:56 root@h7 apps]#tar xf redis.tar.gz 

# 创建 redis 用户,并且授权给 /apps/redis 权限
[11:52:59 root@h7 apps]#useradd redis
[11:53:18 root@h7 apps]#chown -R redis.redis /apps/redis/*

4、在 H7 上创建 redis 的软连接

[11:53:43 root@h7 apps]#ln -sv /apps/redis/bin/redis-* /usr/bin/

5、启动 H7 redis 服务

[11:55:26 root@h7 apps]#systemctl start redis

6、在回到 A7 主机上将 H7 主机添加至 redis 集群中,添加进来默认是 master 节点

[14:33:54 root@a7 ~]#redis-cli -a 12345 --cluster add-node 10.0.0.77:6379 10.0.0.7:6379

## 提示添加节点成功
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.0.0.77:6379 to make it join the cluster.
[OK] New node added correctly.

7、先在 A7 主机上看 redis 集群所有主机的 cluster 信息。

[14:35:41 root@a7 ~]#redis-cli -a 12345  --cluster check 10.0.0.7:6379

# 这个 G7 节点的 redis ID
M: 79de5d37d28fafcd50e7f2b1276f1405b37fbd05 10.0.0.67:6379

8、在 A7 节点上登录至 H7 节点的 redis 交互界面下,将 H7 指定为 G7 主机的 slave 节点。

# 登录至 H7 节点的 redis 服务
[14:42:18 root@a7 ~]#redis-cli -h 10.0.0.77 -a 12345

# 将 H7 节点指定添加为 G7 的 slave ,后面跟上 G7 的 redis ID
10.0.0.77:6379> CLUSTER REPLICATE 79de5d37d28fafcd50e7f2b1276f1405b37fbd05
OK

4.2.5.1.5 验证 H7 节点是否假如 redis 集群

1、到 H7 节点上登录至 redis,查看当前主从复制状态

# 登录至 redis
[14:34:28 root@h7 apps]#redis-cli -a 12345

# 查看主从复制信息
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.67
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:784
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:13a50cba67353620504396b841c30b324e28f2e6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:784
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:784

2、通过redis-cli cluster info 查看整个集群的主从关系 已经实现了 Redis 集群的动态添加新的主从节点。这样就完成了扩容了我们先在就让开发将redis的rdb文件倒回来

点赞