《Redis高可用架構(gòu)的應(yīng)用及改進(jìn)經(jīng)驗(yàn)談》要點(diǎn):
本文介紹了Redis高可用架構(gòu)的應(yīng)用及改進(jìn)經(jīng)驗(yàn)談,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
作者介紹
首先部署Redis主從復(fù)制集群,比如1主3從;然后部署3個(gè)Sentinel節(jié)點(diǎn).
為了安全起見(jiàn),Sentinel節(jié)點(diǎn)分別部署在不同的服務(wù)器上,Redis主從節(jié)點(diǎn)分別部署在不同服務(wù)器上.具體部署步驟,這里不再贅述.
說(shuō)明:如果Sentinel上層使用了LVS,那么配置里改為VIP.
應(yīng)用程序通過(guò)和Sentinel交互,獲取到Redis主庫(kù)信息,然后再處理讀寫(xiě)請(qǐng)求.其中,由于Sentinel帶來(lái)的性能開(kāi)銷很小,可以忽略.
需要注意的地方:
可以從Redis的info信息里查看,如下:
10.11.11.13:6379> info clients
# Clients
connected_clients:150
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
如果連接無(wú)法復(fù)用,connected_clients會(huì)飆升到上千,甚至導(dǎo)致Redis服務(wù)異常,停止處理請(qǐng)求.如果驅(qū)動(dòng)不支持連接池,需要選擇新驅(qū)動(dòng),或者二次開(kāi)發(fā)驅(qū)動(dòng).
使用以上HA架構(gòu),細(xì)心的朋友會(huì)發(fā)現(xiàn)這樣一個(gè)問(wèn)題.如果Redis主庫(kù)宕機(jī),Redis配置會(huì)發(fā)生改變,如下:
某些參數(shù)的值會(huì)自動(dòng)被加上””,比如密碼參數(shù).一般禁止使用類似””作為密碼的一部分.Redis密碼參數(shù)一旦被加上””,在運(yùn)維和使用過(guò)程中,就會(huì)存在比較大的風(fēng)險(xiǎn)和麻煩.
分析Redis源碼,以下情況會(huì)觸發(fā)配置修改:
1)Master故障切換
2)新加入Sentinel
3)執(zhí)行 config rewrite
4)執(zhí)行 sentinel flushconfig
5)執(zhí)行 sentinel remove
6)Sentinel新加入Redis master節(jié)點(diǎn)
針對(duì)該問(wèn)題,常用解決方法:
為Redis密碼加上監(jiān)控,一旦變更,報(bào)警后人工處理.這是最簡(jiǎn)單也是不可靠的方法.
開(kāi)發(fā)一個(gè)腳本,周期性監(jiān)控Redis密碼,一旦發(fā)現(xiàn)變更后,自動(dòng)改回.這種方法,增加了運(yùn)維成本和風(fēng)險(xiǎn),也無(wú)法100%保證解決問(wèn)題.
修改源碼,從根本上解決這個(gè)問(wèn)題,方法如下:
src/config.c
修改函數(shù)int rewriteConfig(char *path)
注釋如下兩行:
rewriteConfigStringOption(state,”masterauth”,server.masterauth,NULL);
rewriteConfigStringOption(state,”requirepass”,server.requirepass,NULL);
修改后重新編譯Redis源碼.可以通過(guò)執(zhí)行config rewrite命令驗(yàn)證,Redis密碼參數(shù)不會(huì)備自動(dòng)修改了.
由于代碼改動(dòng)很小,沒(méi)有風(fēng)險(xiǎn)點(diǎn),筆者在線上已經(jīng)使用一年多時(shí)間,Redis服務(wù)很穩(wěn)定,沒(méi)有問(wèn)題.
這是修改過(guò)的Redis源碼,已上傳到GitHub:
或者直接下載:
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4244.html