您好,登錄后才能下訂單哦!
這篇文章主要講解了“sentinel構建高可用redis集群的注意事項有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“sentinel構建高可用redis集群的注意事項有哪些”吧!
部署redis高可用集群時,通常會用到redis官方的sentinel。sentinel監控master狀況,master宕機時進行集群master的故障轉移。部署時方法網上很多,這里列出了一些需要注意的事項。
為了安全,有時候會對redis和sentinel設置密碼,由于集群可能會切換,所以redis集群的密碼最好相同,對于將slave-priority設置為0的節點,由于不會成為master,所以密碼可以單獨設置,不與其他機器相同,只要masterauth設置為master的密碼即可。
sentinel在redis5以后的版本支持設置密碼,由于sentinel之間需要相互通信,所以整個sentinel集群內密碼必須相同。當然不需要與redis節點的密碼相同
redis配置文件的bind指令可以綁定多個IP, 默認綁定了127.0.0.1。如果sentinel不在本機,需要redis綁定外網IP,這時bind綁定的第一個IP必須可以對外訪問。
redis的主從復制需要slave和master通信,而redis對外建立TCP連接時,會使用bind綁定的第一個IP作為本地IP,如配置了bind 127.0.0.1 1.1.1.1
,slave訪問master時,會綁定127.0.0.1,master如果不是本機,會連接失敗。
dir指令改變后面指令的相對路徑,如果配置中有其他依賴相對文件路徑的指令,如pidfile
、logfile
,要把這些指令放在dir
指令后面。
redis的CONFIG
指令會修改本地文件,導致安全風險,而在配置文件中加入rename-command CONFIG ""
,可以禁用CONFIG
指令。
sentinel檢測到master宕機進行故障切換時,會向slave發送一個事務指令(MULTI
), 包含有SLAVEOF
和CONFIG
兩個指令,SLAVEOF
指令指示slave更換master,CONFIG
指令將slaveof更新到配置文件里。如果禁用了CONFIG
指令會導致事務失敗,相應的slave無法切換master。
redis和sentinel都支持announce-ip
和announce-port
聲明ip和端口,如果對外提供服務的IP與對外訪問的出口不一致時需要指定這個配置,尤其現在很多云主機都是只有內網IP,通過slb對外訪問的。
sentinel之間的相互發現是靠master來實現的,sentienl向master的__sentinel__:hello"
的channel廣播自己的IP地址,其他sentinel根據這個消息發現其他的sentinel。如果sentienl的機器是內網的,而sentinel之間需要外網訪問,就需要在配置文件里,將announce-ip
配置為外網可以訪問的IP。而redis之間,地址通過TCP連接的對端地址獲取,不存在這個問題。
sentinel通過讀取配置文件獲取master信息,同時運行中的sentinel也可以通過指令配置。
在通過sentinel monitor
可以增加監控的集群時,如果集群帶有密碼,通過sentinel set 集群名 auth-pass password
來設置。設置后需要通過sentinel reset 集群名
,讓sentinel重新與集群master建立TCP連接才能真正生效。
sentinel會監控集群中節點的狀態,如果對redis集群內的機器手動執行slaveof執行,sentinel發現后會重新發送slaveof指令,保證集群的正常運行。
如果節點是slave,先將節點宕機,然后向所有監控這個集群的sentinel,發送sentinel reset 集群名
重置集群節點信息,將節點從集群徹底移除,保證所有的sentinel都執行了這個指令,否則sentinel會重新發送slaveof
指令將節點加入集群。
如果節點是master,需要切換master,后照slave的情況進行。
移除sentinel節點,與移除slave方法相同。
redis主從復制支持多層級,如果使用了sentinel,集群的管理可能出現混亂。
如node1有兩個從節點node2和node3,node2有一個從節點node4。如果node1宕機,sentinel將集群的master切換到了node2,那么node3和node4就變成了同一個層級的,這時sentinel該如果處理?不過并沒有實際進行驗證,不確定的情況下最好避免這種情形。
sentinel發現master宕機時,改為每一秒向所有的slave發送INFO
指令,以及時獲取slave狀態。之后需要選擇一個slave提升為集群master。
在選擇slave時,將連接正常,且slave-priority
不為0的slave組成一個數組,按照節點的slave-priority
從小到大排序,對于slave-priority
值相同的節點,依照節點的slave_repl_offset
值從大到小排序(slave_repl_offset
為主從復制的偏移,值越大說明節點的數據越接近master)。排序完成后,選擇數組中最前面的節點,提升為集群master。
redis主從復制并沒有提供強一致性,所以從slave讀到的數據與master可能有延遲。且master故障切換時數據可能會丟失。
senetinel并不關注redis主從復制的狀態與延遲,選擇sentinel時也不會保證將擁有最新數據的slave提升為master。
新部署的slave,同master連接后,master生成一個rdb文件傳輸給slave,slave加載其中的數據。在這個過程中,slave是可以對外訪問的,導致這個期間請求獲取的結果都是不存在的。只有在slave收到rdb文件,加載的過程中,redis無法對外服務。
感謝各位的閱讀,以上就是“sentinel構建高可用redis集群的注意事項有哪些”的內容了,經過本文的學習后,相信大家對sentinel構建高可用redis集群的注意事項有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。