日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis--Sentinel

發(fā)布時間:2025/4/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis--Sentinel 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Sentinel(哨崗,哨兵),是Redis的高可用解決方案:
  • 由一個或多個Sentinel實例組成的Sentinel系統(tǒng),
  • 可以監(jiān)視任意多個主服務(wù)器,以及這些主庫下面的從庫
  • 并在主庫掉線之后,自動選擇某個從庫作為新的主庫。
說到底,就是探活,主從切換==高可用

?

啟動并初始化Sentinel
redis-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ù)器 sentinel 實際上是redis的一種特殊形式,因此大體初始化和redis初始化相似 不同點
  • 普通服務(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
初始化sentinel狀態(tài)的masters屬性 ? sentinel狀態(tài)中masters字典記錄了所有被Sentinel監(jiān)視的主服務(wù)器的相關(guān)信息;
  • 字典的鍵是被監(jiān)視主服務(wù)器的名字
  • 字典的值則是被監(jiān)視主服務(wù)器對應(yīng)的 結(jié)構(gòu)
    • 實例結(jié)構(gòu)的屬性有很多
創(chuàng)建連向主服務(wù)器的網(wǎng)絡(luò)連接 創(chuàng)建連向被監(jiān)視主服務(wù)器的網(wǎng)絡(luò)連接,Sentinel將成為主服務(wù)器的客戶端,它可以向主服務(wù)器發(fā)送命令,并從命名回復(fù)中獲取相關(guān)信息。 對于每個被sentinel監(jiān)視的主服務(wù)器來說,sentinel會創(chuàng)建兩個連向主服務(wù)器的異步網(wǎng)絡(luò)連接:
  • 命令連接
    • 專門用于向主庫發(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 等等信息。
sentinel 將主信息存在master字典中,將從信息存在Slave字典中; 獲取新增從庫信息
當(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
如果ping 命令 沒有 得到上面的有效回復(fù) 則 主觀下線 實例 或者是 在 down-after-milliseconds 后還沒收到任何回復(fù) 也選擇主觀下線。 檢查客觀下線狀態(tài)
  • 當(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)移操作
使用命令,判斷主庫是否真下線 sentinel is-master-down-by-addr <ip> <port> <current_epoch> <runid> current_epoch: sentinel 當(dāng)前的配置紀(jì)元,用于選舉領(lǐng)頭sentinel; 當(dāng)其他sentinel接收到 is-master-down-by-addr 后返回 三個參數(shù)
  • <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
選舉領(lǐng)頭sentinel
  • 當(dāng)主庫被判斷為客觀下線時,監(jiān)視這個主庫的各個sentinel 會進(jìn)行協(xié)商,
  • 選出一個領(lǐng)頭sentinel,并由其來執(zhí)行對下線主庫的故障轉(zhuǎn)移
Redis 選舉領(lǐng)頭Sentinel 的規(guī)則
  • 所有在線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為止。
故障轉(zhuǎn)移
領(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 的從庫
    • 保證剩余從庫保存的數(shù)據(jù)都是較新的
  • 領(lǐng)頭sentinel根據(jù)從庫的優(yōu)先級,進(jìn)行排序,選擇優(yōu)先級最高的從庫
  • ?

    ?

    ?

    總結(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。