久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis中sentinel故障轉(zhuǎn)移的示例分析

共計(jì) 10206 個(gè)字符,預(yù)計(jì)需要花費(fèi) 26 分鐘才能閱讀完成。

這篇文章主要為大家展示了“Redis 中 sentinel 故障轉(zhuǎn)移的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Redis 中 sentinel 故障轉(zhuǎn)移的示例分析”這篇文章吧。

當(dāng)兩臺(tái)以上的 Redis 實(shí)例形成了主備關(guān)系,它們組成的集群就具備了一定的高可用性:當(dāng) master 發(fā)生故障的時(shí)候,slave 可以成為新的 master 對(duì)外提供讀寫(xiě)服務(wù),這種運(yùn)營(yíng)機(jī)制成為 failover。

那么誰(shuí)來(lái)發(fā)現(xiàn) master 的故障做 failover 決策?

一種方式是,保持一個(gè) daemo 進(jìn)程,監(jiān)控著所有的 master-slave 節(jié)點(diǎn),如下圖所示:

一個(gè) Redis 集群里面有一個(gè) master 和兩個(gè) slave,這個(gè) daemon 進(jìn)程監(jiān)控著這三個(gè)節(jié)點(diǎn)。但 daemon 為單節(jié)點(diǎn),本身可用性無(wú)法保證。需要引入多 daemon,如下圖所示:

多個(gè) daemon 解決了可用性問(wèn)題,但又出現(xiàn)了一致性問(wèn)題,如何就某個(gè) master 是否可用達(dá)成一致?例如上圖兩個(gè) daemon1 和和 master 網(wǎng)絡(luò)不通,daemon 和 master 連接暢通,那此時(shí) mater 節(jié)點(diǎn)是否需要 failover 那?

Redis 的 sentinel 提供了一套多 daemon 間的交互機(jī)制,多個(gè) daemon 間組成一個(gè)集群,成為 sentinel 集群,daemon 節(jié)點(diǎn)也稱(chēng)為 sentinel 節(jié)點(diǎn)。如下圖所示:

這些節(jié)點(diǎn)相互間通信、選舉、協(xié)商,在 master 節(jié)點(diǎn)的故障發(fā)現(xiàn)、failover 決策上表現(xiàn)出一致性。

sentinel 集群監(jiān)視任意多個(gè) master 以及 master 下的 slave,自動(dòng)將下線(xiàn)的 master 從其下的某個(gè) slave 升級(jí)為新的 master 代替繼續(xù)處理命令請(qǐng)求。

啟動(dòng)并初始化 Sentinel

啟動(dòng)一個(gè) Sentinel 可以使用命令:

./redis-sentinel ../sentinel.conf

或者命令:

./redis-server ../sentinel.conf --sentinel

當(dāng)一個(gè) Sentinel 啟動(dòng)時(shí),它需要執(zhí)行以下步驟:

初始化服務(wù)器

Sentinel 本質(zhì)上是運(yùn)行在特殊模式下的 Redis 服務(wù)器,它和普通的 Redis 服務(wù)器執(zhí)行的工作不同,初始化過(guò)程也不完全相同。如普通的 Redis 服務(wù)器初始化會(huì)載入 RDB 或者 AOF 文件來(lái)恢復(fù)數(shù)據(jù),而 Sentinel 啟動(dòng)時(shí)不會(huì)載入,因?yàn)?Sentinel 并不使用數(shù)據(jù)庫(kù)。

將普通 Redis 服務(wù)器使用的代碼替換成 Sentinel 專(zhuān)用代碼

將一部分普通 Redis 服務(wù)器使用的代碼替換成 Sentinel 專(zhuān)用代碼。如普通 Redis 服務(wù)器使用 server.c/redisCommandTable 作為服務(wù)器的命令表:

truct redisCommand redisCommandTable[] = { { module ,moduleCommand,-2, as ,0,NULL,0,0,0,0,0},
 {get ,getCommand,2, rF ,0,NULL,1,1,1,0,0},
 {set ,setCommand,-3, wm ,0,NULL,1,1,1,0,0},
 {setnx ,setnxCommand,3, wmF ,0,NULL,1,1,1,0,0},
 {setex ,setexCommand,4, wm ,0,NULL,1,1,1,0,0},
 {psetex ,psetexCommand,4, wm ,0,NULL,1,1,1,0,0},
 {append ,appendCommand,3, wm ,0,NULL,1,1,1,0,0},
 .....
 {del ,delCommand,-2, w ,0,NULL,1,-1,1,0,0},
 {unlink ,unlinkCommand,-2, wF ,0,NULL,1,-1,1,0,0},
 {exists ,existsCommand,-2, rF ,0,NULL,1,-1,1,0,0},
 {setbit ,setbitCommand,4, wm ,0,NULL,1,1,1,0,0},
 {getbit ,getbitCommand,3, rF ,0,NULL,1,1,1,0,0},
 {bitfield ,bitfieldCommand,-2, wm ,0,NULL,1,1,1,0,0},
 {setrange ,setrangeCommand,4, wm ,0,NULL,1,1,1,0,0},
 {getrange ,getrangeCommand,4, r ,0,NULL,1,1,1,0,0},
 {substr ,getrangeCommand,4, r ,0,NULL,1,1,1,0,0},
 {incr ,incrCommand,2, wmF ,0,NULL,1,1,1,0,0},
 {decr ,decrCommand,2, wmF ,0,NULL,1,1,1,0,0},
 {mget ,mgetCommand,-2, rF ,0,NULL,1,-1,1,0,0},
 {rpush ,rpushCommand,-3, wmF ,0,NULL,1,1,1,0,0},
 {lpush ,lpushCommand,-3, wmF ,0,NULL,1,1,1,0,0}
 ......
 }

Sentinel 使用 sentinel.c/sentinelcmds 作為服務(wù)器列表,如下所示:

struct redisCommand sentinelcmds[] = { { ping ,pingCommand,1, ,0,NULL,0,0,0,0,0},
 {sentinel ,sentinelCommand,-2, ,0,NULL,0,0,0,0,0},
 {subscribe ,subscribeCommand,-2, ,0,NULL,0,0,0,0,0},
 {unsubscribe ,unsubscribeCommand,-1, ,0,NULL,0,0,0,0,0},
 {psubscribe ,psubscribeCommand,-2, ,0,NULL,0,0,0,0,0},
 {punsubscribe ,punsubscribeCommand,-1, ,0,NULL,0,0,0,0,0},
 {publish ,sentinelPublishCommand,3, ,0,NULL,0,0,0,0,0},
 {info ,sentinelInfoCommand,-1, ,0,NULL,0,0,0,0,0},
 {role ,sentinelRoleCommand,1, l ,0,NULL,0,0,0,0,0},
 {client ,clientCommand,-2, rs ,0,NULL,0,0,0,0,0},
 {shutdown ,shutdownCommand,-1, ,0,NULL,0,0,0,0,0},
 {auth ,authCommand,2, sltF ,0,NULL,0,0,0,0,0}
}

初始化 Sentinel 狀態(tài)

服務(wù)器會(huì)初始化一個(gè) sentinel.c/sentinelState 結(jié)構(gòu)(保存服務(wù)器中所有和 Sentinel 功能有關(guān)的狀態(tài))。

struct sentinelState {
 
 char myid[CONFIG_RUN_ID_SIZE+1]; /* This sentinel ID. */
 
 // 當(dāng)前紀(jì)元,用于實(shí)現(xiàn)故障轉(zhuǎn)移
 uint64_t current_epoch; /* Current epoch. */
 
 // 監(jiān)視的主服務(wù)器
 // 字典的鍵是主服務(wù)器的名字
 // 字典的值則是一個(gè)指向 sentinelRedisInstances 結(jié)構(gòu)的指針
 dict *masters; /* Dictionary of master sentinelRedisInstances.
 Key is the instance name, value is the
 sentinelRedisInstance structure pointer. */
 // 是否進(jìn)入 tilt 模式
 int tilt; /* Are we in TILT mode? */
 
 // 目前正在執(zhí)行的腳本數(shù)量
 int running_scripts; /* Number of scripts in execution right now. */
 
 // 進(jìn)入 tilt 模式的時(shí)間
 mstime_t tilt_start_time; /* When TITL started. */
 
 // 最后一次執(zhí)行時(shí)間處理器的時(shí)間
 mstime_t previous_time; /* Last time we ran the time handler. */
 
 //  一個(gè) FIFO 隊(duì)列,包含了所有需要執(zhí)行的用戶(hù)腳本
 list *scripts_queue; /* Queue of user scripts to execute. */
 
 char *announce_ip; /* IP addr that is gossiped to other sentinels if
 not NULL. */
 int announce_port; /* Port that is gossiped to other sentinels if
 non zero. */
 unsigned long simfailure_flags; /* Failures simulation. */
 int deny_scripts_reconfig; /* Allow SENTINEL SET ... to change script
 paths at runtime? */
}

根據(jù)給定的配置文件,初始化 Sentinel 的監(jiān)視主服務(wù)器列表

對(duì) Sentinel 狀態(tài)的初始化將引發(fā)對(duì) masters 字典的初始化,而 master 字典的初始化是根據(jù)被載入的 Sentinel 配置文件來(lái)進(jìn)行的。

字典的 key 是監(jiān)視主服務(wù)器的名字,字典的值則是被監(jiān)控主服務(wù)器對(duì)應(yīng)的 sentinel.c/sentinelRedisInstance 結(jié)構(gòu)。

sentinelRedisInstance 結(jié)構(gòu)部分屬性如下:

typedef struct sentinelRedisInstance {
 // 標(biāo)識(shí)值,記錄了實(shí)例的類(lèi)型,以及該實(shí)例的當(dāng)前狀態(tài)
 int flags; /* See SRI_... defines */
 
 // 實(shí)例的名字
 // 主服務(wù)器的名字由用戶(hù)在配置文件中設(shè)置
 // 從服務(wù)器以及 Sentinel 的名字由 Sentinel 自動(dòng)設(shè)置
 // 格式為 ip:port, 例如“127.0.0.1:26379” char *name; /* Master name from the point of view of this sentinel. */
 
 // 實(shí)例運(yùn)行的 ID
 char *runid; /* Run ID of this instance, or unique ID if is a Sentinel.*/
 
 // 配置紀(jì)元,用于實(shí)現(xiàn)故障轉(zhuǎn)移
 uint64_t config_epoch; /* Configuration epoch. */
 
 // 實(shí)例的地址
 sentinelAddr *addr; /* Master host. */
 
 //sentinel down-after-milliseconds 選項(xiàng)設(shè)定的值
 // 實(shí)例無(wú)響應(yīng)多少毫秒之后才會(huì)被判斷為主觀(guān)下線(xiàn)(subjectively down) mstime_t down_after_period; /* Consider it down after that period. */
 
 //sentinel monitor  master-name   ip   redis-port   quorum選項(xiàng)中的 quorum
 // 判斷這個(gè)實(shí)例為客觀(guān)下線(xiàn)(objective down)所需的支持投票的數(shù)量
 unsigned int quorum;/* Number of sentinels that need to agree on failure. */ 
 //sentinel parallel-syncs  master-name   numreplicas   選項(xiàng)的 numreplicas 值
 // 在執(zhí)行故障轉(zhuǎn)移操作時(shí),可以同時(shí)對(duì)新的主服務(wù)器進(jìn)行同步的從服務(wù)器數(shù)量
 int parallel_syncs; /* How many slaves to reconfigure at same time. */
 
 //sentinel failover-timeout  master-name   milliseconds 選項(xiàng)的值
 // 刷新故障遷移狀態(tài)的最大時(shí)限
 mstime_t failover_timeout; /* Max time to refresh failover state. */
}

例如啟動(dòng) Sentinel 時(shí),配置了如下的配置文件:

sentinel monitor  master-name   ip   redis-port   quorum
sentinel monitor master1 127.0.0.1 6379 2
# sentinel down-after-milliseconds  master-name   milliseconds 
sentinel down-after-milliseconds master1 30000
# sentinel parallel-syncs  master-name   numreplicas 
sentinel parallel-syncs master1 1
# sentinel failover-timeout  master-name   milliseconds 
sentinel failover-timeout master1 900000

則 Sentinel 則會(huì)為主服務(wù)器 master1 創(chuàng)建如下圖所示的實(shí)例結(jié)構(gòu):

Sentinel 狀態(tài)以及 masters 字典的機(jī)構(gòu)如下:

創(chuàng)建連向主服務(wù)器的網(wǎng)絡(luò)連接

創(chuàng)建連向被監(jiān)視主服務(wù)器的網(wǎng)絡(luò)連接,Sentinel 將成為主服務(wù)器的客戶(hù)端,向主服務(wù)器發(fā)送命令并從命令回復(fù)獲取信息。

Sentinel 會(huì)創(chuàng)建兩個(gè)連向主服務(wù)器的異步網(wǎng)絡(luò)連接:

命令連接,用于向主服務(wù)器發(fā)送命令并接收命令回復(fù)

訂閱連接,訂閱主服務(wù)器的_sentinel_:hello 頻道

Sentinel 發(fā)送信息和獲取信息

Sentinel 默認(rèn)會(huì)以每十秒一次的頻率,通過(guò)命令連接向被監(jiān)視的 master 和 slave 發(fā)送 INFO 命令。

通過(guò) master 的回復(fù)可獲取 master 本身信息,包括 run_id 域記錄的服務(wù)器運(yùn)行 ID,以及 role 域記錄的服務(wù)器角色。另外還會(huì)獲取到 master 下的所有的從服務(wù)器信息,包括 slave 的 ip 地址和 port 端口號(hào)。Sentinel 無(wú)需用戶(hù)提供從服務(wù)器的地址信息,由 master 返回的 slave 的 ip 地址和 port 端口號(hào),可以自動(dòng)發(fā)現(xiàn) slave。

當(dāng) Sentinel 發(fā)現(xiàn) master 有新的 slave 出現(xiàn)時(shí),Sentinel 會(huì)為這個(gè)新的 slave 創(chuàng)建相應(yīng)的實(shí)例外,Sentinel 還會(huì)創(chuàng)建到 slave 的命令連接和訂閱連接。

根據(jù) slave 的 INFO 命令的回復(fù),Sentinel 會(huì)提取如下信息:

1.slave 的運(yùn)行 ID run_id

2.slave 的角色 role

3.master 的 ip 地址和 port 端口

4.master 和 slave 的連接狀態(tài) master_link_status

5.slave 的優(yōu)先級(jí) slave_priority

6.slave 的復(fù)制偏移量 slave_repl_offset

Sentinel 在默認(rèn)情況下會(huì)以每?jī)擅胍淮蔚念l率,通過(guò)命令連接向所有被監(jiān)視的 master 和 slave 的_sentinel_:hello 頻道發(fā)送一條信息

發(fā)送以下格式的命令:

 PUBLISH _sentinel_:hello  s_ip , s_port , s_runid , s_epoch , m_name , m_ip , m_port , m_epoch

以上命令相關(guān)參數(shù)意義:

參數(shù)意義 s_ipSentinel 的 ip 地址 s_portSentinel 的端口號(hào) s_runidSentinel 的運(yùn)行 IDs_runidSentinel 的運(yùn)行 IDm_name 主服務(wù)器的名字 m_ip 主服務(wù)器的 IP 地址 m_port 主服務(wù)器的端口號(hào) m_epoch 主服務(wù)器當(dāng)前的配置紀(jì)元

Sentinel 與 master 或者 slave 建立訂閱連接之后,Sentinel 就會(huì)通過(guò)訂閱連接發(fā)送對(duì)_sentinel_:hello 頻道的訂閱, 訂閱會(huì)持續(xù)到 Sentinel 與服務(wù)器的連接斷開(kāi)為止

命令如下所示:

SUBSCRIBE sentinel:hello

如上圖所示,對(duì)于每個(gè)與 Sentinel 連接的服務(wù)器,Sentinel 既可以通過(guò)命令連接向服務(wù)器頻道_sentinel_:hello 頻道發(fā)送信息,又通過(guò)訂閱連接從服務(wù)器的_sentinel_:hello 頻道接收信息。

sentinel 間會(huì)相互感知,新加入的 sentinel 會(huì)向 master 的_sentinel_:hello 頻道發(fā)布一條消息,包括自己的消息,其它該頻道訂閱者 sentinel 會(huì)發(fā)現(xiàn)新的 sentinel。隨后新的 sentinel 和其它 sentinel 會(huì)創(chuàng)建長(zhǎng)連接。

相互連接的各個(gè) Sentinel 可以進(jìn)行信息交換。Sentinel 為 master 創(chuàng)建的實(shí)例結(jié)構(gòu)中的 sentinels 字典保存了除 Sentinel 本身之外,所有同樣監(jiān)視這個(gè)主服務(wù)器的其它 Sentinel 信息。

前面也講到 sentinel 會(huì)為 slave 創(chuàng)建實(shí)例(在 master 實(shí)例的 slaves 字典中)。現(xiàn)在我們也知道通過(guò) sentinel 相互信息交換,也創(chuàng)建了其它 sentinel 的實(shí)例(在 master 實(shí)例的 sentinels 字典中)。我們將一個(gè) sentinel 中保存的實(shí)例結(jié)構(gòu)大概情況理一下,如下圖所示:

從上圖可以看到 slave 和 sentinel 字典的鍵由其 ip 地址和 port 端口組成,格式為 ip:port, 其字典的值為其對(duì)應(yīng)的 sentinelRedisInstance 實(shí)例。

master 的故障發(fā)現(xiàn)

主觀(guān)不可用

默認(rèn)情況下 Sentinel 會(huì)以每秒一次的頻率向所有與它創(chuàng)建了命令連接的 master(包括 master、slave、其它 Sentinel)發(fā)送 PING 命令,并通過(guò)實(shí)例返回的 PING 命令回復(fù)來(lái)判斷實(shí)例是否在線(xiàn)。

PING 命令回復(fù)分為下面兩種情況:

有效回復(fù):實(shí)例返回 +PONG、-LOADING、-MASTERDOWN 三種回復(fù)的一種

無(wú)效回復(fù):除上面有效回復(fù)外的其它回復(fù)或者在指定時(shí)限內(nèi)沒(méi)有任何返回

Sentinel 配置文件中的設(shè)置 down-after-milliseconds 毫秒時(shí)效內(nèi)(各個(gè) sentinel 可能配置的不相同),連續(xù)向 Sentinel 返回?zé)o效回復(fù),那么 sentinel 將此實(shí)例置為主觀(guān)下線(xiàn)狀態(tài),在 sentinel 中維護(hù)的該實(shí)例 flags 屬性中打開(kāi) SRI_S_DOWN 標(biāo)識(shí),例如 master 如下所示:

客觀(guān)不可用

在 sentinel 發(fā)現(xiàn)主觀(guān)不可用狀態(tài)后,它會(huì)將“主觀(guān)不可用狀態(tài)”發(fā)給其它 sentinel 進(jìn)行確認(rèn),當(dāng)確認(rèn)的 sentinel 節(jié)點(diǎn)數(shù) =quorum,則判定該 master 為客觀(guān)不可用,隨后進(jìn)入 failover 流程。

上面說(shuō)到將主觀(guān)不可用狀態(tài)發(fā)給其它 sentinel 使用如下命令:

SENTINEL is-master-down-by-addr  ip   port   current_epoch   runid

各個(gè)參數(shù)的意義如下:

ip:被 sentinel 判斷為主觀(guān)下線(xiàn)的主服務(wù)器的 ip 地址

port: 被 sentinel 判斷為主觀(guān)下線(xiàn)的主服務(wù)器的 port 地址

current_epoch:sentinel 的配置紀(jì)元,用于選舉領(lǐng)頭 Sentinel

runid:可以為 * 號(hào)或者 Sentinel 的運(yùn)行 ID,* 號(hào)代表檢測(cè)主服務(wù)器客觀(guān)下線(xiàn)狀態(tài)。Sentinel 的運(yùn)行 ID 用于選舉領(lǐng)頭 Sentinel

接受到以上命令的 sentinel 會(huì)反回一條包含三個(gè)參數(shù)的 Multi Bulk 回復(fù):

1)down_state 目標(biāo) sentinel 對(duì)該 master 檢查結(jié)果,1:master 已下線(xiàn) 2:master 未下線(xiàn)

2)leader_runid 兩種情況,* 表示僅用于檢測(cè) master 下線(xiàn)狀態(tài),否則表示局部領(lǐng)頭 Sentinel 的運(yùn)行 ID(選舉領(lǐng)頭 Sentinel)

3)leader_epoch 當(dāng) leader_runid 為時(shí),leader_epoch 始終為 0。不為時(shí)則表示目標(biāo) Sentinel 的局部領(lǐng)頭 Sentinel 的配置紀(jì)元(用于選舉領(lǐng)頭 Sentinel)

其中節(jié)點(diǎn)數(shù)量限制 quorum 為 sentinel 配置文件中配置的

sentinel monitor  master-name   ip   redis-port   quorum

quorum 選項(xiàng),不同的 sentinel 配置的可能不相同。

當(dāng) sentinel 認(rèn)為 master 為客觀(guān)下線(xiàn)狀態(tài),則會(huì)將 master 屬性中的 flags 的 SRI_O_DOWN 標(biāo)識(shí)打開(kāi),例如 master 如下圖所示:

選舉 Sentinel Leader

當(dāng)一臺(tái) master 宕機(jī)時(shí),可能多個(gè) sentinel 節(jié)點(diǎn)同時(shí)發(fā)現(xiàn)并通過(guò)交互確認(rèn)相互的“主觀(guān)不可用狀態(tài)”,同時(shí)達(dá)到“客觀(guān)不可用狀態(tài)”,同時(shí)打算發(fā)起 failover。但最終只能有一個(gè) sentinel 節(jié)點(diǎn)作為 failover 發(fā)起者,那么就需要選舉出 Sentinel Leader,需要開(kāi)始一個(gè) Sentinel Leader 選舉過(guò)程。

Redis 的 Sentinel 機(jī)制采用類(lèi)似于 Raft 協(xié)議實(shí)現(xiàn)這個(gè)選舉算法:

1.sentinelState 的 epoch 變量類(lèi)似于 raft 協(xié)議中的 term(選舉回合)。

2. 每一個(gè)確認(rèn)了 master“客觀(guān)不可用”的 sentinel 節(jié)點(diǎn)都會(huì)向周?chē)鷱V播自己的參選請(qǐng)求(SENTINEL is-master-down-by-addr ip port current_epoch run_id ,current_epoch 為自己的配置紀(jì)元,run_id 為自己的運(yùn)行 ID)

3. 每一個(gè)接收到參選請(qǐng)求的 sentinel 節(jié)點(diǎn)如果還沒(méi)接收到其它參選請(qǐng)求,它就將本回合的意向置為首個(gè)參選 sentinel 并回復(fù)它(先到先得);如果已經(jīng)在本回合表過(guò)意向了,則拒絕其它參選,并將已有意向回復(fù)(如上所介紹的三個(gè)參數(shù)的 Multi Bulk 回復(fù),down_state 為 1,leader_runid 為首次接收到的發(fā)起參選請(qǐng)求的源 sentinel 的運(yùn)行 ID,leader_epoch 為首次接收到的發(fā)起參選請(qǐng)求的源 sentinel 的配置紀(jì)元)

4. 每個(gè)發(fā)起參選請(qǐng)求的 sentinel 節(jié)點(diǎn)如果收到超過(guò)一半的意向同意某個(gè)參選 sentinel(可能是自己),則確定該 sentinel 為 leader。如果本回合持續(xù)了足夠長(zhǎng)時(shí)間未選出 leader,則開(kāi)啟下一個(gè)回合

leader sentinel 確定之后,leader sentinel 從 master 所有的 slave 中依據(jù)一定規(guī)則選取一個(gè)作為新的 master。

故障轉(zhuǎn)移 failover

在選舉出 Sentinel Leader 之后,sentinel leader 對(duì)已下線(xiàn) master 執(zhí)行故障轉(zhuǎn)移:

sentinel leader 對(duì)已下線(xiàn)的 master 的所有 slave 中,選出一個(gè)狀態(tài)良好、數(shù)據(jù)完整的 slave,然后向這個(gè) slave 發(fā)送:SLAVEOF no one 命令,將這個(gè) slave 轉(zhuǎn)換為 master。

我們來(lái)看下新的 master 是怎么挑選出來(lái)的?Sentinel leader 會(huì)將已下線(xiàn)的所有 slave 保存到一個(gè)列表,然后按照以下規(guī)則過(guò)濾篩選:

優(yōu)先級(jí)最高的 slave,redis.conf 配置中 replica-priority 選項(xiàng)來(lái)標(biāo)識(shí),默認(rèn)為 100,replica-priority 較低的優(yōu)先級(jí)越高。0 為特殊優(yōu)先級(jí),標(biāo)志為不能升級(jí)為 master。

如果存在多個(gè)優(yōu)先級(jí)相等的 slave,則會(huì)選擇復(fù)制偏移量 (offset) 最大的 slave(數(shù)據(jù)更加完整)

如果存在多個(gè)優(yōu)先級(jí)相等,最大復(fù)制偏移量最大的 slave,則選擇運(yùn)行 ID 最小的 slave

選出需要升級(jí)為新的 master 的 slave 后,Sentinel Leader 會(huì)向這個(gè) slave 發(fā)送 SLAVEOF no one 命令。之后 Sentinel 會(huì)以每秒一次頻率 (平時(shí)是十秒一次) 向被升級(jí) slave 發(fā)送 INFO,當(dāng)回復(fù)的 role 由 slave 變?yōu)?master 時(shí) Sentinel Leader 就會(huì)知道已升級(jí)為 master。

sentinel leader 向已下線(xiàn)的 master 屬下的 slave 發(fā)送 SLAVEOF 命令(SLAVEOF new_master_ip new_master_port),去復(fù)制新的 master。

將舊的 master 設(shè)置為新的 master 的 slave,并繼續(xù)對(duì)其監(jiān)視,當(dāng)其重新上線(xiàn)時(shí) Sentinel 會(huì)執(zhí)行命令讓其成為新的 master 的 slave。

以上是“Redis 中 sentinel 故障轉(zhuǎn)移的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-27發(fā)表,共計(jì)10206字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
主站蜘蛛池模板: 饶阳县| 灵石县| 辛集市| 南投县| 土默特右旗| 贵港市| 莱西市| 汕尾市| 仲巴县| 友谊县| 离岛区| 益阳市| 筠连县| 南丰县| 宁城县| 镇安县| 灵山县| 隆德县| 榆林市| 贞丰县| 百色市| 桂阳县| 工布江达县| 永宁县| 大关县| 黔东| 鸡西市| 喀喇沁旗| 黔南| 竹溪县| 大石桥市| 越西县| 江门市| 比如县| 新沂市| 宜宾县| 盐边县| 昌乐县| 黄陵县| 陇川县| 玉林市|