以後還是要好好寫博客,把好東西或者是在工作中遇到的問題記錄下來
菜雞的提升之路
最近在看《redis的設計與實現》,這本書比較底層,應用說的很好,主要還是對redis底層的詳解吧,個人覺得很不錯,還是很好看的一本書,特別是剛開始對redis底層的各種數據結構的介紹,步步升入。。
閒話少說,不如正題
sentinel
sentinel(哨兵)是redis高可用的解決方案。它的本質是一個運行在特殊模式下的redis服務器。
sentinel做的主要的工作是
- 主服務器選舉:sentinel系統會挑選server1屬下的一個從服務器,並將這個從服務器提升爲主服務器
- 故障轉移:向從服務器發送(slave of no one)命令,將從服務器提升爲主服務器。從服務器發送複製指令,(sync,psync),當所有的從服務器完成複製新的服務器時,故障轉移操作執行完畢
- sentinel還會繼續監視已經下線的server1,並在它重新上線時,將他設置爲新的主服務器的從服務器。
sentinel服務初始化
sentinel其實就是一個運行在特殊模式下的redis服務器。一個sentinel啓動時,他需要執行以下步驟
- 初始化redis服務器
- 將普通的redis服務器使用的代碼替換成sentinel專用代碼
- 初始化sentinel的狀態
- 根據給定的配置文件,初始化sentinel的監視主服務器列表
- 創建連向主服務器的網絡連接
redis向主redis服務器創建通信的主要步驟如下:
- 初始化setinel狀態的master屬性
- 創建連向主服務器的網絡連接
- 獲取主服務信息
- 獲取從服務信息
- 向主服務器和從服務器發送消息
- 接收來自主服務器和從服務器的頻道消息
- 更新sentinels字典
- 創建連向其他sentinel的連接
- 檢查客觀下線狀態
- 選取領頭sentinel
- 故障轉移
a. 選出新的主服務器
b 修改從服務器的複製目標
c. 將舊的主服務器變爲從服務器
下面我將簡述這幾個過程的具體如何操作的。
初始化sentinel的master屬性
創建連向主服務器的網絡連接
sentinel會創建兩個連向主服務器的異步網絡連接
- 一個是命令連接,這個連接專門用於向主服務器發送命令,並接收命令服務
- 另一個是訂閱連接,這個連接專門用於訂閱主服務器的_sentinel_:hello頻道
獲取主服務器信息
sentinel默認以10秒一次的頻率,通過命令連接向被監控的服務器發送Info命令,並通過分析INFO命令的回覆來獲取主服務器當前的信息
#server
…
run_id:8979803798379273980987980yhiuh979i7we678
…
#replication
role:master
…
slave0:ip=127.0.0.1,port=11111,state=online,offset=43,lag=0
slave1:ip=127.0.0.1,port=22222,state=online,offset=43,lag=0
slave2:ip=127.0.0.1,port=33333,state=online,offset=43,lag=0
…
獲取從服務器信息
當sentinel發生主服務器與新的從服務器出現時,sentinel除了會爲這個新的從服務創建相應的實例結構之外,sentinel還會創建連接到從服務器的命令連接和訂閱連接
創建連向其他sentinel命令連接
故障轉移
選取領頭的sentinel,然後對故障進行轉移
- 在下線服務器的從服務器中挑選一個作爲新的主服務器
- 已下線的服務器下的其他從服務器複製新的主服務器
- 已下線的主服務器再上線的時候會作爲新服務器的從服務器0.
重點知識掌握
- sentinel只是一個運行在特殊模式下的redis服務器,它使用了和普通模式不同的命令表,所以sentinel模式能夠使用命令和普通redis服務器能夠使用的命令不同
- sentinel會讀入用戶指定的配置文件,爲每個要被監視的服務器創建相應的實例結構,並創建連向主服務器的命令連接和訂閱連接。
- 在一般情況下,sentinel以每十秒一個的頻率向被監視的主服務器和從服務器發送INFO命令,當主服務器處於下線狀態,或者sentinel正在對主服務器做故障轉移時,sentinel向從服務器發送Info命令的頻率會改爲每秒一次
- 對於監視同一主服務器和從服務器的多個sentinel來說,他們會以每兩秒一次的方式通過向被監視的服務器的_sentinel_:hello頻道發送消息來向其他sentinel宣告自己的存在
- 每個sentinel也會從_sentinel_:hello頻道接收其他sentinel發來的消息,並根據這些信息爲其他的sentinel創建實例結構,以及連接命令
- sentinel會與主服務器創建命令連接和訂閱連接,sentinel和sentinel之間只能通過命令連接
- sentinel以每秒一次的頻率向實例(包括主服務器,從服務器,其他sentinel)發送ping命令,並根據實例對ping的命令回覆來判斷實例是否在線當一個實例在指定時長中連接向sentinel發送無效回覆的時候,sentinel會將這個實例判斷爲主觀下線
- 當sentinel將主服務器判斷爲主觀下線的時候,他會想同樣監視這臺主服務器的sentinel詢問,看它是否支持主服務器的下線。
- 當sentinel蒐集到足夠多的主觀下線投票時,他會將主服務器下線,併發起一次主服務器的故障轉移