簡述幾個我們對Redis 7開源社群所做的貢獻

2023-11-16 18:00:23

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