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