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