簡述幾個我們對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個參數的具體信息,例子如下:

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的幾個命令,謝謝大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章