当前位置: 首页 > news >正文

Redis 集群模式

文章目录

  • 前言
    • 1. Redis Cluster 搭建
    • 1.1 准备节点
    • 1.2 准备配置文件
    • 1.3 查看集群状态
  • 2. 客户端访问
  • 3. Python 连接集群
  • 4. Redis 集群维护
    • 4.1 新增节点
    • 4.2 手动分配 slot
    • 4.3 节点移除
  • 5. 集群运维
    • 5.1 集群倾斜
    • 5.2 手动切换

前言

Redis 3.0 提供了 Redis Cluster 架构,有效解决 Redis 分布式方面的需求。当遇到单机内存、并发、流量瓶颈时,可以使用 Redis 集群模式解决,达到负载均衡的目的。本篇文章将介绍 Redis 集群搭建运维。

1. Redis Cluster 搭建

由于服务器有限,这里演示部署的时候,采用了多实例的部署方式。

主机Redis 端口程序
172.16.104.576379、6389、6399Redis 7.0
172.16.104.566379、6389、6399Redis 7.0

1.1 准备节点

Redis Cluster 至少需要 6 个 Redis 节点才能组成完整的高可用集群。如下图,3 节点双副本。
在这里插入图片描述

1.2 准备配置文件

配置文件基本相同,除了端口和不同,6 套 Redis 服务,分别部署在两台服务器上。所以 Redis 的日志目录和工作目录都需要修改。
由于使用的是方式是多实例部署,6 套 Redis 服务分别部署在 2 台服务器上面,配置文件上会有细微的差别,下面是一个配置文件模版,需要修改的地方有:port、logfile、dir 三个参数。

# 节点端口
port 6379# 白名单
bind 0.0.0.0# 后台运行
daemonize yes# 日志目录
logfile "/data/redis/6379/redis.log"# RDB 目录
dbfilename "dump.rdb"# 工作目录
dir "/data/redis/6379"# AOF
appendonly no
appendfilename "appendonly.aof"# 密码验证
requirepass "Redis123"# 开启集群模式
cluster-enabled yes# 节点超时时间,单位毫秒
cluster-node-timeout 15000# 集群内配置文件
cluster-config-file "nodes-6379.conf"# 主库密码
masterauth "Redis123"

准备好对应的配置:

[root@172-16-104-57 redis]# ll redis_*
-rw-rw-r--. 1 redis redis 107542 73 14:31 redis_6379.conf
-rw-r--r--. 1 redis redis 107542 73 14:33 redis_6389.conf
-rw-r--r--. 1 redis redis 107542 73 14:36 redis_6399.conf

启动 57 节点上的 Redis 服务:

redis-server redis_6379.conf
redis-server redis_6389.conf
redis-server redis_6399.conf

查看进程,确认 Redis 都已启动完成,在 56 服务器上重复上述操作:

[root@172-16-104-56 redis]# ps -ef|grep redis
root     113871      1  0 14:45 ?        00:00:00 redis-server 0.0.0.0:6379 [cluster]
root     113873      1  0 14:45 ?        00:00:00 redis-server 0.0.0.0:6389 [cluster]
root     113884      1  0 14:45 ?        00:00:00 redis-server 0.0.0.0:6399 [cluster]

在任意一个节点上,执行如下命令:

redis-cli -a "Redis123" --cluster create --cluster-replicas 1 172.16.104.57:6379 172.16.104.57:6389 172.16.104.57:6399 172.16.104.56:6379 172.16.104.56:6389 172.16.104.56:6399

输入 yes 后,创建集群:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.16.104.56:6399 to 172.16.104.57:6379
Adding replica 172.16.104.57:6399 to 172.16.104.56:6379
Adding replica 172.16.104.56:6389 to 172.16.104.57:6389
M: 4598508e4e82cb2261aca847a870123d8d4a5622 172.16.104.57:6379slots:[0-5460] (5461 slots) master
M: 322f148444e409d58dedcde5c111db2f73de80a2 172.16.104.57:6389slots:[10923-16383] (5461 slots) master
S: e83d857527b04d522f297a93ee50c65059f4981b 172.16.104.57:6399replicates 0da7e019328170fd63d2e9c6197e6d31b116e304
M: 0da7e019328170fd63d2e9c6197e6d31b116e304 172.16.104.56:6379slots:[5461-10922] (5462 slots) master
S: 796d75c8f043a3ca6d33677b8f3a533154f9fd19 172.16.104.56:6389replicates 322f148444e409d58dedcde5c111db2f73de80a2
S: 1d1e0552263e7410f7e165ce64097c7c9c74b39c 172.16.104.56:6399replicates 4598508e4e82cb2261aca847a870123d8d4a5622
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 172.16.104.57:6379)
M: 4598508e4e82cb2261aca847a870123d8d4a5622 172.16.104.57:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 0da7e019328170fd63d2e9c6197e6d31b116e304 172.16.104.56:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
M: 322f148444e409d58dedcde5c111db2f73de80a2 172.16.104.57:6389slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: e83d857527b04d522f297a93ee50c65059f4981b 172.16.104.57:6399slots: (0 slots) slavereplicates 0da7e019328170fd63d2e9c6197e6d31b116e304
S: 796d75c8f043a3ca6d33677b8f3a533154f9fd19 172.16.104.56:6389slots: (0 slots) slavereplicates 322f148444e409d58dedcde5c111db2f73de80a2
S: 1d1e0552263e7410f7e165ce64097c7c9c74b39c 172.16.104.56:6399slots: (0 slots) slavereplicates 4598508e4e82cb2261aca847a870123d8d4a5622
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

当输出 [OK] All 16384 slots covered. 表示集群创建成功。

1.3 查看集群状态

cluster nodes:查看集群拓扑信息:每个节点的 ID、身份、连接数和槽数等信息。从返回值可以看出,整个Redis 集群运行正常,其中包含三个主节点和三个从节点。
截屏2024-07-04 14.43.03.png

0da7e019328170fd63d2e9c6197e6d31b116e304 172.16.104.56:6379@16379 master - 0 1720071937000 4 connected 5461-10922
322f148444e409d58dedcde5c111db2f73de80a2 172.16.104.57:6389@16389 master - 0 1720071936000 2 connected 10923-16383
e83d857527b04d522f297a93ee50c65059f4981b 172.16.104.57:6399@16399 slave 0da7e019328170fd63d2e9c6197e6d31b116e304 0 1720071938000 4 connected
796d75c8f043a3ca6d33677b8f3a533154f9fd19 172.16.104.56:6389@16389 slave 322f148444e409d58dedcde5c111db2f73de80a2 0 1720071937915 2 connected
4598508e4e82cb2261aca847a870123d8d4a5622 172.16.104.57:6379@16379 myself,master - 0 1720071937000 1 connected 0-5460
1d1e0552263e7410f7e165ce64097c7c9c74b39c 172.16.104.56:6399@16399 slave 4598508e4e82cb2261aca847a870123d8d4a5622 0 1720071938921 1 connected

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:81881
cluster_stats_messages_pong_sent:90585
cluster_stats_messages_sent:172466
cluster_stats_messages_ping_received:90580
cluster_stats_messages_pong_received:81881
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:172466
total_cluster_links_buffer_limit_exceeded:0

2. 客户端访问

Redis cluster 访问任意一个节点的时候,都可以自动计算 key 所在的位置,回返回一个 move 消息,告诉客户端 key 应该被分配在哪个节点上。
截屏2024-07-04 14.46.51.png

127.0.0.1:6379> set user1 wdwedwedwed
(error) MOVED 8106 172.16.104.56:6379

连接 172.16.104.56:6379节点,重新执行 set 命令后,写入完成。

172.16.104.56:6379> set user1 wdwedwedwed
OK 
172.16.104.56:6379> get user1
"wdwedwedwed"

3. Python 连接集群

需要执行 python3 -m pip install redis-py-cluster 安装连接 Redis 集群的模块,下图是一个 Demo。

from rediscluster import RedisCluster# 构建所有的节点
startup_nodes = [{"host": "172.16.104.56", "port": 6379},{"host": "172.16.104.56", "port": 6389},{"host": "172.16.104.56", "port": 6399},{"host": "172.16.104.57", "port": 6379},{"host": "172.16.104.57", "port": 6389},{"host": "172.16.104.57", "port": 6399}
]# 连接集群
redis_server = RedisCluster(startup_nodes=startup_nodes, decode_responses=True, password='Redis123')
# set
redis_server.set('user2', 'aaaaaaaa')
# get
print(redis_server.get('user2'))

4. Redis 集群维护

4.1 新增节点

当前集群拓扑是 3 节点双副本,接下来我们再为集群添加一个节点,变成 4 节点双副本。
首先,需要先准备好两台 Redis 实例,我们再通过修改配置文件,启动两台 Redis 实例。

[root@172-16-104-57 redis]# mkdir 6340
[root@172-16-104-57 redis]# ls
6340  6379  6389  6399

拷贝配置文件,修改 port、logfile、dir 三个参数。

cp redis_6379.conf redis_6340.conf

启动 Redis 数据库,然后再另外一个节点,重复该操作。两台新节点准备准备完成。

172.16.104.55:6379
172.16.104.55:6389

将两台新节点加入到集群中,组成 4 节点双副本。

redis-cli --cluster check 172.16.104.57:6379 -a 'Redis123'redis-cli -h 172.16.104.57 -p 6389 -a'Redis123' --cluster add-node 172.16.104.55:6379 172.16.104.55:6389

在这里插入图片描述

>>> Adding node 172.16.104.55:6379 to cluster 172.16.104.55:6389
>>> Performing Cluster Check (using node 172.16.104.55:6389)
M: 3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa 172.16.104.55:6389slots: (0 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[ERR] Not all 16384 slots are covered by nodes.

这里我看官方文档的,直接使用 add-node 命令就可以添加节点,在测试的时候发现报错 [ERR] Not all 16384 slots are covered by nodes 但是 check 节点的时候 slot 都已完成分配,没有查到解决的方法和原因,如果有人知道麻烦告诉我,谢谢。

由于使用 add-node 命令添加失败了,这里介绍另外一种方法,是可以添加成功的。

# 当前集群状态
172.16.104.57:6379 (603450ca...) -> 0 keys | 5460 slots | 1 slaves.
172.16.104.57:6389 (db174078...) -> 0 keys | 4370 slots | 1 slaves.
172.16.104.56:6379 (5be79052...) -> 0 keys | 6554 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 172.16.104.57:6379)
M: 603450cae36e4d2f43b5ba98da52f1c35f87683e 172.16.104.57:6379slots:[0-1089],[1091-5460] (5460 slots) master1 additional replica(s)
M: db1740788ce051b82014a1d461a289ec669e59e7 172.16.104.57:6389slots:[1090],[5461-6553],[10923-13828],[16014-16383] (4370 slots) master1 additional replica(s)
M: 5be790525143f1a5ba8b697095d2233536bc7e70 172.16.104.56:6379slots:[6554-10922],[13829-16013] (6554 slots) master1 additional replica(s)
S: 8a960375d75e19299b712982a1c178a15b86bfc2 172.16.104.56:6399slots: (0 slots) slavereplicates 603450cae36e4d2f43b5ba98da52f1c35f87683e
S: ead3184f5323fc8f0f8ba6f42b122b10af058388 172.16.104.57:6399slots: (0 slots) slavereplicates 5be790525143f1a5ba8b697095d2233536bc7e70
S: d0fb82c46f800ac06bb2c8533fefa8141a1dcdd2 172.16.104.56:6389slots: (0 slots) slavereplicates db1740788ce051b82014a1d461a289ec669e59e7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

连接到集群中的任意一个节点,执行如下命令,将新节点加入到集群中。

cluster meet 172.16.104.55 6379
cluster meet 172.16.104.55 6389

确认节点是否已经加入,可以看到两个新节点已经加入了,但是没有分配 slot 属于是孤立节点。

127.0.0.1:6379> cluster nodes
db1740788ce051b82014a1d461a289ec669e59e7 172.16.104.57:6389@16389 master - 0 1720164972000 10 connected 1090 5461-6553 10923-13828 16014-16383
603450cae36e4d2f43b5ba98da52f1c35f87683e 172.16.104.57:6379@16379 myself,master - 0 1720164971000 8 connected 0-1089 1091-5460
5be790525143f1a5ba8b697095d2233536bc7e70 172.16.104.56:6379@16379 master - 0 1720164971000 11 connected 6554-10922 13829-16013
3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa 172.16.104.55:6389@16389 master - 0 1720164973000 9 connected
8a960375d75e19299b712982a1c178a15b86bfc2 172.16.104.56:6399@16399 slave 603450cae36e4d2f43b5ba98da52f1c35f87683e 0 1720164971000 8 connected
ead3184f5323fc8f0f8ba6f42b122b10af058388 172.16.104.57:6399@16399 slave 5be790525143f1a5ba8b697095d2233536bc7e70 0 1720164974656 11 connected
9d37453a597f2cc4d8d4d4f788c513a82ea89c59 172.16.104.55:6379@16379 master - 0 1720164973651 0 connected
d0fb82c46f800ac06bb2c8533fefa8141a1dcdd2 172.16.104.56:6389@16389 slave db1740788ce051b82014a1d461a289ec669e59e7 0 1720164972646 10 connected

4.2 手动分配 slot

使用 add-node 或者 meet 的方式将新节点加入集群,并没有分配 slot 需要手动分配。

9d37453a597f2cc4d8d4d4f788c513a82ea89c59 172.16.104.55:6379@16379 master - 0 1720164973651 0 connected
3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa 172.16.104.55:6389@16389 master - 0 1720164973000 9 connected

接下来需要为其分配 slot 连接集群后,开始分配 slot 一共是 16384 个 slot 均分到 4 个节点,每份 4096 个 slot,需要从之前的 3 个节点中,每个节点分配一部分 slot 到新节点。

M: 603450cae36e4d2f43b5ba98da52f1c35f87683e 172.16.104.57:6379slots:[0-1089],[1091-5460] (5460 slots) master1 additional replica(s)
M: db1740788ce051b82014a1d461a289ec669e59e7 172.16.104.57:6389slots:[1090],[5461-6553],[10923-13828],[16014-16383] (4370 slots) master1 additional replica(s)
M: 5be790525143f1a5ba8b697095d2233536bc7e70 172.16.104.56:6379slots:[6554-10922],[13829-16013] (6554 slots) master1 additional replica(s)
M: 3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa 172.16.104.55:6389slots: (0 slots) master
redis-cli --cluster reshard 172.16.104.57:6379 -a 'Redis123'

第一步,输入迁移多少个 slot。

How many slots do you want to move (from 1 to 16384)? 4096

第二步,输入迁移 slot 的目标节点的 ID。

What is the receiving node ID? 3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa

第三步,选择从哪几个节点作为源端进行迁移,可以输入 all 表示从节点中均分,也可以指定节点 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

接下来就输入 yes 确认迁移即可,然后使用 check 命令检查一下。

redis-cli --cluster check 172.16.104.57:6379 -a 'Redis123'
172.16.104.57:6379 (603450ca...) -> 0 keys | 4096 slots | 1 slaves.
172.16.104.57:6389 (db174078...) -> 0 keys | 4078 slots | 1 slaves.
172.16.104.56:6379 (5be79052...) -> 0 keys | 4114 slots | 1 slaves.
172.16.104.55:6389 (3a0d53c0...) -> 0 keys | 4096 slots | 0 slaves.
172.16.104.55:6379 (9d37453a...) -> 0 keys | 0 slots | 0 slaves.
[OK] 0 keys in 5 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 172.16.104.57:6379)
M: 603450cae36e4d2f43b5ba98da52f1c35f87683e 172.16.104.57:6379slots:[1365-5460] (4096 slots) master1 additional replica(s)
M: db1740788ce051b82014a1d461a289ec669e59e7 172.16.104.57:6389slots:[6552-6553],[8194-8993],[10923-13828],[16014-16383] (4078 slots) master1 additional replica(s)
M: 5be790525143f1a5ba8b697095d2233536bc7e70 172.16.104.56:6379slots:[8994-10922],[13829-16013] (4114 slots) master1 additional replica(s)
M: 3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa 172.16.104.55:6389slots:[0-1364],[5461-6551],[6554-8193] (4096 slots) master
S: 8a960375d75e19299b712982a1c178a15b86bfc2 172.16.104.56:6399slots: (0 slots) slavereplicates 603450cae36e4d2f43b5ba98da52f1c35f87683e
S: ead3184f5323fc8f0f8ba6f42b122b10af058388 172.16.104.57:6399slots: (0 slots) slavereplicates 5be790525143f1a5ba8b697095d2233536bc7e70
M: 9d37453a597f2cc4d8d4d4f788c513a82ea89c59 172.16.104.55:6379slots: (0 slots) master
S: d0fb82c46f800ac06bb2c8533fefa8141a1dcdd2 172.16.104.56:6389slots: (0 slots) slavereplicates db1740788ce051b82014a1d461a289ec669e59e7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

发现还有一个 172.16.104.55:6379 的节点,没有分配 slot 也没有作为一个备库,刚刚加入了两个节点,把 slot 分配给其中一个新主节点后,还需要手动将 172.16.104.55:6379 节点,指定为新主节点的备节点,最终组成 4 节点双副本。

连接到 172.16.104.55:6379 输入指令,节点 ID 填写的是刚才新分配 slot 的节点。

172.16.104.55:6379> cluster replicate 3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa
OK
172.16.104.55:6379> cluster nodes
3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa 172.16.104.55:6389@16389 master - 0 1720166382000 12 connected 0-1364 5461-6551 6554-8193
8a960375d75e19299b712982a1c178a15b86bfc2 172.16.104.56:6399@16399 slave 603450cae36e4d2f43b5ba98da52f1c35f87683e 0 1720166385000 8 connected
603450cae36e4d2f43b5ba98da52f1c35f87683e 172.16.104.57:6379@16379 master - 0 1720166385754 8 connected 1365-5460
9d37453a597f2cc4d8d4d4f788c513a82ea89c59 172.16.104.55:6379@16379 myself,slave 3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa 0 1720166385000 12 connected
db1740788ce051b82014a1d461a289ec669e59e7 172.16.104.57:6389@16389 master - 0 1720166384749 13 connected 6552-6553 8194-8993 10923-13828 16014-16383
5be790525143f1a5ba8b697095d2233536bc7e70 172.16.104.56:6379@16379 master - 0 1720166383000 11 connected 8994-10922 13829-16013
ead3184f5323fc8f0f8ba6f42b122b10af058388 172.16.104.57:6399@16399 slave 5be790525143f1a5ba8b697095d2233536bc7e70 0 1720166382738 11 connected
d0fb82c46f800ac06bb2c8533fefa8141a1dcdd2 172.16.104.56:6389@16389 slave db1740788ce051b82014a1d461a289ec669e59e7 0 1720166386760 13 connected

4.3 节点移除

如果是从节点,可以直接使用下方命令移除:

redis-cli -a 'Redis123'  --cluster del-node 172.16.104.55:6379 9d37453a597f2cc4d8d4d4f788c513a82ea89c59# 输出
>>> Removing node 9d37453a597f2cc4d8d4d4f788c513a82ea89c59 from cluster 172.16.104.55:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

如果要移除主节点,需要先将 slot 迁移到其他节点上:

redis-cli --cluster reshard 172.16.104.57:6379 -a 'Redis123'

在这里插入图片描述
接下来的步骤就和 4.2 迁移的步骤相同,将 172.16.104.55:6389 节点的 slot 打散分配给其他节点后,该节点的状态变为 slave。

ead3184f5323fc8f0f8ba6f42b122b10af058388 172.16.104.57:6399@16399 slave 5be790525143f1a5ba8b697095d2233536bc7e70 0 1720167846000 16 connected
3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa 172.16.104.55:6389@16389 slave 5be790525143f1a5ba8b697095d2233536bc7e70 0 1720167848000 16 connected
5be790525143f1a5ba8b697095d2233536bc7e70 172.16.104.56:6379@16379 myself,master - 0 1720167847000 16 connected 6763-8193 8994-10922 13829-16013
db1740788ce051b82014a1d461a289ec669e59e7 172.16.104.57:6389@16389 master - 0 1720167847743 15 connected 5461-6762 8194-8993 10923-13828 16014-16383
8a960375d75e19299b712982a1c178a15b86bfc2 172.16.104.56:6399@16399 slave 603450cae36e4d2f43b5ba98da52f1c35f87683e 0 1720167848748 14 connected
603450cae36e4d2f43b5ba98da52f1c35f87683e 172.16.104.57:6379@16379 master - 0 1720167845000 14 connected 0-5460
d0fb82c46f800ac06bb2c8533fefa8141a1dcdd2 172.16.104.56:6389@16389 slave db1740788ce051b82014a1d461a289ec669e59e7 0 1720167849753 15 connected

使用命令移除节点:

[root@172-16-104-56 redis]# redis-cli -a 'Redis123'  --cluster del-node 172.16.104.55:6389 3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa# 输出:
>>> Removing node 3a0d53c0ab6e2a0f6f53ea2036dc1fe33b58d9aa from cluster 172.16.104.55:6389
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node. 

check 一下集群,已变成 3 节点双副本的状态。

172.16.104.57:6379 (603450ca...) -> 0 keys | 5461 slots | 1 slaves.
172.16.104.57:6389 (db174078...) -> 0 keys | 5378 slots | 1 slaves.
172.16.104.56:6379 (5be79052...) -> 0 keys | 5545 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 172.16.104.57:6379)
M: 603450cae36e4d2f43b5ba98da52f1c35f87683e 172.16.104.57:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: db1740788ce051b82014a1d461a289ec669e59e7 172.16.104.57:6389slots:[5461-6762],[8194-8993],[10923-13828],[16014-16383] (5378 slots) master1 additional replica(s)
M: 5be790525143f1a5ba8b697095d2233536bc7e70 172.16.104.56:6379slots:[6763-8193],[8994-10922],[13829-16013] (5545 slots) master1 additional replica(s)
S: 8a960375d75e19299b712982a1c178a15b86bfc2 172.16.104.56:6399slots: (0 slots) slavereplicates 603450cae36e4d2f43b5ba98da52f1c35f87683e
S: ead3184f5323fc8f0f8ba6f42b122b10af058388 172.16.104.57:6399slots: (0 slots) slavereplicates 5be790525143f1a5ba8b697095d2233536bc7e70
S: d0fb82c46f800ac06bb2c8533fefa8141a1dcdd2 172.16.104.56:6389slots: (0 slots) slavereplicates db1740788ce051b82014a1d461a289ec669e59e7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

5. 集群运维

5.1 集群倾斜

集群倾斜是笔者维护 Redis 集群经常遇到的问题,无论是自建还是云 Redis 服务,集群倾斜指不同节点之间数据量和请求量出现明显差异,这种情况将加大负载均衡和开发运维的难度。本小节介绍集群倾斜的常见原因。

  1. 槽分配不均衡,如果槽分配不均衡,非常容易造成的数据量不均衡的问题,可以使用下方命令查看集群槽的分配情况。

    redis-cli --cluster check 172.16.104.57:6379 -a 'Redis123'
    
  2. 大 key 造成的,比如一个 list 或 hash 中存储了几十万个元素,造成单个 key 过大,集群数据量产生倾斜,可使用下方工具查看大 key。

    redis-cli --bigkeys -a 'Redis123'
    
  3. 不同的槽位对应的数据量较大,键通过CRC16哈希函数映射到槽上,正常情况下槽内键数量会相对均匀。但当大量使用hash_tag时,会产生不同的键映射到同一个槽的情况。在 key 名字上加一个 {} 在 crc16 计算的时候,只会使用 {} 中的内容。

    127.0.0.1:6379> set user:other{1} aaa
    OK
    127.0.0.1:6379> set user:other{1} aa
    OK
    127.0.0.1:6379> set user:age{1} aa
    OK
    127.0.0.1:6379> keys *
    1) "user:age{1}"
    2) "user:other{1}"
    3) "user:info{1}"
    
  4. 内存相关配置不一致。内存相关配置指 hash-max-zip-list-value、set-max-intset-entries 等压缩数据结构配置。当集群大量使用hash、set 等数据结构时,如果内存压缩数据结构配置不一致,极端情况下会相差数倍的内存,从而造成节点内存量倾斜

云上一般不会出现第四种情况,大部分都是由于大 key 和 hash_tag 造成的。

5.2 手动切换

Redis Cluster 中的 master 节点都有一个 slave 节点,用于故障切换。Redis 还提供了手动切换的功能,可用于一些主节点迁移场景。只需要在对应的备节点执行 cluster failover 命令,就可以完成切换。

127.0.0.1:6389> cluster nodes
# 这里省去了其他节点的信息
d0fb82c46f800ac06bb2c8533fefa8141a1dcdd2 172.16.104.56:6389@16389 myself,slave db1740788ce051b82014a1d461a289ec669e59e7 0 1720511649000 15 connected
127.0.0.1:6389> cluster failover
OK
127.0.0.1:6389> cluster nodes
# 当前节点,已从 slave 变更为 master
d0fb82c46f800ac06bb2c8533fefa8141a1dcdd2 172.16.104.56:6389@16389 myself,master - 0 1720511671000 17 connected 5461-6762 8194-8993 10923-13828 16014-16383

相关文章:

Redis 集群模式

文章目录 前言1. Redis Cluster 搭建1.1 准备节点1.2 准备配置文件1.3 查看集群状态 2. 客户端访问3. Python 连接集群4. Redis 集群维护4.1 新增节点4.2 手动分配 slot4.3 节点移除 5. 集群运维5.1 集群倾斜5.2 手动切换 前言 Redis 3.0 提供了 Redis Cluster 架构&#xff0…...

如何快速实现一个无缝轮播效果

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 需求简介 轮播图是我们前端开发中的一个常见需求,在项目开发中,我们可以使用element、ant等UI库实现。某些场景,为了一个简单的功能安装一…...

kubernetes集群证书过期问题解决

kubernetes集群证书过期问题解决 问题描述检查证书是否过期更新证书master节点操作node节点操作 问题描述 K8S 各个组件需要与 api-server 进行通信,通信使用的证书都存放在 /etc/kubernetes/pki 路径下,kubeadm 生成的证书大部分默认有效期为 1 年&…...

PHP框架详解-symfony框架

Symfony是一个使用PHP语言编写的开源Web应用框架,旨在加快开发进程,替代重复编码工作,并帮助构建可维护和可扩展的应用程序。以下是对Symfony框架的详细解析: 一、框架概述 Symfony提供了一组可重用的组件和一个标准化、可扩展的…...

Linux--线程的控制

目录 0.前言 1.pthread库 2.关于控制线程的接口 2.1.创建线程(pthread_create) 2.2.线程等待(pthread_join) 代码示例1: ​编辑 ***一些问题*** 2. 3.创建多线程 3.线程的终止 (pthread_exit /…...

大数据------JavaWeb------会话跟踪技术(Cookie、Session)(完整知识点汇总)

会话跟踪技术(Cookie&Session) 注意: HTTP协议是无状态 的,即每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内的数据共享 会话 当用户打开浏览器&am…...

crossJoin笛卡尔积

crossJoin笛卡尔积 在Spark中,crossJoin方法用于执行两个数据集之间的笛卡尔积操作。具体来说,如果有两个数据集(DataFrame或Dataset),调用crossJoin方法将会生成一个新的数据集,其中包含两个原始数据集中所…...

Java客户端调用SOAP方式的WebService服务实现方式分析

简介 在多系统交互中,有时候需要以Java作为客户端来调用SOAP方式的WebService服务,本文通过分析不同的调用方式,以Demo的形式,帮助读者在生产实践中选择合适的调用方式。 本文JDK环境为JDK17。 结论 推荐使用Axis2或者Jaxws&#…...

华为机试真题--字符串序列判定

题目描述: 输入两个字符串S和L,都只包含英文小写字母,其中S长度<=100,L长度<=500000,请判定S是否是L的有效字串。 判定规则: S中的每个字符在L中都能找到(可以不连续),且S在L中字符的前后顺序与S中顺序要保持一致。(例如,S="ace"是L="abcd…...

Linux内核 -- 虚拟化之virtqueue结构

Linux Kernel中的Virtqueue Virtqueue是Linux Kernel中用于实现Virtio设备的一个关键数据结构。Virtio是一种虚拟I/O设备标准&#xff0c;旨在简化虚拟化环境中虚拟设备与虚拟机之间的通信。Virtqueue则是实现这种通信的核心机制。以下是Virtqueue的一些关键点&#xff1a; V…...

【pytorch18】Logistic Regression

回忆线性回归 for continuous:y xwbfor probability output:yσ(xwb) σ:sigmoid or logistic 线性回归是简单的线性模型&#xff0c;输入是x&#xff0c;网络参数是w和b&#xff0c;输出是连续的y的值 如何把它转化为分类问题?加了sigmoid函数&#xff0c;输出的值不再是…...

PostgreSQL的使用

PostgreSQL的使用 1.首先&#xff0c;使用docker进行安装pgvector数据库&#xff0c;具体的安装步骤可以查看我之前发的博文。 2.docker exec -it pgvector /bin/bash 进入docker容器内部&#xff0c;操作数据库&#xff0c;上述命令是以交互式命令进入了容器的内部&#xf…...

python 高级技巧 0706

python 33个高级用法技巧 列表推导式 简化了基于现有列表创建新列表的过程。 squares [x**2 for x in range(10)] print(squares)[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]字典推导式 用简洁的方式创建字典。 square_dict {x: x**2 for x in range(10)} print(square_dict){0…...

面试经典 106. 从中序与后序遍历序列构造二叉树

最近小胖开始找工作了&#xff0c;又来刷苦逼的算法了 555 废话不多说&#xff0c;看这一题&#xff0c;上链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envTypestudy-plan-v2&envIdtop-inte…...

如何解决群晖Docker注册表查询失败/无法拉取镜像等问题

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 问题概述 📒📒 解决方案 📒🔖 方法一🔖 方法二🔖 方法三⚓️ 相关链接 🚓️📖 介绍 📖 在群晖(Synology)NAS设备上使用Docker时,我们可能会遇到查询Docker注册表失败,无法拉取Docker镜像的问题。这种情况…...

【Scrapy】 深入了解 Scrapy 中间件中的 process_spider_input 方法

准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 &#x1f3b5; 陈慧娴《傻女》 Scrapy 是…...

数据库MySQL---基础篇

存储和管理数据的仓库 MySQL概述 数据库相关概念 数据库&#xff08;DataBase&#xff09;---数据存储的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统&#xff08;DBMS&#xff09;-----操纵和管理数据库的大型软件 SQL----操作关系型数据库的编程语言&#xff…...

欧姆龙安全PLC及周边产品要点指南

电气安全、自动化设备作业安全&#xff0c;向来是非常非常之重要的&#xff01;越来越多的客户在规划新产线、改造既有产线的过程中&#xff0c;明确要求设计方和施工方将安全考虑进整体方案中进行考虑和报价&#xff01;作为一名自动化电气工程师&#xff0c;尤其是高级工程师…...

tableau气泡图与词云图绘制 - 8

气泡图及词云图绘制 1. 气泡图绘制1.1 选择相关属性字段1.2 选择气泡图1.3 设置颜色1.4 设置标签1.5 设置单位 2. 气泡图绘制 - 22.1 类别筛选2.2 页面年份获取2.3 行列获取2.4 历史轨迹显示 3. 词云图绘制3.1 筛选器3.2 选择相关属性3.3 选择气泡图3.4 设置类型颜色3.5 设置形…...

C语言 找出一个二维数组中的鞍点

找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 #include <stdio.h>int main() {int matrix[4][4] {{10, 17, 13, 28},{21, 14, 16, 40},{30, 42, 23, 39},{24, 11, 19, 17}};int n 4, m 4;int found 0;for (int i 0; i …...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...