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