Redis 7 已經(jīng)于2022年4月28號(hào)正式發(fā)布氧苍,其中包括了將近50個(gè)新的命令旁理,增加了許多新的特性妆偏,并且在整個(gè)Redis 6到Redis 7的開發(fā)過程中,我也對(duì)Redis 的開源社區(qū)貢獻(xiàn)了一些微薄的力量古拴。在這篇文章中箩帚,我來給大家介紹幾個(gè)自己親身參與的幾個(gè)Redis 7 功能,并希望能夠?yàn)镽edis 8做出更多的貢獻(xiàn)黄痪。
在這篇文章中紧帕,我將介紹以下的內(nèi)容:
在redis.conf 配置文件中新增加的參數(shù):cluster-port
在sentinel.conf配置文件中新增加的參數(shù):master-reboot-down-after-period
在sentinel中新增加的命令:sentinel debug
在集群中新增加的命令:cluster addslotsrange 和cluster delslotsrange
對(duì)info命令的增強(qiáng)
修復(fù)sentinel更新密碼的一個(gè)隱患
增加了client list 命令的顯示內(nèi)容
在redis.conf配置文件中增加了一個(gè)新的參數(shù)cluster-port 用于為處于集群模式下的節(jié)點(diǎn)使用
我們知道,當(dāng)一個(gè)節(jié)點(diǎn)處于集群模式中桅打,它至少需要有2個(gè)TCP連接端口是嗜,一個(gè)負(fù)責(zé)與客戶端進(jìn)行連接轻纪,我們通常叫做命令端口,例如6379叠纷;而另外一個(gè)TCP的連接端口刻帚,我們可以叫集群端口,是負(fù)責(zé)當(dāng)前節(jié)點(diǎn)與集群中其他節(jié)點(diǎn)進(jìn)行故障檢測(cè)涩嚣,配置更新等其他功能崇众,這個(gè)端口的數(shù)值在Redis 7之前都是命令端口+10000. 這種設(shè)置方式就完全限制的客戶端對(duì)集群端口的配置,如果當(dāng)前節(jié)點(diǎn)的這個(gè)端口值被其他服務(wù)所占用航厚,那么當(dāng)前節(jié)點(diǎn)就會(huì)啟動(dòng)失敗顷歌。
在Redis 7中,我們?cè)黾恿薱luster-port這個(gè)參數(shù)幔睬,可以允許客戶自己定義集群端口眯漩,給了客戶更大的自由度,使用格式是cluster-port 0麻顶。
如果客戶在配置文件中將這個(gè)端口設(shè)置為0赦抖,那么當(dāng)前節(jié)點(diǎn)的集群端口依然等于命令端口+10000;如果客戶將這個(gè)端口設(shè)置為大于0辅肾,那么當(dāng)前節(jié)點(diǎn)在啟動(dòng)時(shí)將會(huì)將集群端口設(shè)置為它的值队萤。
在sentinel.conf配置文件中新增加了一個(gè)參數(shù):master-reboot-down-after-period
它的正確使用格式是:SENTINEL master-reboot-down-after-period mymaster 0
下面來闡述一下增加這個(gè)參數(shù)的原因:
在增加這個(gè)參數(shù)之前,Sentinel節(jié)點(diǎn)是通過在sentinel.conf設(shè)置的down-after-milliseconds參數(shù)來向主節(jié)點(diǎn)矫钓,備節(jié)點(diǎn)和其他sentinel節(jié)點(diǎn)發(fā)送PING請(qǐng)求來確認(rèn)發(fā)送的目的節(jié)點(diǎn)是否正常工作要尔。在sentinel.conf或者用戶自定義的sentinel配置文件中,如果down-after-milliseconds的設(shè)置大于或者等于1000新娜,那么sentinel發(fā)送頻率是1秒赵辕,如果down-after-milliseconds的設(shè)置小于1000,那么sentinel節(jié)點(diǎn)發(fā)送PING請(qǐng)求的頻率是down-after-milliseconds值(毫秒數(shù))概龄。
但是當(dāng)主節(jié)點(diǎn)在非常短的時(shí)間內(nèi)發(fā)生了重啟还惠,例如0.01秒,那么sentinel節(jié)點(diǎn)會(huì)收到一個(gè)”reboot”信號(hào)旁钧。在引入?yún)?shù)Master-reboot-down-after-period之前吸重,sentinel是不會(huì)發(fā)生主備切換的,那么如果主節(jié)點(diǎn)有很大的數(shù)據(jù)要從RDB文件中讀取到內(nèi)存中歪今,這個(gè)時(shí)候主節(jié)點(diǎn)是處于LOADING狀態(tài),是不能接受外部數(shù)據(jù)響應(yīng)的颜矿,會(huì)導(dǎo)致客戶端認(rèn)為主節(jié)點(diǎn)unavailable.
在Redis 7中寄猩,如果用戶在sentinel的配置文件中將master-reboot-down-after-period設(shè)置為大于0的數(shù),那么當(dāng)sentinel檢測(cè)到第一次收到的“reboot”的時(shí)間與當(dāng)前時(shí)間間隔大于master-reboot-down-after-period的毫秒數(shù)骑疆,并且主節(jié)點(diǎn)依然處于LOADING狀態(tài)田篇,那么sentinel將開始進(jìn)入主備切換狀態(tài)替废。這樣就大大地降低了數(shù)據(jù)丟失和主節(jié)點(diǎn)處于Unavailable 的可能性。
在sentinel中新增加的命令:sentinel debug
為了方便Redis的開發(fā)人員對(duì)sentinel的部分參數(shù)進(jìn)行調(diào)試或者在寫測(cè)試用例的時(shí)候更改一些參數(shù)泊柬,在Redis 7的Sentinel的模式中椎镣,增加了一個(gè)新的命令:sentinel debug
當(dāng)用戶在客戶端只運(yùn)行sentinel debug命令時(shí)候,它會(huì)顯示當(dāng)前狀態(tài)下兽赁,在Redis的sentinel部分可以調(diào)試的13個(gè)參數(shù)的具體信息状答,例子如下:
127.0.0.1:26379> sentinel debug
- "INFO-PERIOD"
- "10000"
- "PING-PERIOD"
- "1000"
- "ASK-PERIOD"
- "1000"
- "PUBLISH-PERIOD"
- "2000"
- "DEFAULT-DOWN-AFTER"
- "30000"
- "DEFAULT-FAILOVER-TIMEOUT"
- "180000"
- "TILT-TRIGGER"
- "2000"
- "TILT-PERIOD"
- "30000"
- "SLAVE-RECONF-TIMEOUT"
- "10000"
- "MIN-LINK-RECONNECT-PERIOD"
- "15000"
- "ELECTION-TIMEOUT"
- "10000"
- "SCRIPT-MAX-RUNTIME"
- "60000"
- "SCRIPT-RETRY-DELAY"
- "30000"
當(dāng)用戶想要更改一個(gè)或者多個(gè)參數(shù)的時(shí)候,可以運(yùn)行如下命令:
Sentinel debug parameter value [parameter value…]
正像上面的例子中信息一樣刀崖,通過這個(gè)命令惊科,用戶可以更改下面13個(gè)參數(shù)的信息:
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) 中的一個(gè)節(jié)點(diǎn)增加一些槽或者從一個(gè)節(jié)點(diǎn)中刪除一些槽亮钦,那么唯一的選擇就是cluster addslots slot [slot…] 或者cluster delslots slot [slot…]馆截。這兩個(gè)命令的缺點(diǎn)在于如果用戶想要一次性操作大量連續(xù)的槽,那么需要輸入大量的參數(shù)蜂莉。例如下面的例子蜡娶,如果想要把1到5000 的槽值賦予一個(gè)節(jié)點(diǎn),那么用戶需要運(yùn)行如下的命令:
Cluster addslots 1 2 3 …… 4999 5000
在cluster addslots之后需要傳遞5000個(gè)參數(shù)
那么在新增的cluster addslotsrange命令中映穗,用戶只需要傳遞2個(gè)參數(shù):開始的槽值和結(jié)束的槽值翎蹈,例子如下:
cluster addslotsrange 1 5000.
同理,cluster delslotsrange命令也是對(duì)已有的cluster delslots進(jìn)行了增強(qiáng)男公,當(dāng)用戶想要?jiǎng)h除大量的連續(xù)槽值的時(shí)候荤堪,也只需要傳遞2個(gè)參數(shù)即可
這兩個(gè)新命令的具體格式如下:
CLUSTER DELSLOTSRANGE startslot endslot [startslot endslot...]
CLUSTER ADDSLOTSRANGE startslot endslot [startslot endslot...]
更加具體的使用和注意事項(xiàng),可以參考redis的鏈接:
https://redis.io/commands/cluster-addslotsrange/
https://redis.io/commands/cluster-delslotsrange/
對(duì)Info命令的增強(qiáng)
在客戶端中執(zhí)行info命令枢赔,在Redis 7中澄阳,info命令可以接受多于一個(gè)section的參數(shù),例如
INFO Server Replication
INFO CPU Memory
INFO default commandstats all
具體關(guān)于info命令的使用踏拜,可以參考鏈接:https://redis.io/commands/info/
修復(fù)sentinel更新密碼的一個(gè)隱患
增加了當(dāng)用戶在Sentinel的客戶端使用sentinel set mastername auth-pass newpassword 命令時(shí)的安全性
在Redis 7.0 之前的版本中碎赢,如果用戶在Sentinel的客戶端執(zhí)行如下命令時(shí):
127.0.0.1:17379> sentinel set mymaster auth-pass THIS_IS_PASSWORD
OK
在sentinel的服務(wù)器端,用戶會(huì)看到一個(gè)log:
22720:X 05 Oct 2021 12:43:16.248 # +set master mymaster 127.0.0.1 6379 auth-pass THIS_IS_PASSWORD
我們可以看到速梗,新設(shè)置的密碼被打印到客戶端或者可以被直接存儲(chǔ)到日志文件中肮塞,這個(gè)非常不安全的。在Redis 7中姻锁,這個(gè)問題被修復(fù)了枕赵。如果客戶執(zhí)行同樣的命令,那么客戶會(huì)看到類似下面的日志:
22720:X 05 Oct 2021 12:43:16.248 # +set master mymaster 127.0.0.1 6379 auth-pass ******
增加了client list命令的顯示內(nèi)容
用戶可以通過client list命令查看當(dāng)前的Redis支持的RESP協(xié)議的版本
RESP全稱是Redis serialization protocol. 客戶端可以通過RESP協(xié)議與Redis 服務(wù)器進(jìn)行溝通位隶。在最新的Redis 7版本中拷窜,客戶端可以通過調(diào)用client list這個(gè)命令查看當(dāng)前支持的RESP協(xié)議的版本,具體的例子如下:
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
這篇文章就介紹到這里了,下一篇文章會(huì)介紹Redis 7新增的functions的幾個(gè)命令篮昧,謝謝大家赋荆!