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


    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个参数的具体信息,例子如下:

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

    OK

    在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 list

    id=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的几个命令,谢谢大家!

  • 相关阅读:
    11年前写的程序:Java 中闭包运用,实现方法传递
    Pikachu靶场——XXE 漏洞
    Nginx__基础入门篇
    交通物流模型 | Python实现基于张量分解的交通流量时空模式挖掘(出租车车载GPS数据、公交卡刷卡数据、POI的分布数据)
    Oracle 19C 静默安装 GoldenGate
    学习ASP.NET Core Blazor编程系列二十七——JWT登录(1)
    多重嵌套循环
    嵌入式分享合集96
    网站优化Preload进行预加载的使用方法
    初识《list》及手搓模拟《list》
  • 原文地址:https://blog.csdn.net/middleware2018/article/details/134446439