redis--Sentinel
生活随笔
收集整理的這篇文章主要介紹了
redis--Sentinel
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Sentinel(哨崗,哨兵),是Redis的高可用解決方案:
redis-sentinel /path/to/your/sentinel.conf 或 redis-server /path/to/your/sentinel.conf --sentinel 當啟動一個sentinel時,它需要執行以下步驟
sentinel 默認每十秒,向被監視的主庫發送一次INFO命令 并通過分析INFO命令的回復來獲取主庫的當前信息。
當sentinel 發現主庫有新從庫出現時,會為這個新從庫創建相應的實例結構 并創建連接到從庫,命令連接和訂閱連接。
對于監視同一個服務器的多個sentinel來說,一個sentinel發送的信息會被其他sentinel接收到 ,這些信息會被用于更新其他sentinel。 三個監視器共同監視同一主服務器
默認情況下,sentinel 會以每秒一次的頻率向所有與他創建了命令連接的實例 包含 主庫,從庫,其他sentinel 在內 發送ping 命令,并通過實例返回的ping命令回復 來判斷實例是否在線。 sentinel 向實例發送ping 命令。
領頭sentinel將對已下線的主庫執行故障轉移在所有從庫中,選出一個從庫作為新的主庫 將所有剩下的從庫改為復制新的主庫 將源主庫設置為新的主庫的從庫 選出新的主庫 挑選一個狀態良好,數據完整的從庫,然后這個從庫,執行 slaveof no one? 將從庫轉變為主庫。 新主庫如何挑選規則 刪除所有處于下線或斷線的從庫,保證剩余從庫都是正常在線 刪除最近5秒沒有回復過領頭sentinel的INFO命令的從庫 刪除所有與源主庫連接斷開超過 down-after-milliseconds*10 的從庫 領頭sentinel根據從庫的優先級,進行排序,選擇優先級最高的從庫
- 由一個或多個Sentinel實例組成的Sentinel系統,
- 可以監視任意多個主服務器,以及這些主庫下面的從庫
- 并在主庫掉線之后,自動選擇某個從庫作為新的主庫。
?
啟動并初始化Sentinelredis-sentinel /path/to/your/sentinel.conf 或 redis-server /path/to/your/sentinel.conf --sentinel 當啟動一個sentinel時,它需要執行以下步驟
- 初始化服務器
- 將普通Redis服務器使用的代碼替換成Sentinel 專用代碼
- 初始化Sentinel狀態
- 根據給定的配置文件,初始化Sentinel的監控主服務器列表
- 創建連向主服務器的網絡連接
- 普通服務器初始化時會載入RDB文件或AOF文件來還原數據庫狀態
- sentinel 并不使用數據庫,初始化Sentinel時不會載入RDB文件或AOF文件
?
使用sentinel專用代碼 ? 不同點- 端口號
-
- redis常用端口號 ? ? ? ? 6379
- sentinel常用端口號 ? ?26379
- 命令表
-
- redis--redisCommandTable
-
- 如 set,get,script 等等鍵值對命令
- sentinel --sentinelcmds
-
- 僅包含7個命令
-
- ping,sentinel,info,
- subscribe,unsubscribe,psubscribe,punsubscribe
- 字典的鍵是被監視主服務器的名字
- 字典的值則是被監視主服務器對應的 結構
-
- 實例結構的屬性有很多
- 命令連接
-
- 專門用于向主庫發送命令,接收命令回復。
- 訂閱連接
-
- 專門用于訂閱主庫的__sentinel__:hello頻道
- 在Redis目前的發布與訂閱功能中,被發送的信息都不會保存在redis服務器里面。
- 如果在發送信息時,想要接收信息的客戶端不在線或者斷線,那么這個客戶端就會丟失這條信息。
- 因此,為了不丟失__sentinel__:hello 頻道的任何信息,Sentinel必須專門用一個專門連接 接收頻道信息
?
? 獲取主服務器信息sentinel 默認每十秒,向被監視的主庫發送一次INFO命令 并通過分析INFO命令的回復來獲取主庫的當前信息。
?
主庫回復INFO命令,內容- 主庫本身信息
-
- run_id,role域記錄的服務器角色
- 主庫下面所有從庫信息
-
- slave的id,ip,port,state,offset,lag 等等信息。
當sentinel 發現主庫有新從庫出現時,會為這個新從庫創建相應的實例結構 并創建連接到從庫,命令連接和訂閱連接。
?
這樣sentinel,也會每個10秒 給從庫發送INFO,命令并解析其返回的內容。 也就是說無論主庫還是從庫,sentinel都會定期去取他們的信息,來分析,并做動作。 sentinel與主從間的通信對于監視同一個服務器的多個sentinel來說,一個sentinel發送的信息會被其他sentinel接收到 ,這些信息會被用于更新其他sentinel。 三個監視器共同監視同一主服務器
?
使用命令連接相連的各個sentinel 可以通過向其他sentinel發送命令請求來進行信息交換。?
檢測主觀下線狀態默認情況下,sentinel 會以每秒一次的頻率向所有與他創建了命令連接的實例 包含 主庫,從庫,其他sentinel 在內 發送ping 命令,并通過實例返回的ping命令回復 來判斷實例是否在線。 sentinel 向實例發送ping 命令。
?
? 有效回復:- +PONG,-LOADING,-MASTERRDOWN
- 當sentinel 將一個主服務器判斷為 主觀下線之后,為了確認是否真的下線了。
- 它會向同樣監視著以主服務器的其他sentinel 進行詢問,
-
- 看它們是否也認為主服務器已經進入下線狀態(可以是主觀下線或客觀下線)。當sentinel 從其他
- sentinel 接收到足夠數量的已下線判斷后,sentinel 就會將主服務器判定為客觀下線,并執行故障轉移操作
- <down_state>
-
- 1 主庫已下線,0 主庫未下線
- <leader_runid>
-
- *?
-
- 僅用于檢測主庫下線的標志
- 局部領頭sentinel 的運行ID
-
- 用于選舉領頭sentinel ID
- <leader_epoch>
-
- 局部領頭sentinel 的配置紀元
-
- 用于選舉領頭sentinel
- 僅在<leader_runid>不為* 時有效,為* 時,其值始終為0
- 當主庫被判斷為客觀下線時,監視這個主庫的各個sentinel 會進行協商,
- 選出一個領頭sentinel,并由其來執行對下線主庫的故障轉移
- 所有在線Sentinel 都有被選為領頭Sentinel的資格
- 每次進行領頭Sentinel選舉后,無論是否成功,所有sentinel 的配置紀元(configuration epoch) 自增一次
-
- 配置紀元實際就是一個計數器,沒有特殊作用
- 所有sentinel 只能選擇一個 sentinel 作為領頭,并且局部領頭 sentinel 一旦設置,在這個配置紀元就不能修改
- 每個發現主庫進行客觀下線的sentinel都會要求設置它自己為領頭
- 當發送命令中runid 不是* 而是源sentinel 本身的 id,
-
- 則要求其他sentinel將其本身設置為領頭
- 目標sentinel設置領頭 規則是先到先得
-
- sentinel一旦設置某為領頭,則其余的要求都會被拒絕
- 設置的方法,就是命令的回復
-
- leader_runid 和 leader_epoch
- 源sentinel接收到回復之后
-
- 檢查回復中的leader_epoch,leader_runid 是否 符合本身的current_epoch ,runid
- 如相同則表示 其已被設置為領頭
- 如某個Sentinel 被半數以上的Sentinel 設置為局部領頭,那么此Sentinel 成為領頭Sentinel。
- 因領頭Sentinel 需要得到半數以上的支持,且每個Sentinel在每個配置紀元中,只有一次投票權
-
- 所以 在每個配置紀元中,只會出現一個領頭Sentinel。
- 如果在規定時間內,沒有選出領頭,則各個Sentinel將在一段時間后再次選舉,直到選出領頭Sentinel為止。
領頭sentinel將對已下線的主庫執行故障轉移
- 這個源主庫重新上線時,它會成為新主庫的從庫
- 保證剩余從庫都是最近成功通信過的
- 保證剩余從庫保存的數據都是較新的
?
?
?
總結- sentinel 是一個特殊模式下的redis服務器。
- 使用了不同的命令表;
- sentinel 讀取配置文件
- 為每個主庫創建實例結構,并創建連接
- sentinel 默認每十秒 發送INFO命令 檢測服務器是否在線?
- 對于監視同一服務器的多個sentinel,它們會每兩秒一次,通過被監視的服務器的頻道
- __sentinel__:hello 頻道發送消息,向其他sentinel宣告自己的存在
- 多個sentinel 之間也會創建連接,用于傳送命令
- sentinel只會與主服務器和從服務器來創建命令連接和訂閱連接
- sentinel 與 sentinel 之間只創建命令連接
- sentinel 默認每秒向實例(包括主庫,從庫,其他sentinel)發送ping 命令,
- 根據實例對返回,判斷實例是否在線
- 當實例在指定時間內連續回復無效信息,則主庫將判斷為主觀下線
- 當sentinel 判斷一個主庫為主觀下線,他會向其他sentinel 詢問,看它們是否同意這個主庫進入主觀下線狀態
- 當sentinel收到足夠多的主觀下線投票之后,它會將主服務器判斷為客觀下線。
轉載于:https://www.cnblogs.com/Aiapple/p/7272834.html
總結
以上是生活随笔為你收集整理的redis--Sentinel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 执行时的C程序
- 下一篇: Spring MVC 的xml一些配置