简述几个我们对Redis 7开源社区所做的贡献

发布时间 2023-11-16 17:15:50作者: 中间件小哥

Redis 7 已经于2022年4月28号正式发布,其中包括了将近50个新的命令,增加了许多新的特性,并且在整个Redis 6到Redis 7的开发过程中,我也对Redis 的开源社区贡献了一些微薄的力量。在这篇文章中,我来给大家介绍几个自己亲身参与的几个Redis 7 功能,并希望能够为Redis 8做出更多的贡献。

在这篇文章中,我将介绍以下的内容:

1.      在redis.conf 配置文件中新增加的参数:cluster-port

2.      在sentinel.conf配置文件中新增加的参数:master-reboot-down-after-period

3.      在sentinel中新增加的命令:sentinel debug

4.      在集群中新增加的命令:cluster addslotsrange 和cluster delslotsrange

5.      对info命令的增强

6.      修复sentinel更新密码的一个隐患

7.      增加了client list 命令的显示内容

 在redis.conf配置文件中增加了一个新的参数cluster-port 用于为处于集群模式下的节点使用        

我们知道,当一个节点处于集群模式中,它至少需要有2个TCP连接端口,一个负责与客户端进行连接,我们通常叫做命令端口,例如6379;而另外一个TCP的连接端口,我们可以叫集群端口,是负责当前节点与集群中其他节点进行故障检测,配置更新等其他功能,这个端口的数值在Redis 7之前都是命令端口+10000. 这种设置方式就完全限制的客户端对集群端口的配置,如果当前节点的这个端口值被其他服务所占用,那么当前节点就会启动失败。在Redis 7中,我们增加了cluster-port这个参数,可以允许客户自己定义集群端口,给了客户更大的自由度,使用格式是cluster-port 0。

如果客户在配置文件中将这个端口设置为0,那么当前节点的集群端口依然等于命令端口+10000;如果客户将这个端口设置为大于0,那么当前节点在启动时将会将集群端口设置为它的值。

在sentinel.conf配置文件中新增加了一个参数:master-reboot-down-after-period      

它的正确使用格式是:SENTINEL master-reboot-down-after-period mymaster 0下面来阐述一下增加这个参数的原因:在增加这个参数之前,Sentinel节点是通过在sentinel.conf设置的down-after-milliseconds参数来向主节点,备节点和其他sentinel节点发送PING请求来确认发送的目的节点是否正常工作。在sentinel.conf或者用户自定义的sentinel配置文件中,如果down-after-milliseconds的设置大于或者等于1000,那么sentinel发送频率是1秒,如果down-after-milliseconds的设置小于1000,那么sentinel节点发送PING请求的频率是down-after-milliseconds值(毫秒数)。但是当主节点在非常短的时间内发生了重启,例如0.01秒,那么sentinel节点会收到一个”reboot”信号。在引入参数Master-reboot-down-after-period之前,sentinel是不会发生主备切换的,那么如果主节点有很大的数据要从RDB文件中读取到内存中,这个时候主节点是处于LOADING状态,是不能接受外部数据响应的,会导致客户端认为主节点unavailable.

在Redis 7中,如果用户在sentinel的配置文件中将master-reboot-down-after-period设置为大于0的数,那么当sentinel检测到第一次收到的“reboot”的时间与当前时间间隔大于master-reboot-down-after-period的毫秒数,并且主节点依然处于LOADING状态,那么sentinel将开始进入主备切换状态。这样就大大地降低了数据丢失和主节点处于Unavailable 的可能性。

在sentinel中新增加的命令:sentinel debug   

为了方便Redis的开发人员对sentinel的部分参数进行调试或者在写测试用例的时候更改一些参数,在Redis 7的Sentinel的模式中,增加了一个新的命令:sentinel debug当用户在客户端只运行sentinel debug命令时候,它会显示当前状态下,在Redis的sentinel部分可以调试的13个参数的具体信息,例子如下:

127.0.0.1:26379> sentinel debug
 1) "INFO-PERIOD"
 2) "10000"
 3) "PING-PERIOD"
 4) "1000"
 5) "ASK-PERIOD"
 6) "1000"
 7) "PUBLISH-PERIOD"
 8) "2000"
 9) "DEFAULT-DOWN-AFTER"
10) "30000"
11) "DEFAULT-FAILOVER-TIMEOUT"
12) "180000"
13) "TILT-TRIGGER"
14) "2000"
15) "TILT-PERIOD"
16) "30000"
17) "SLAVE-RECONF-TIMEOUT"
18) "10000"
19) "MIN-LINK-RECONNECT-PERIOD"
20) "15000"
21) "ELECTION-TIMEOUT"
22) "10000"
23) "SCRIPT-MAX-RUNTIME"
24) "60000"
25) "SCRIPT-RETRY-DELAY"
26) "30000"

当用户想要更改一个或者多个参数的时候,可以运行如下命令:

Sentinel debug parameter value [parameter value…]

正像上面的例子中信息一样,通过这个命令,用户可以更改下面13个参数的信息:

SENTINEL_INFO_PERIOD
SENTINEL_PING_PERIOD
SENTINEL_ASK_PERIOD
SENTINEL_PUBLISH_PERIOD
SENTINEL_DEFAULT_DOWN_AFTER
SENTINEL_TILT_TRIGGER
SENTINEL_TILT_PERIOD
SENTINEL_SLAVE_RECONF_TIMEOUT
SENTINEL_MIN_LINK_RECONNECT_PERIOD
SENTINEL_ELECTION_TIMEOUT
SENTINEL_SCRIPT_MAX_RUNTIME
SENTINEL_SCRIPT_RETRY_DELAY
SENTINEL_DEFAULT_FAILOVER_TIMEOUT

新增cluster addslotsrange 命令和cluster delslotsrange 命令  

在Redis 7 之前,如果用户想为集群(cluster) 中的一个节点增加一些槽或者从一个节点中删除一些槽,那么唯一的选择就是cluster addslots slot [slot…] 或者cluster delslots slot [slot…]。这两个命令的缺点在于如果用户想要一次性操作大量连续的槽,那么需要输入大量的参数。例如下面的例子,如果想要把1到5000 的槽值赋予一个节点,那么用户需要运行如下的命令:Cluster addslots 1 2 3 …… 4999 5000在cluster addslots之后需要传递5000个参数那么在新增的cluster addslotsrange命令中,用户只需要传递2个参数:开始的槽值和结束的槽值,例子如下:cluster addslotsrange 1 5000.同理,cluster delslotsrange命令也是对已有的cluster delslots进行了增强,当用户想要删除大量的连续槽值的时候,也只需要传递2个参数即可这两个新命令的具体格式如下:CLUSTER DELSLOTSRANGE startslot endslot [startslot endslot...] CLUSTER ADDSLOTSRANGE startslot endslot [startslot endslot...]更加具体的使用和注意事项,可以参考redis的链接:https://redis.io/commands/cluster-addslotsrange/

https://redis.io/commands/cluster-delslotsrange/

对Info命令的增强  

在客户端中执行info命令,在Redis 7中,info命令可以接受多于一个section的参数,例如INFO Server Replication
INFO CPU Memory
INFO default commandstats all

具体关于info命令的使用,可以参考链接:https://redis.io/commands/info/

修复sentinel更新密码的一个隐患  

增加了当用户在Sentinel的客户端使用sentinel set  mastername auth-pass newpassword 命令时的安全性在Redis 7.0 之前的版本中,如果用户在Sentinel的客户端执行如下命令时:127.0.0.1:17379> sentinel set mymaster auth-pass THIS_IS_PASSWORDOK在sentinel的服务器端,用户会看到一个log:22720:X 05 Oct 2021 12:43:16.248 # +set master mymaster 127.0.0.1 6379 auth-pass THIS_IS_PASSWORD我们可以看到,新设置的密码被打印到客户端或者可以被直接存储到日志文件中,这个非常不安全的。在Redis 7中,这个问题被修复了。如果客户执行同样的命令,那么客户会看到类似下面的日志:

22720:X 05 Oct 2021 12:43:16.248 # +set master mymaster 127.0.0.1 6379 auth-pass ******

增加了client list命令的显示内容  

用户可以通过client list命令查看当前的Redis支持的RESP协议的版本RESP全称是Redis serialization protocol. 客户端可以通过RESP协议与Redis 服务器进行沟通。在最新的Redis 7版本中,客户端可以通过调用client list这个命令查看当前支持的RESP协议的版本,具体的例子如下:127.0.0.1:6379> client listid=3 addr=127.0.0.1:48556 laddr=127.0.0.1:6379 fd=8 name= age=153 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=20448 argv-mem=10 multi-mem=0 rbs=1024 rbp=0 obl=0 oll=0 omem=0 tot-mem=22298 events=r cmd=client|list user=default redir=-1 resp=2这篇文章就介绍到这里了,下一篇文章会介绍Redis 7新增的functions的几个命令,谢谢大家!