第23期 使用redis-cli连接redis集群批量执

之前我给大家介绍了《使用使用redis-cli批量执行命令》 https://blog.itpub.net/12798004/viewspace-3054147/

当时是redis-cli连接的是单机版的redis,但是在很多企业中目前使用的都是集群模式。Redis Cluster,采用了去中心化的多主多从架构,以提高数据的可用性和伸缩性。这一架构使得Redis Cluster能够在保持高性能的同时,支持更大规模的数据存储和管理。

Redis Cluster 使用哈希槽(hash slot)机制来分配数据。假设我们有三个主节点:A、B、C,它们可以部署在同一台机器的不同端口上,或分布在三台不同的服务器上。在这种设置下,16384个哈希槽将被如下分配:


节点A负责管理0至5460号槽;

节点B负责管理5461至10922号槽;

节点C负责管理10923至16383号槽。


1.数据的保存和获取

存入数据:例如,存储一个键值对,键名为“key”,其哈希值按照 CRC16(‘key’) % 16384 = 6782 计算。根据这个哈希槽号,数据将被存储在节点B上。

获取数据:无论连接哪个节点(A、B、C),获取键名为“key”的数据时,都会根据同样的哈希算法路由到节点B上提取数据。


2.新增或删除主节点

新增节点:假设新增一个节点D,Redis Cluster 会将部分哈希槽从其他节点迁移至D节点。这可能导致哈希槽分布如下调整:

节点A:1365-5460

节点B:6827-10922

节点C:12288-16383

节点D:0-1364,5461-6826,10923-12287

删除节点:删除节点时,其管理的哈希槽会被迁移到其他节点上。迁移完成后,该节点即可被安全移除。

案例演示:

1.以单机模式连接集群时:

redis-cli   -h 20.12.47.43 -p 6379 -a 'password'方式连接redis,如果连接的是单机模式,在执行命令时是没有问题的。

但是连接集群模式,执行命令时 redis-cli连接到redis的节点会检查自己在clusterState.slots数组中的项i,判断键所在的槽是否由自己负责。

如果我们使用单机模式的redis-cli客户端,MOVED错误会直接打印出来,因为单机模式的客户端不知道MOVED错误的作用,不会进行转向。可能会报错,原因是在计算槽位时,可能是在别的master下管理的槽位:

[test@test ~]$ redis-cli  -h 11.11.47.44 -p 6379 -a 'password'

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

11.11.47.44:6379> set test1 123456

(error) MOVED 4768 11.11.47.45:6379

11.11.47.44:6379> 

当我们在 11.11.47.44上执行set test1命令时,提示我们已经连接到 11.11.47.45 :6379去执行。也就说明 计算槽位在 11.11.47.45管理的。所以需要以集群模式的方式连接。

2.以集群模式连接集群时:

以集群模式连接时,只需要添加一个-c的参数。

集群模式下的redis-cli客户端在接收到MOVED错误的时候,不会打印出MOVED错误,而是直接根据MOVED错误的信息自动转向,并打印出转向信息。

[itadmin@dlidcatsapp3 ~]$ /ats/redis/bin/redis-cli  -c -h 11.11.47.44 -p 6379 -a 'passwrd'

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

11.11.47.44:6379> set test1 123456

-> Redirected to slot [4768] located at 11.11.47.45:6379

OK

11.11.47.45:6379> 

3.执行批量命令如下:

3.1 准备执行的命令

vi redis.txt

set startDisableDate1 20241225010000

set endDisableDate1 20241225230000

set startDisableDate2 20241225010000

set endDisableDate2 20241225230000

set startDisableDate3 20241225010000

set endDisableDate3 20241225230000

3.2执行命令

 cat /tmp/redis.txt | redis-cli  -c -h 11.11.47.44 -p 6379 -a 'password'

请使用浏览器的分享功能分享到微信等