標題
- 1. Redis主從同步原理:
- 判斷下線的條件:
- 故障轉移
- 如何保證Sentinel高可用
1. Redis主從同步原理:
1、slave執行命令向master建立連接
2、master執行bgsave(后臺存儲),生成rdb快照(redis備份方式,data以二進制方式保存在本地),發送到slave上
3、slave獲取快照后讀取,對data還原,保證初始化數據一致
4、master接受命令發送到salve,salve執行保證后續數據一致
缺點:master掛掉,redis集群癱瘓。
引出高可用,sentinel(哨兵模式)
1、建立sentinel集群,有一個leader角色
2、一般需要6個節點,3個sentinel,1主2從
3、sentinel安裝在節點上,根據配置信息監聽redis的健康狀態。
(每個sentinel 1次/秒頻率向master,salve及其他sentinel實例發送ping命令)
若master掛了,怎么辦?
先判斷是否真掛了:
主動下線(不靠譜,存在網絡問題誤判):實例最后一次有效回復時間超時
客觀下線:多個sentinel ping不通(多個=總數除以2+1)
判斷下線的條件:
1.剔除主觀下線、已斷線、或者最后一次回復PING命令的時
間大于五秒鐘的Slave
2.剔除與失效主服務器連接斷開的時長超過down-after選項
指定的時長十倍的Slave
3.按同步數據的偏移量選出數據最完整的Slave
4.如果偏稱量相同,選中ID最小的Slave
故障轉移
選出新的master后,開始故障轉移
1.向被選中的從服務器發送SLAVEOF NO ONE命令,讓它轉變為主服務器。
2.通過發布與訂閱功能,將更新后的配置傳播給所有其他Sentinel,其他Sentinel對它們自己的配置進行更新。
3.向所有Slave下達SLAVEOF命令,指向新的master
4. redis-slave向master重新建立連接,重放rdb保持數據同步
5.在上述轉移過程中,伴隨著Redis本地配置文件的自動重寫,這樣即使是實例重啟配置也不會丟失
6.原有的master在恢復后降級為slave與新master全量同步
如何保證Sentinel高可用
如果Sentinel掛了怎么辦?如何保證Sentinel高可用
1.sentinel自動故障遷移使用raft算法來選舉領頭(leader) sentinel
2.超過半數投票選出leader, sentinel Leader用于下達故障轉移的指令
3.如果某個Leader掛了,則使用Raft從剩余的Sentinel中選出leader
事實上,在最開始的時候,sentinel節點是先和master建立連接,然后通過服務的注冊發現才知道其他sentinel節點的存在。