国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

sentinel哨兵模式詳細(xì)介紹

共 31449字,需瀏覽 63分鐘

 ·

2021-05-30 08:52

點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

sentinel哨兵模式介紹

Sentinel(哨兵)是用于監(jiān)控redis集群中Master狀態(tài)的工具,是Redis 的高可用性解決方案,sentinel哨兵模式已經(jīng)被集成在redis2.4之后的版本中。sentinel是redis高可用的解決方案,sentinel系統(tǒng)可以監(jiān)視一個(gè)或者多個(gè)redis master服務(wù),以及這些master服務(wù)的所有從服務(wù);當(dāng)某個(gè)master服務(wù)下線(xiàn)時(shí),自動(dòng)將該master下的某個(gè)從服務(wù)升級(jí)為master服務(wù)替代已下線(xiàn)的master服務(wù)繼續(xù)處理請(qǐng)求。

sentinel可以讓redis實(shí)現(xiàn)主從復(fù)制,當(dāng)一個(gè)集群中的master失效之后,sentinel可以選舉出一個(gè)新的master用于自動(dòng)接替master的工作,集群中的其他redis服務(wù)器自動(dòng)指向新的master同步數(shù)據(jù)。一般建議sentinel采取奇數(shù)臺(tái),防止某一臺(tái)sentinel無(wú)法連接到master導(dǎo)致誤切換。其結(jié)構(gòu)如下:

Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當(dāng)用Redis做Master-slave的高可用方案時(shí),假如master宕機(jī)了,Redis本身(包括它的很多客戶(hù)端)都沒(méi)有實(shí)現(xiàn)自動(dòng)進(jìn)行主備切換,而Redis-sentinel本身也是一個(gè)獨(dú)立運(yùn)行的進(jìn)程,它能監(jiān)控多個(gè)master-slave集群,發(fā)現(xiàn)master宕機(jī)后能進(jìn)行自動(dòng)切換。Sentinel由一個(gè)或多個(gè)Sentinel 實(shí)例 組成的Sentinel 系統(tǒng)可以監(jiān)視任意多個(gè)主服務(wù)器,以及這些主服務(wù)器屬下的所有從服務(wù)器,并在被監(jiān)視的主服務(wù)器進(jìn)入下線(xiàn)狀態(tài)時(shí),自動(dòng)將下線(xiàn)主服務(wù)器屬下的某個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器。

例如下圖所示:

在Server1 掉線(xiàn)后:

升級(jí)Server2 為新的主服務(wù)器:

Sentinel版本
Sentinel當(dāng)前最新的穩(wěn)定版本稱(chēng)為Sentinel 2(與之前的Sentinel 1區(qū)分開(kāi)來(lái))。隨著redis2.8的安裝包一起發(fā)行。安裝完Redis2.8后,可以在redis2.8/src/里面找到Redis-sentinel的啟動(dòng)程序。
強(qiáng)烈建議:如果你使用的是redis2.6(sentinel版本為sentinel 1),你最好應(yīng)該使用redis2.8版本的sentinel 2,因?yàn)閟entinel 1有很多的Bug,已經(jīng)被官方棄用,所以強(qiáng)烈建議使用redis2.8以及sentinel 2。

Sentinel狀態(tài)持久化
snetinel的狀態(tài)會(huì)被持久化地寫(xiě)入sentinel的配置文件中。每次當(dāng)收到一個(gè)新的配置時(shí),或者新創(chuàng)建一個(gè)配置時(shí),配置會(huì)被持久化到硬盤(pán)中,并帶上配置的版本戳。這意味著,可以安全的停止和重啟sentinel進(jìn)程。


Sentinel作用:
1)Master狀態(tài)檢測(cè)
2)如果Master異常,則會(huì)進(jìn)行Master-Slave切換,將其中一個(gè)Slave作為Master,將之前的Master作為Slave。
3)Master-Slave切換后,master_redis.conf、slave_redis.conf和sentinel.conf的內(nèi)容都會(huì)發(fā)生改變,即master_redis.conf中會(huì)多一行slaveof的配置,sentinel.conf的監(jiān)控目標(biāo)會(huì)隨之調(diào)換。


Sentinel工作方式(每個(gè)Sentinel實(shí)例都執(zhí)行的定時(shí)任務(wù))
1)每個(gè)Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實(shí)例發(fā)送一個(gè)PING命令。
2)如果一個(gè)實(shí)例(instance)距離最后一次有效回復(fù)PING命令的時(shí)間超過(guò) own-after-milliseconds 選項(xiàng)所指定的值,則這個(gè)實(shí)例會(huì)被Sentinel標(biāo)記為主觀(guān)下線(xiàn)。
3)如果一個(gè)Master被標(biāo)記為主觀(guān)下線(xiàn),則正在監(jiān)視這個(gè)Master的所有 Sentinel 要以每秒一次的頻率確認(rèn)Master的確進(jìn)入了主觀(guān)下線(xiàn)狀態(tài)。
4)當(dāng)有足夠數(shù)量的Sentinel(大于等于配置文件指定的值)在指定的時(shí)間范圍內(nèi)確認(rèn)Master的確進(jìn)入了主觀(guān)下線(xiàn)狀態(tài),則Master會(huì)被標(biāo)記為客觀(guān)下線(xiàn)。
5)在一般情況下,每個(gè)Sentinel 會(huì)以每10秒一次的頻率向它已知的所有Master,Slave發(fā)送 INFO 命令。
6)當(dāng)Master被Sentinel標(biāo)記為客觀(guān)下線(xiàn)時(shí),Sentinel 向下線(xiàn)的 Master 的所有Slave發(fā)送 INFO命令的頻率會(huì)從10秒一次改為每秒一次。
7)若沒(méi)有足夠數(shù)量的Sentinel同意Master已經(jīng)下線(xiàn),Master的客觀(guān)下線(xiàn)狀態(tài)就會(huì)被移除。若 Master重新向Sentinel 的PING命令返回有效回復(fù),Master的主觀(guān)下線(xiàn)狀態(tài)就會(huì)被移除。


三個(gè)定時(shí)任務(wù)
sentinel在內(nèi)部有3個(gè)定時(shí)任務(wù)
1)每10秒每個(gè)sentinel會(huì)對(duì)master和slave執(zhí)行info命令,這個(gè)任務(wù)達(dá)到兩個(gè)目的:
a)發(fā)現(xiàn)slave節(jié)點(diǎn)
b)確認(rèn)主從關(guān)系
2)每2秒每個(gè)sentinel通過(guò)master節(jié)點(diǎn)的channel交換信息(pub/sub)。master節(jié)點(diǎn)上有一個(gè)發(fā)布訂閱的頻道(sentinel:hello)。sentinel節(jié)點(diǎn)通過(guò)__sentinel__:hello頻道進(jìn)行信息交換(對(duì)節(jié)點(diǎn)的"看法"和自身的信息),達(dá)成共識(shí)。
3)每1秒每個(gè)sentinel對(duì)其他sentinel和redis節(jié)點(diǎn)執(zhí)行ping操作(相互監(jiān)控),這個(gè)其實(shí)是一個(gè)心跳檢測(cè),是失敗判定的依據(jù)。


主觀(guān)下線(xiàn)
所謂主觀(guān)下線(xiàn)(Subjectively Down, 簡(jiǎn)稱(chēng) SDOWN)指的是單個(gè)Sentinel實(shí)例對(duì)服務(wù)器做出的下線(xiàn)判斷,即單個(gè)sentinel認(rèn)為某個(gè)服務(wù)下線(xiàn)(有可能是接收不到訂閱,之間的網(wǎng)絡(luò)不通等等原因)。
主觀(guān)下線(xiàn)就是說(shuō)如果服務(wù)器在down-after-milliseconds給定的毫秒數(shù)之內(nèi), 沒(méi)有返回 Sentinel 發(fā)送的 PING 命令的回復(fù), 或者返回一個(gè)錯(cuò)誤, 那么 Sentinel 將這個(gè)服務(wù)器標(biāo)記為主觀(guān)下線(xiàn)(SDOWN )。
sentinel會(huì)以每秒一次的頻率向所有與其建立了命令連接的實(shí)例(master,從服務(wù),其他sentinel)發(fā)ping命令,通過(guò)判斷ping回復(fù)是有效回復(fù),還是無(wú)效回復(fù)來(lái)判斷實(shí)例時(shí)候在線(xiàn)(對(duì)該sentinel來(lái)說(shuō)是“主觀(guān)在線(xiàn)”)。
sentinel配置文件中的down-after-milliseconds設(shè)置了判斷主觀(guān)下線(xiàn)的時(shí)間長(zhǎng)度,如果實(shí)例在down-after-milliseconds毫秒內(nèi),返回的都是無(wú)效回復(fù),那么sentinel回認(rèn)為該實(shí)例已(主觀(guān))下線(xiàn),修改其flags狀態(tài)為SRI_S_DOWN。如果多個(gè)sentinel監(jiān)視一個(gè)服務(wù),有可能存在多個(gè)sentinel的down-after-milliseconds配置不同,這個(gè)在實(shí)際生產(chǎn)中要注意。


客觀(guān)下線(xiàn)
客觀(guān)下線(xiàn)(Objectively Down, 簡(jiǎn)稱(chēng) ODOWN)指的是多個(gè) Sentinel 實(shí)例在對(duì)同一個(gè)服務(wù)器做出 SDOWN 判斷, 并且通過(guò) SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服務(wù)器下線(xiàn)判斷,然后開(kāi)啟failover。
客觀(guān)下線(xiàn)就是說(shuō)只有在足夠數(shù)量的 Sentinel 都將一個(gè)服務(wù)器標(biāo)記為主觀(guān)下線(xiàn)之后, 服務(wù)器才會(huì)被標(biāo)記為客觀(guān)下線(xiàn)(ODOWN)。
只有當(dāng)master被認(rèn)定為客觀(guān)下線(xiàn)時(shí),才會(huì)發(fā)生故障遷移。
當(dāng)sentinel監(jiān)視的某個(gè)服務(wù)主觀(guān)下線(xiàn)后,sentinel會(huì)詢(xún)問(wèn)其它監(jiān)視該服務(wù)的sentinel,看它們是否也認(rèn)為該服務(wù)主觀(guān)下線(xiàn),接收到足夠數(shù)量(這個(gè)值可以配置)的sentinel判斷為主觀(guān)下線(xiàn),既任務(wù)該服務(wù)客觀(guān)下線(xiàn),并對(duì)其做故障轉(zhuǎn)移操作。
sentinel通過(guò)發(fā)送 SENTINEL is-master-down-by-addr ip port current_epoch runid,(ip:主觀(guān)下線(xiàn)的服務(wù)id,port:主觀(guān)下線(xiàn)的服務(wù)端口,current_epoch:sentinel的紀(jì)元,runid:*表示檢測(cè)服務(wù)下線(xiàn)狀態(tài),如果是sentinel 運(yùn)行id,表示用來(lái)選舉領(lǐng)頭sentinel)來(lái)詢(xún)問(wèn)其它sentinel是否同意服務(wù)下線(xiàn)。
一個(gè)sentinel接收另一個(gè)sentinel發(fā)來(lái)的is-master-down-by-addr后,提取參數(shù),根據(jù)ip和端口,檢測(cè)該服務(wù)時(shí)候在該sentinel主觀(guān)下線(xiàn),并且回復(fù)is-master-down-by-addr,回復(fù)包含三個(gè)參數(shù):down_state(1表示已下線(xiàn),0表示未下線(xiàn)),leader_runid(領(lǐng)頭sentinal id),leader_epoch(領(lǐng)頭sentinel紀(jì)元)。
sentinel接收到回復(fù)后,根據(jù)配置設(shè)置的下線(xiàn)最小數(shù)量,達(dá)到這個(gè)值,既認(rèn)為該服務(wù)客觀(guān)下線(xiàn)。
客觀(guān)下線(xiàn)條件只適用于主服務(wù)器:對(duì)于任何其他類(lèi)型的 Redis 實(shí)例, Sentinel 在將它們判斷為下線(xiàn)前不需要進(jìn)行協(xié)商, 所以從服務(wù)器或者其他 Sentinel 永遠(yuǎn)不會(huì)達(dá)到客觀(guān)下線(xiàn)條件。只要一個(gè) Sentinel 發(fā)現(xiàn)某個(gè)主服務(wù)器進(jìn)入了客觀(guān)下線(xiàn)狀態(tài), 這個(gè) Sentinel 就可能會(huì)被其他 Sentinel 推選出, 并對(duì)失效的主服務(wù)器執(zhí)行自動(dòng)故障遷移操作。

在redis-sentinel的conf文件里有這么兩個(gè)配置:
**1)sentinel monitor **


四個(gè)參數(shù)含義:
masterName這個(gè)是對(duì)某個(gè)master+slave組合的一個(gè)區(qū)分標(biāo)識(shí)(一套sentinel是可以監(jiān)聽(tīng)多套master+slave這樣的組合的)。
ip 和 port 就是master節(jié)點(diǎn)的 ip 和 端口號(hào)。
quorum這個(gè)參數(shù)是進(jìn)行客觀(guān)下線(xiàn)的一個(gè)依據(jù),意思是至少有 quorum 個(gè)sentinel主觀(guān)的認(rèn)為這個(gè)master有故障,才會(huì)對(duì)這個(gè)master進(jìn)行下線(xiàn)以及故障轉(zhuǎn)移。因?yàn)橛械臅r(shí)候,某個(gè)sentinel節(jié)點(diǎn)可能因?yàn)樽陨砭W(wǎng)絡(luò)原因,導(dǎo)致無(wú)法連接master,而此時(shí)master并沒(méi)有出現(xiàn)故障,所以這就需要多個(gè)sentinel都一致認(rèn)為該master有問(wèn)題,才可以進(jìn)行下一步操作,這就保證了公平性和高可用。

2)sentinel down-after-milliseconds **
這個(gè)配置其實(shí)就是進(jìn)行主觀(guān)下線(xiàn)的一個(gè)依據(jù)**,masterName這個(gè)參數(shù)不用說(shuō)了,timeout是一個(gè)毫秒值,表示:如果這臺(tái)sentinel超過(guò)timeout這個(gè)時(shí)間都無(wú)法連通master包括slave(slave不需要客觀(guān)下線(xiàn),因?yàn)椴恍枰收限D(zhuǎn)移)的話(huà),就會(huì)主觀(guān)認(rèn)為該master已經(jīng)下線(xiàn)(實(shí)際下線(xiàn)需要客觀(guān)下線(xiàn)的判斷通過(guò)才會(huì)下線(xiàn))

那么,多個(gè)sentinel之間是如何達(dá)到共識(shí)的呢?
這就是依賴(lài)于前面說(shuō)的第二個(gè)定時(shí)任務(wù),某個(gè)sentinel先將master節(jié)點(diǎn)進(jìn)行一個(gè)主觀(guān)下線(xiàn),然后會(huì)將這個(gè)判定通過(guò)sentinel is-master-down-by-addr這個(gè)命令問(wèn)對(duì)應(yīng)的節(jié)點(diǎn)是否也同樣認(rèn)為該addr的master節(jié)點(diǎn)要做客觀(guān)下線(xiàn)。最后當(dāng)達(dá)成這一共識(shí)的sentinel個(gè)數(shù)達(dá)到前面說(shuō)的quorum設(shè)置的這個(gè)值時(shí),就會(huì)對(duì)該master節(jié)點(diǎn)下線(xiàn)進(jìn)行故障轉(zhuǎn)移。quorum的值一般設(shè)置為sentinel個(gè)數(shù)的二分之一加1,例如3個(gè)sentinel就設(shè)置2。


主觀(guān)下線(xiàn)(SDOWN)和客觀(guān)下線(xiàn)(ODOWN)的更多細(xì)節(jié)
sentinel對(duì)于不可用有兩種不同的看法,一個(gè)叫主觀(guān)不可用(SDOWN),另外一個(gè)叫客觀(guān)不可用(ODOWN)。SDOWN是sentinel自己主觀(guān)上檢測(cè)到的關(guān)于master的狀態(tài),ODOWN需要一定數(shù)量的sentinel達(dá)成一致意見(jiàn)才能認(rèn)為一個(gè)master客觀(guān)上已經(jīng)宕掉,各個(gè)sentinel之間通過(guò)命令SENTINEL is_master_down_by_addr來(lái)獲得其它sentinel對(duì)master的檢測(cè)結(jié)果。
從sentinel的角度來(lái)看,如果發(fā)送了PING心跳后,在一定時(shí)間內(nèi)沒(méi)有收到合法的回復(fù),就達(dá)到了SDOWN的條件。這個(gè)時(shí)間在配置中通過(guò)is-master-down-after-milliseconds參數(shù)配置。
當(dāng)sentinel發(fā)送PING后,以下回復(fù)之一都被認(rèn)為是合法的:
PING replied with +PONG.
PING replied with -LOADING error.
PING replied with -MASTERDOWN error.
其它任何回復(fù)(或者根本沒(méi)有回復(fù))都是不合法的。


從SDOWN切換到ODOWN不需要任何一致性算法,只需要一個(gè)gossip協(xié)議:如果一個(gè)sentinel收到了足夠多的sentinel發(fā)來(lái)消息告訴它某個(gè)master已經(jīng)down掉了,SDOWN狀態(tài)就會(huì)變成ODOWN狀態(tài)。如果之后master可用了,這個(gè)狀態(tài)就會(huì)相應(yīng)地被清理掉。
正如之前已經(jīng)解釋過(guò)了,真正進(jìn)行failover需要一個(gè)授權(quán)的過(guò)程,但是所有的failover都開(kāi)始于一個(gè)ODOWN狀態(tài)。
ODOWN狀態(tài)只適用于master,對(duì)于不是master的redis節(jié)點(diǎn)sentinel之間不需要任何協(xié)商,slaves和sentinel不會(huì)有ODOWN狀態(tài)。


配置版本號(hào)
為什么要先獲得大多數(shù)sentinel的認(rèn)可時(shí)才能真正去執(zhí)行failover呢?
當(dāng)一個(gè)sentinel被授權(quán)后,它將會(huì)獲得宕掉的master的一份最新配置版本號(hào),當(dāng)failover執(zhí)行結(jié)束以后,這個(gè)版本號(hào)將會(huì)被用于最新的配置。因?yàn)榇蠖鄶?shù)sentinel都已經(jīng)知道該版本號(hào)已經(jīng)被要執(zhí)行failover的sentinel拿走了,所以其他的sentinel都不能再去使用這個(gè)版本號(hào)。這意味著,每次failover都會(huì)附帶有一個(gè)獨(dú)一無(wú)二的版本號(hào)。我們將會(huì)看到這樣做的重要性。而且,sentinel集群都遵守一個(gè)規(guī)則:如果sentinel A推薦sentinel B去執(zhí)行failover,B會(huì)等待一段時(shí)間后,自行再次去對(duì)同一個(gè)master執(zhí)行failover,這個(gè)等待的時(shí)間是通過(guò)failover-timeout配置項(xiàng)去配置的。從這個(gè)規(guī)則可以看出,sentinel集群中的sentinel不會(huì)再同一時(shí)刻并發(fā)去failover同一個(gè)master,第一個(gè)進(jìn)行failover的sentinel如果失敗了,另外一個(gè)將會(huì)在一定時(shí)間內(nèi)進(jìn)行重新進(jìn)行failover,以此類(lèi)推。
redis sentinel保證了活躍性:如果大多數(shù)sentinel能夠互相通信,最終將會(huì)有一個(gè)被授權(quán)去進(jìn)行failover.
redis sentinel也保證了安全性:每個(gè)試圖去failover同一個(gè)master的sentinel都會(huì)得到一個(gè)獨(dú)一無(wú)二的版本號(hào)。


配置傳播
一旦一個(gè)sentinel成功地對(duì)一個(gè)master進(jìn)行了failover,它將會(huì)把關(guān)于master的最新配置通過(guò)廣播形式通知其它sentinel,其它的sentinel則更新對(duì)應(yīng)master的配置。
一個(gè)faiover要想被成功實(shí)行,sentinel必須能夠向選為master的slave發(fā)送SLAVEOF NO ONE命令,然后能夠通過(guò)INFO命令看到新master的配置信息。
當(dāng)將一個(gè)slave選舉為master并發(fā)送SLAVEOF NO ONE后,即使其它的slave還沒(méi)針對(duì)新master重新配置自己,failover也被認(rèn)為是成功了的,然后所有sentinels將會(huì)發(fā)布新的配置信息。
新配在集群中相互傳播的方式,就是為什么我們需要當(dāng)一個(gè)sentinel進(jìn)行failover時(shí)必須被授權(quán)一個(gè)版本號(hào)的原因。
每個(gè)sentinel使用##發(fā)布/訂閱##的方式持續(xù)地傳播master的配置版本信息,配置傳播的##發(fā)布/訂閱##管道是:sentinel:hello。
因?yàn)槊恳粋€(gè)配置都有一個(gè)版本號(hào),所以以版本號(hào)最大的那個(gè)為標(biāo)準(zhǔn)。


舉個(gè)例子:
假設(shè)有一個(gè)名為mymaster的地址為192.168.10.202:6379。一開(kāi)始,集群中所有的sentinel都知道這個(gè)地址,于是為mymaster的配置打上版本號(hào)1。一段時(shí)候后mymaster死了,有一個(gè)sentinel被授權(quán)用版本號(hào)2對(duì)其進(jìn)行failover。如果failover成功了,假設(shè)地址改為了192.168.10.202:9000,此時(shí)配置的版本號(hào)為2,進(jìn)行failover的sentinel會(huì)將新配置廣播給其他的sentinel,由于其他sentinel維護(hù)的版本號(hào)為1,發(fā)現(xiàn)新配置的版本號(hào)為2時(shí),版本號(hào)變大了,說(shuō)明配置更新了,于是就會(huì)采用最新的版本號(hào)為2的配置。
這意味著sentinel集群保證了第二種活躍性:一個(gè)能夠互相通信的sentinel集群最終會(huì)采用版本號(hào)最高且相同的配置。


sentinel的"仲裁會(huì)"
前面我們談到,當(dāng)一個(gè)master被sentinel集群監(jiān)控時(shí),需要為它指定一個(gè)參數(shù),這個(gè)參數(shù)指定了當(dāng)需要判決master為不可用,并且進(jìn)行failover時(shí),所需要的sentinel數(shù)量,可以稱(chēng)這個(gè)參數(shù)為票數(shù)

不過(guò),當(dāng)failover主備切換真正被觸發(fā)后,failover并不會(huì)馬上進(jìn)行,還需要sentinel中的大多數(shù)sentinel授權(quán)后才可以進(jìn)行failover。
當(dāng)ODOWN時(shí),failover被觸發(fā)。failover一旦被觸發(fā),嘗試去進(jìn)行failover的sentinel會(huì)去獲得“大多數(shù)”sentinel的授權(quán)(如果票數(shù)比大多數(shù)還要大的時(shí)候,則詢(xún)問(wèn)更多的sentinel)
這個(gè)區(qū)別看起來(lái)很微妙,但是很容易理解和使用。例如,集群中有5個(gè)sentinel,票數(shù)被設(shè)置為2,當(dāng)2個(gè)sentinel認(rèn)為一個(gè)master已經(jīng)不可用了以后,將會(huì)觸發(fā)failover,但是,進(jìn)行failover的那個(gè)sentinel必須先獲得至少3個(gè)sentinel的授權(quán)才可以實(shí)行failover。
如果票數(shù)被設(shè)置為5,要達(dá)到ODOWN狀態(tài),必須所有5個(gè)sentinel都主觀(guān)認(rèn)為master為不可用,要進(jìn)行failover,那么得獲得所有5個(gè)sentinel的授權(quán)。


選舉領(lǐng)頭sentinel(即領(lǐng)導(dǎo)者選舉)
一個(gè)redis服務(wù)被判斷為客觀(guān)下線(xiàn)時(shí),多個(gè)監(jiān)視該服務(wù)的sentinel協(xié)商,選舉一個(gè)領(lǐng)頭sentinel,對(duì)該redis服務(wù)進(jìn)行故障轉(zhuǎn)移操作。選舉領(lǐng)頭sentinel遵循以下規(guī)則:
1)所有的sentinel都有公平被選舉成領(lǐng)頭的資格。
2)所有的sentinel都有且只有一次將某個(gè)sentinel選舉成領(lǐng)頭的機(jī)會(huì)(在一輪選舉中),一旦選舉某個(gè)sentinel為領(lǐng)頭,不能更改。
3)sentinel設(shè)置領(lǐng)頭sentinel是先到先得,一旦當(dāng)前sentinel設(shè)置了領(lǐng)頭sentinel,以后要求設(shè)置sentinel為領(lǐng)頭請(qǐng)求都會(huì)被拒絕。
4)每個(gè)發(fā)現(xiàn)服務(wù)客觀(guān)下線(xiàn)的sentinel,都會(huì)要求其他sentinel將自己設(shè)置成領(lǐng)頭。
5)當(dāng)一個(gè)sentinel(源sentinel)向另一個(gè)sentinel(目sentinel)發(fā)送is-master-down-by-addr ip port current_epoch runid命令的時(shí)候,runid參數(shù)不是*,而是sentinel運(yùn)行id,就表示源sentinel要求目標(biāo)sentinel選舉其為領(lǐng)頭。
6)源sentinel會(huì)檢查目標(biāo)sentinel對(duì)其要求設(shè)置成領(lǐng)頭的回復(fù),如果回復(fù)的leader_runid和leader_epoch為源sentinel,表示目標(biāo)sentinel同意將源sentinel設(shè)置成領(lǐng)頭。
7)如果某個(gè)sentinel被半數(shù)以上的sentinel設(shè)置成領(lǐng)頭,那么該sentinel既為領(lǐng)頭。
8)如果在限定時(shí)間內(nèi),沒(méi)有選舉出領(lǐng)頭sentinel,暫定一段時(shí)間,再選舉。


為什么要選領(lǐng)導(dǎo)者?
簡(jiǎn)單來(lái)說(shuō),就是因?yàn)橹荒苡幸粋€(gè)sentinel節(jié)點(diǎn)去完成故障轉(zhuǎn)移。
sentinel is-master-down-by-addr這個(gè)命令有兩個(gè)作用,一是確認(rèn)下線(xiàn)判定,二是進(jìn)行領(lǐng)導(dǎo)者選舉。
選舉過(guò)程:
1)每個(gè)做主觀(guān)下線(xiàn)的sentinel節(jié)點(diǎn)向其他sentinel節(jié)點(diǎn)發(fā)送上面那條命令,要求將它設(shè)置為領(lǐng)導(dǎo)者。
2)收到命令的sentinel節(jié)點(diǎn)如果還沒(méi)有同意過(guò)其他的sentinel發(fā)送的命令(還未投過(guò)票),那么就會(huì)同意,否則拒絕。
3)如果該sentinel節(jié)點(diǎn)發(fā)現(xiàn)自己的票數(shù)已經(jīng)過(guò)半且達(dá)到了quorum的值,就會(huì)成為領(lǐng)導(dǎo)者
4)如果這個(gè)過(guò)程出現(xiàn)多個(gè)sentinel成為領(lǐng)導(dǎo)者,則會(huì)等待一段時(shí)間重新選舉。


Redis Sentinel的主從切換方案
Redis 2.8版開(kāi)始正式提供名為Sentinel的主從切換方案,通俗的來(lái)講,Sentinel可以用來(lái)管理多個(gè)Redis服務(wù)器實(shí)例,可以實(shí)現(xiàn)一個(gè)功能上實(shí)現(xiàn)HA的集群,Sentinel主要負(fù)責(zé)三個(gè)方面的任務(wù):
1)監(jiān)控(Monitoring):Sentinel 會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。
2)提醒(Notification):當(dāng)被監(jiān)控的某個(gè) Redis 服務(wù)器出現(xiàn)問(wèn)題時(shí), Sentinel 可以通過(guò) API 向管理員或者其他應(yīng)用程序發(fā)送通知。
3)自動(dòng)故障遷移(Automatic failover):當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí), Sentinel 會(huì)開(kāi)始一次自動(dòng)故障遷移操作, 它會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器, 并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器;當(dāng)客戶(hù)端試圖連接失效的主服務(wù)器時(shí), 集群也會(huì)向客戶(hù)端返回新主服務(wù)器的地址, 使得集群可以使用新主服務(wù)器代替失效服務(wù)器。

Redis Sentinel 是一個(gè)分布式系統(tǒng), 可以在一個(gè)架構(gòu)中運(yùn)行多個(gè) Sentinel 進(jìn)程(progress), 這些進(jìn)程使用流言協(xié)議(gossip protocols)來(lái)接收關(guān)于主服務(wù)器是否下線(xiàn)的信息, 并使用投票協(xié)議(agreement protocols)來(lái)決定是否執(zhí)行自動(dòng)故障遷移, 以及選擇哪個(gè)從服務(wù)器作為新的主服務(wù)器。
一個(gè)簡(jiǎn)單的主從結(jié)構(gòu)加sentinel集群的架構(gòu)圖如下:

上圖是一主一從節(jié)點(diǎn),加上兩個(gè)部署了sentinel的集群,sentinel集群之間會(huì)互相通信,溝通交流redis節(jié)點(diǎn)的狀態(tài),做出相應(yīng)的判斷并進(jìn)行處理,這里的主觀(guān)下線(xiàn)狀態(tài)和客觀(guān)下線(xiàn)狀態(tài)是比較重要的狀態(tài),它們決定了是否進(jìn)行故障轉(zhuǎn)移
可以 通過(guò)訂閱指定的頻道信息,當(dāng)服務(wù)器出現(xiàn)故障得時(shí)候通知管理員
客戶(hù)端可以將 Sentinel 看作是一個(gè)只提供了訂閱功能的 Redis 服務(wù)器,你不可以使用 PUBLISH 命令向這個(gè)服務(wù)器發(fā)送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過(guò)訂閱給定的頻道來(lái)獲取相應(yīng)的事件提醒。一個(gè)頻道能夠接收和這個(gè)頻道的名字相同的事件。比如說(shuō), 名為 +sdown 的頻道就可以接收所有實(shí)例進(jìn)入主觀(guān)下線(xiàn)(SDOWN)狀態(tài)的事件。

個(gè)人認(rèn)為,Sentinel實(shí)現(xiàn)的最主要的一個(gè)功能就是能做到自動(dòng)故障遷移,即當(dāng)某一個(gè)master掛了的時(shí)候,可以自動(dòng)的將某一個(gè)slave提升為新的master,且原master的所有slave也都自動(dòng)的將自己的master改為新提升的master,這樣我們的程序的可用性大大提高了。只要redis安裝完成,Sentinel就安裝完成了,Sentinel集成在redis里了。

Sentinel支持集群(可以部署在多臺(tái)機(jī)器上,也可以在一臺(tái)物理機(jī)上通過(guò)多端口實(shí)現(xiàn)偽集群部署)
很顯然,只使用單個(gè)sentinel進(jìn)程來(lái)監(jiān)控redis集群是不可靠的,當(dāng)sentinel進(jìn)程宕掉后(sentinel本身也有單點(diǎn)問(wèn)題,single-point-of-failure)整個(gè)集群系統(tǒng)將無(wú)法按照預(yù)期的方式運(yùn)行。所以有必要將sentinel集群,這樣有幾個(gè)好處:
1)即使有一些sentinel進(jìn)程宕掉了,依然可以進(jìn)行redis集群的主備切換;
2)如果只有一個(gè)sentinel進(jìn)程,如果這個(gè)進(jìn)程運(yùn)行出錯(cuò),或者是網(wǎng)絡(luò)堵塞,那么將無(wú)法實(shí)現(xiàn)redis集群的主備切換(單點(diǎn)問(wèn)題);
3)如果有多個(gè)sentinel,redis的客戶(hù)端可以隨意地連接任意一個(gè)sentinel來(lái)獲得關(guān)于redis集群中的信息。


sentinel集群注意事項(xiàng)
1)只有Sentinel 集群中大多數(shù)服務(wù)器認(rèn)定master主觀(guān)下線(xiàn)時(shí)master才會(huì)被認(rèn)定為客觀(guān)下線(xiàn),才可以進(jìn)行故障遷移,也就是說(shuō),即使不管我們?cè)趕entinel monitor中設(shè)置的數(shù)是多少,就算是滿(mǎn)足了該值,只要達(dá)不到大多數(shù),就不會(huì)發(fā)生故障遷移。
2)官方建議sentinel至少部署三臺(tái),且分布在不同機(jī)器。這里主要考慮到sentinel的可用性,假如我們只部署了兩臺(tái)sentinel,且quorum設(shè)置為1,也可以實(shí)現(xiàn)自動(dòng)故障遷移,但假如其中一臺(tái)sentinel掛了,就永遠(yuǎn)不會(huì)觸發(fā)自動(dòng)故障遷移,因?yàn)橛肋h(yuǎn)達(dá)不到大多數(shù)sentinel認(rèn)定master主觀(guān)下線(xiàn)了。
3)sentinel monitor配置中的master IP盡量不要寫(xiě)127.0.0.1或localhost,因?yàn)榭蛻?hù)端,如jedis獲取master是根據(jù)這個(gè)獲取的,若這樣配置,jedis獲取的ip則是127.0.0.1,這樣就可能導(dǎo)致程序連接不上master
4)當(dāng)sentinel 啟動(dòng)后會(huì)自動(dòng)的修改sentinel.conf文件,如已發(fā)現(xiàn)的master的slave信息,和集群中其它sentinel 的信息等,這樣即使重啟sentinel也能保持原來(lái)的狀態(tài)。注意,當(dāng)集群服務(wù)器調(diào)整時(shí),如更換sentinel的機(jī)器,或者新配置一個(gè)sentinel,請(qǐng)不要直接復(fù)制原來(lái)運(yùn)行過(guò)得sentinel配置文件,因?yàn)槠淅锩孀詣?dòng)生成了以上說(shuō)的那些信息,我們應(yīng)該復(fù)制一個(gè)新的配置文件或者把自動(dòng)生成的信息給刪掉。
5)當(dāng)發(fā)生故障遷移的時(shí)候,master的變更記錄與slave更換master的修改會(huì)自動(dòng)同步到redis的配置文件,這樣即使重啟redis也能保持變更后的狀態(tài)。


每個(gè) Sentinel 都需要定期執(zhí)行的任務(wù)
每個(gè) Sentinel 以每秒鐘一次的頻率向它所知的主服務(wù)器、從服務(wù)器以及其他 Sentinel 實(shí)例發(fā)送一個(gè) PING 命令。
如果一個(gè)實(shí)例(instance)距離最后一次有效回復(fù) PING 命令的時(shí)間超過(guò) down-after-milliseconds 選項(xiàng)所指定的值, 那么這個(gè)實(shí)例會(huì)被 Sentinel 標(biāo)記為主觀(guān)下線(xiàn)。一個(gè)有效回復(fù)可以是:+PONG 、 -LOADING 或者 -MASTERDOWN 。
如果一個(gè)主服務(wù)器被標(biāo)記為主觀(guān)下線(xiàn), 那么正在監(jiān)視這個(gè)主服務(wù)器的所有 Sentinel 要以每秒一次的頻率確認(rèn)主服務(wù)器的確進(jìn)入了主觀(guān)下線(xiàn)狀態(tài)。
如果一個(gè)主服務(wù)器被標(biāo)記為主觀(guān)下線(xiàn), 并且有足夠數(shù)量的 Sentinel (至少要達(dá)到配置文件指定的數(shù)量)在指定的時(shí)間范圍內(nèi)同意這一判斷, 那么這個(gè)主服務(wù)器被標(biāo)記為客觀(guān)下線(xiàn)。
在一般情況下, 每個(gè) Sentinel 會(huì)以每 10 秒一次的頻率向它已知的所有主服務(wù)器和從服務(wù)器發(fā)送 INFO 命令。當(dāng)一個(gè)主服務(wù)器被 Sentinel 標(biāo)記為客觀(guān)下線(xiàn)時(shí), Sentinel 向下線(xiàn)主服務(wù)器的所有從服務(wù)器發(fā)送 INFO 命令的頻率會(huì)從 10 秒一次改為每秒一次。
當(dāng)沒(méi)有足夠數(shù)量的 Sentinel 同意主服務(wù)器已經(jīng)下線(xiàn), 主服務(wù)器的客觀(guān)下線(xiàn)狀態(tài)就會(huì)被移除。當(dāng)主服務(wù)器重新向 Sentinel 的PING 命令返回有效回復(fù)時(shí), 主服務(wù)器的主管下線(xiàn)狀態(tài)就會(huì)被移除。


Sentinel之間和Slaves之間的自動(dòng)發(fā)現(xiàn)機(jī)制
雖然sentinel集群中各個(gè)sentinel都互相連接彼此來(lái)檢查對(duì)方的可用性以及互相發(fā)送消息。但是你不用在任何一個(gè)sentinel配置任何其它的sentinel的節(jié)點(diǎn)。因?yàn)閟entinel利用了master的發(fā)布/訂閱機(jī)制去自動(dòng)發(fā)現(xiàn)其它也監(jiān)控了統(tǒng)一master的sentinel節(jié)點(diǎn)。
通過(guò)向名為_(kāi)_sentinel__:hello的管道中發(fā)送消息來(lái)實(shí)現(xiàn)。
同樣,你也不需要在sentinel中配置某個(gè)master的所有slave的地址,sentinel會(huì)通過(guò)詢(xún)問(wèn)master來(lái)得到這些slave的地址的。
每個(gè)sentinel通過(guò)向每個(gè)master和slave的發(fā)布/訂閱頻道__sentinel__:hello每秒發(fā)送一次消息,來(lái)宣布它的存在。
每個(gè)sentinel也訂閱了每個(gè)master和slave的頻道__sentinel__:hello的內(nèi)容,來(lái)發(fā)現(xiàn)未知的sentinel,當(dāng)檢測(cè)到了新的sentinel,則將其加入到自身維護(hù)的master監(jiān)控列表中。
每個(gè)sentinel發(fā)送的消息中也包含了其當(dāng)前維護(hù)的最新的master配置。如果某個(gè)sentinel發(fā)現(xiàn)
自己的配置版本低于接收到的配置版本,則會(huì)用新的配置更新自己的master配置。
在為一個(gè)master添加一個(gè)新的sentinel前,sentinel總是檢查是否已經(jīng)有sentinel與新的sentinel的進(jìn)程號(hào)或者是地址是一樣的。如果是那樣,這個(gè)sentinel將會(huì)被刪除,而把新的sentinel添加上去。


sentinel和redis身份驗(yàn)證
當(dāng)一個(gè)master配置為需要密碼才能連接時(shí),客戶(hù)端和slave在連接時(shí)都需要提供密碼。
master通過(guò)requirepass設(shè)置自身的密碼,不提供密碼無(wú)法連接到這個(gè)master。
slave通過(guò)masterauth來(lái)設(shè)置訪(fǎng)問(wèn)master時(shí)的密碼。
但是當(dāng)使用了sentinel時(shí),由于一個(gè)master可能會(huì)變成一個(gè)slave,一個(gè)slave也可能會(huì)變成master,所以需要同時(shí)設(shè)置上述兩個(gè)配置項(xiàng)。


Sentinel API
在默認(rèn)情況下, Sentinel 使用 TCP 端口 26379 (普通 Redis 服務(wù)器使用的是 6379 )。Sentinel 接受 Redis 協(xié)議格式的命令請(qǐng)求, 所以你可以使用 redis-cli 或者任何其他 Redis 客戶(hù)端來(lái)與 Sentinel 進(jìn)行通訊。有兩種方式可以和 Sentinel 進(jìn)行通訊:
1)是通過(guò)直接發(fā)送命令來(lái)查詢(xún)被監(jiān)視 Redis 服務(wù)器的當(dāng)前狀態(tài), 以及 Sentinel 所知道的關(guān)于其他 Sentinel 的信息, 諸如此類(lèi)。
2)是使用發(fā)布與訂閱功能, 通過(guò)接收 Sentinel 發(fā)送的通知:當(dāng)執(zhí)行故障轉(zhuǎn)移操作, 或者某個(gè)被監(jiān)視的服務(wù)器被判斷為主觀(guān)下線(xiàn)或者客觀(guān)下線(xiàn)時(shí), Sentinel 就會(huì)發(fā)送相應(yīng)的信息。


Sentinel命令(即登錄到sentinel節(jié)點(diǎn)后執(zhí)行的命令,比如執(zhí)行"redis-cli -h 192.168.10.203 -p 26379"命令后,才可以執(zhí)行下面命令)
PING :返回 PONG 。
SENTINEL masters :列出所有被監(jiān)視的主服務(wù)器,以及這些主服務(wù)器的當(dāng)前狀態(tài);
SENTINEL slaves :列出給定主服務(wù)器的所有從服務(wù)器,以及這些從服務(wù)器的當(dāng)前狀態(tài);
SENTINEL get-master-addr-by-name :返回給定名字的主服務(wù)器的 IP 地址和端口號(hào)。如果這個(gè)主服務(wù)器正在執(zhí)行故障轉(zhuǎn)移操作, 或者針對(duì)這個(gè)主服務(wù)器的故障轉(zhuǎn)移操作已經(jīng)完成, 那么這個(gè)命令返回新的主服務(wù)器的 IP 地址和端口號(hào);
SENTINEL reset :重置所有名字和給定模式 pattern 相匹配的主服務(wù)器。pattern 參數(shù)是一個(gè) Glob 風(fēng)格的模式。重置操作清楚主服務(wù)器目前的所有狀態(tài), 包括正在執(zhí)行中的故障轉(zhuǎn)移, 并移除目前已經(jīng)發(fā)現(xiàn)和關(guān)聯(lián)的, 主服務(wù)器的所有從服務(wù)器和 Sentinel ;
SENTINEL failover :當(dāng)主服務(wù)器失效時(shí), 在不詢(xún)問(wèn)其他 Sentinel 意見(jiàn)的情況下, 強(qiáng)制開(kāi)始一次自動(dòng)故障遷移。(不過(guò)發(fā)起故障轉(zhuǎn)移的 Sentinel 會(huì)向其他 Sentinel 發(fā)送一個(gè)新的配置,其他 Sentinel 會(huì)根據(jù)這個(gè)配置進(jìn)行相應(yīng)的更新)

SENTINEL MONITOR 這個(gè)命令告訴sentinel去監(jiān)聽(tīng)一個(gè)新的master
SENTINEL REMOVE 命令sentinel放棄對(duì)某個(gè)master的監(jiān)聽(tīng)
SENTINEL SET 這個(gè)命令很像Redis的CONFIG SET命令,用來(lái)改變指定master的配置。支持多個(gè)。例如以下實(shí)例:SENTINEL SET objects-cache-master down-after-milliseconds 1000
只要是配置文件中存在的配置項(xiàng),都可以用SENTINEL SET命令來(lái)設(shè)置。這個(gè)還可以用來(lái)設(shè)置master的屬性,比如說(shuō)quorum(票數(shù)),而不需要先刪除master,再重新添加master。例如:SENTINEL SET objects-cache-master quorum 5

客戶(hù)端可以通過(guò)SENTINEL get-master-addr-by-name 獲取當(dāng)前的主服務(wù)器IP地址和端口號(hào),以及SENTINEL slaves 獲取所有的Slaves信息。

[root@redis-master ~]# redis-cli -h 192.168.10.202 -p 6379 INFO|grep role
role:slave
[root@redis-master ~]# redis-cli -h 192.168.10.203 -p 6379 INFO|grep role
role:slave
[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 6379 INFO|grep role
role:master
 
登錄任意一個(gè)節(jié)點(diǎn)的sentinel,進(jìn)行相關(guān)命令的操作(下面命令例子中的redisMaster是sentinel監(jiān)控redis主從狀態(tài)時(shí)定義的master名稱(chēng))
 
1)sentinel masters   羅列所有sentinel 監(jiān)視相關(guān)的master
[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379
192.168.10.205:26379> sentinel masters
 
2)sentinel master masterName   列出一個(gè)master相關(guān)的的信息
[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379
192.168.10.205:26379> sentinel master redisMaster
 
3)sentinel slaves masterName   列出一個(gè)master相應(yīng)的slave組相關(guān)的數(shù)據(jù)
[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379
192.168.10.205:26379> sentinel slaves redisMaster
 
4)sentinel sentinels masterName   列出master相關(guān)的sentinels組其他相關(guān)的信息
[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379
192.168.10.205:26379> sentinel sentinels redisMaster
 
5)sentinel get-master-addr-by-name masterName   獲取master-name相關(guān)的 ip addr 的信息
[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379
192.168.10.205:26379> sentinel get-master-addr-by-name redisMaster
1) "192.168.10.205"
2) "6379"

增加或刪除Sentinel
由于有sentinel自動(dòng)發(fā)現(xiàn)機(jī)制,所以添加一個(gè)sentinel到你的集群中非常容易,你所需要做的只是監(jiān)控到某個(gè)Master上,然后新添加的sentinel就能獲得其他sentinel的信息以及master所有的slaves。
如果你需要添加多個(gè)sentinel,建議你一個(gè)接著一個(gè)添加,這樣可以預(yù)防網(wǎng)絡(luò)隔離帶來(lái)的問(wèn)題。你可以每個(gè)30秒添加一個(gè)sentinel。最后你可以用SENTINEL MASTER mastername來(lái)檢查一下是否所有的sentinel都已經(jīng)監(jiān)控到了master。
刪除一個(gè)sentinel顯得有點(diǎn)復(fù)雜:因?yàn)閟entinel永遠(yuǎn)不會(huì)刪除一個(gè)已經(jīng)存在過(guò)的sentinel,即使它已經(jīng)與組織失去聯(lián)系很久了。
要想刪除一個(gè)sentinel,應(yīng)該遵循如下步驟:
1)停止所要?jiǎng)h除的sentinel
2)發(fā)送一個(gè)SENTINEL RESET * 命令給所有其它的sentinel實(shí)例,如果你想要重置指定master上面的sentinel,只需要把*號(hào)改為特定的名字,注意,需要一個(gè)接一個(gè)發(fā),每次發(fā)送的間隔不低于30秒。
3)檢查一下所有的sentinels是否都有一致的當(dāng)前sentinel數(shù)。使用SENTINEL MASTER mastername 來(lái)查詢(xún)。


刪除舊master或者不可達(dá)slave
sentinel永遠(yuǎn)會(huì)記錄好一個(gè)Master的slaves,即使slave已經(jīng)與組織失聯(lián)好久了。這是很有用的,因?yàn)閟entinel集群必須有能力把一個(gè)恢復(fù)可用的slave進(jìn)行重新配置。
并且,failover后,失效的master將會(huì)被標(biāo)記為新master的一個(gè)slave,這樣的話(huà),當(dāng)它變得可用時(shí),就會(huì)從新master上復(fù)制數(shù)據(jù)。
然后,有時(shí)候你想要永久地刪除掉一個(gè)slave(有可能它曾經(jīng)是個(gè)master),你只需要發(fā)送一個(gè)SENTINEL RESET master命令給所有的sentinels,它們將會(huì)更新列表里能夠正確地復(fù)制master數(shù)據(jù)的slave。


發(fā)布與訂閱信息(sentinel的日志文件里可以看到這些信息)
客戶(hù)端可以將 Sentinel 看作是一個(gè)只提供了訂閱功能的 Redis 服務(wù)器:你不可以使用 PUBLISH 命令向這個(gè)服務(wù)器發(fā)送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過(guò)訂閱給定的頻道來(lái)獲取相應(yīng)的事件提醒。


一個(gè)頻道能夠接收和這個(gè)頻道的名字相同的事件。比如說(shuō), 名為 +sdown 的頻道就可以接收所有實(shí)例進(jìn)入主觀(guān)下線(xiàn)(SDOWN)狀態(tài)的事件。


通過(guò)執(zhí)行 "PSUBSCRIBE * "命令可以接收所有事件信息(即訂閱所有消息)。

以下列出的是客戶(hù)端可以通過(guò)訂閱來(lái)獲得的頻道和信息的格式:第一個(gè)英文單詞是頻道/事件的名字, 其余的是數(shù)據(jù)的格式。


注意, 當(dāng)格式中包含 instance details 字樣時(shí), 表示頻道所返回的信息中包含了以下用于識(shí)別目標(biāo)實(shí)例的內(nèi)容.


以下是所有可以收到的消息的消息格式,如果你訂閱了所有消息的話(huà)。第一個(gè)單詞是頻道的名字,其它是數(shù)據(jù)的格式。
注意:以下的instance details的格式是:

如果這個(gè)redis實(shí)例是一個(gè)master,那么@之后的消息就不會(huì)顯示。

+reset-master <instance details> -- 當(dāng)master被重置時(shí).
    +slave <instance details> -- 當(dāng)檢測(cè)到一個(gè)slave并添加進(jìn)slave列表時(shí).
    +failover-state-reconf-slaves <instance details> -- Failover狀態(tài)變?yōu)閞econf-slaves狀態(tài)時(shí)
    +failover-detected <instance details> -- 當(dāng)failover發(fā)生時(shí)
    +slave-reconf-sent <instance details> -- sentinel發(fā)送SLAVEOF命令把它重新配置時(shí)
    +slave-reconf-inprog <instance details> -- slave被重新配置為另外一個(gè)master的slave,但數(shù)據(jù)復(fù)制還未發(fā)生時(shí)。
    +slave-reconf-done <instance details> -- slave被重新配置為另外一個(gè)master的slave并且數(shù)據(jù)復(fù)制已經(jīng)與master同步時(shí)。
    -dup-sentinel <instance details> -- 刪除指定master上的冗余sentinel時(shí) (當(dāng)一個(gè)sentinel重新啟動(dòng)時(shí),可能會(huì)發(fā)生這個(gè)事件).
    +sentinel <instance details> -- 當(dāng)master增加了一個(gè)sentinel時(shí)。
    +sdown <instance details> -- 進(jìn)入SDOWN狀態(tài)時(shí);
    -sdown <instance details> -- 離開(kāi)SDOWN狀態(tài)時(shí)。
    +odown <instance details> -- 進(jìn)入ODOWN狀態(tài)時(shí)。
    -odown <instance details> -- 離開(kāi)ODOWN狀態(tài)時(shí)。
    +new-epoch <instance details> -- 當(dāng)前配置版本被更新時(shí)。
    +try-failover <instance details> -- 達(dá)到failover條件,正等待其他sentinel的選舉。
    +elected-leader <instance details> -- 被選舉為去執(zhí)行failover的時(shí)候。
    +failover-state-select-slave <instance details> -- 開(kāi)始要選擇一個(gè)slave當(dāng)選新master時(shí)。
    no-good-slave <instance details> -- 沒(méi)有合適的slave來(lái)?yè)?dān)當(dāng)新master
    selected-slave <instance details> -- 找到了一個(gè)適合的slave來(lái)?yè)?dān)當(dāng)新master
    failover-state-send-slaveof-noone <instance details> -- 當(dāng)把選擇為新master的slave的身份進(jìn)行切換的時(shí)候。
    failover-end-for-timeout <instance details> -- failover由于超時(shí)而失敗時(shí)。
    failover-end <instance details> -- failover成功完成時(shí)。
    switch-master <master name> <oldip> <oldport> <newip> <newport> -- 當(dāng)master的地址發(fā)生變化時(shí)。通常這是客戶(hù)端最感興趣的消息了。
    +tilt -- 進(jìn)入Tilt模式。
    -tilt -- 退出Tilt模式。

可以看出,使用Sentinel命令和發(fā)布訂閱兩種機(jī)制就能很好的實(shí)現(xiàn)和客戶(hù)端的集成整合:
使用get-master-addr-by-name和slaves指令可以獲取當(dāng)前的Master和Slaves的地址和信息;而當(dāng)發(fā)生故障轉(zhuǎn)移時(shí),即Master發(fā)生切換,可以通過(guò)訂閱的+switch-master事件獲得最新的Master信息。


sentinel.conf中的notification-script
在sentinel.conf中可以配置多個(gè)sentinel notification-script , 如sentinel notification-script mymaster ./check.sh
這個(gè)是在群集failover時(shí)會(huì)觸發(fā)執(zhí)行指定的腳本。腳本的執(zhí)行結(jié)果若為1,即稍后重試(最大重試次數(shù)為10);若為2,則執(zhí)行結(jié)束。并且腳本最大執(zhí)行時(shí)間為60秒,超時(shí)會(huì)被終止執(zhí)行。


目前會(huì)存在該腳本被執(zhí)行多次的問(wèn)題,網(wǎng)上查找資料獲得的解釋是:腳本分為兩個(gè)級(jí)別, SENTINEL_LEADER 和 SENTINEL_OBSERVER ,前者僅由領(lǐng)頭 Sentinel 執(zhí)行(一個(gè) Sentinel),而后者由監(jiān)視同一個(gè) master 的所有 Sentinel 執(zhí)行(多個(gè) Sentinel)。


無(wú)failover時(shí)的配置糾正

即使當(dāng)前沒(méi)有failover正在進(jìn)行,sentinel依然會(huì)使用當(dāng)前配置去設(shè)置監(jiān)控的master。特別是:
1)根據(jù)最新配置確認(rèn)為slaves的節(jié)點(diǎn)卻聲稱(chēng)自己是master(上文例子中被網(wǎng)絡(luò)隔離后的的redis3),這時(shí)它們會(huì)被重新配置為當(dāng)前master的slave。
2)如果slaves連接了一個(gè)錯(cuò)誤的master,將會(huì)被改正過(guò)來(lái),連接到正確的master。


Slave選舉與優(yōu)先級(jí)
當(dāng)一個(gè)sentinel準(zhǔn)備好了要進(jìn)行failover,并且收到了其他sentinel的授權(quán),那么就需要選舉出一個(gè)合適的slave來(lái)做為新的master。

slave的選舉主要會(huì)評(píng)估slave的以下幾個(gè)方面:
1)與master斷開(kāi)連接的次數(shù)
2)Slave的優(yōu)先級(jí)
3)數(shù)據(jù)復(fù)制的下標(biāo)(用來(lái)評(píng)估slave當(dāng)前擁有多少master的數(shù)據(jù))
4)進(jìn)程ID


如果一個(gè)slave與master失去聯(lián)系超過(guò)10次,并且每次都超過(guò)了配置的最大失聯(lián)時(shí)間(down-after-milliseconds),如果sentinel在進(jìn)行failover時(shí)發(fā)現(xiàn)slave失聯(lián),那么這個(gè)slave就會(huì)被sentinel認(rèn)為不適合用來(lái)做新master的。
更嚴(yán)格的定義是,如果一個(gè)slave持續(xù)斷開(kāi)連接的時(shí)間超過(guò)
(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state
就會(huì)被認(rèn)為失去選舉資格。


符合上述條件的slave才會(huì)被列入master候選人列表,并根據(jù)以下順序來(lái)進(jìn)行排序:
1)sentinel首先會(huì)根據(jù)slaves的優(yōu)先級(jí)來(lái)進(jìn)行排序,優(yōu)先級(jí)越小排名越靠前。
2)如果優(yōu)先級(jí)相同,則查看復(fù)制的下標(biāo),哪個(gè)從master接收的復(fù)制數(shù)據(jù)多,哪個(gè)就靠前。
3)如果優(yōu)先級(jí)和下標(biāo)都相同,就選擇進(jìn)程ID較小的那個(gè)。


一個(gè)redis無(wú)論是master還是slave,都必須在配置中指定一個(gè)slave優(yōu)先級(jí)。要注意到master也是有可能通過(guò)failover變成slave的。

如果一個(gè)redis的slave優(yōu)先級(jí)配置為0,那么它將永遠(yuǎn)不會(huì)被選為master。但是它依然會(huì)從master哪里復(fù)制數(shù)據(jù)。


故障轉(zhuǎn)移
所謂故障轉(zhuǎn)移就是當(dāng)master宕機(jī),選一個(gè)合適的slave來(lái)晉升為master的操作,redis-sentinel會(huì)自動(dòng)完成這個(gè),不需要我們手動(dòng)來(lái)實(shí)現(xiàn)。


一次故障轉(zhuǎn)移操作大致分為以下流程:
發(fā)現(xiàn)主服務(wù)器已經(jīng)進(jìn)入客觀(guān)下線(xiàn)狀態(tài)。
對(duì)我們的當(dāng)前集群進(jìn)行自增, 并嘗試在這個(gè)集群中當(dāng)選。
如果當(dāng)選失敗, 那么在設(shè)定的故障遷移超時(shí)時(shí)間的兩倍之后, 重新嘗試當(dāng)選。如果當(dāng)選成功, 那么執(zhí)行以下步驟:
選出一個(gè)從服務(wù)器,并將它升級(jí)為主服務(wù)器。
向被選中的從服務(wù)器發(fā)送 SLAVEOF NO ONE 命令,讓它轉(zhuǎn)變?yōu)橹鞣?wù)器。
通過(guò)發(fā)布與訂閱功能, 將更新后的配置傳播給所有其他 Sentinel , 其他 Sentinel 對(duì)它們自己的配置進(jìn)行更新。
向已下線(xiàn)主服務(wù)器的從服務(wù)器發(fā)送 SLAVEOF 命令, 讓它們?nèi)?fù)制新的主服務(wù)器。
當(dāng)所有從服務(wù)器都已經(jīng)開(kāi)始復(fù)制新的主服務(wù)器時(shí), 領(lǐng)頭 Sentinel 終止這次故障遷移操作。
每當(dāng)一個(gè) Redis 實(shí)例被重新配置(reconfigured) —— 無(wú)論是被設(shè)置成主服務(wù)器、從服務(wù)器、又或者被設(shè)置成其他主服務(wù)器的從服務(wù)器 —— Sentinel 都會(huì)向被重新配置的實(shí)例發(fā)送一個(gè) CONFIG REWRITE 命令, 從而確保這些配置會(huì)持久化在硬盤(pán)里。


Sentinel 使用以下規(guī)則來(lái)選擇新的主服務(wù)器:
在失效主服務(wù)器屬下的從服務(wù)器當(dāng)中, 那些被標(biāo)記為主觀(guān)下線(xiàn)、已斷線(xiàn)、或者最后一次回復(fù) PING 命令的時(shí)間大于五秒鐘的從服務(wù)器都會(huì)被淘汰。
在失效主服務(wù)器屬下的從服務(wù)器當(dāng)中, 那些與失效主服務(wù)器連接斷開(kāi)的時(shí)長(zhǎng)超過(guò) down-after 選項(xiàng)指定的時(shí)長(zhǎng)十倍的從服務(wù)器都會(huì)被淘汰。
在經(jīng)歷了以上兩輪淘汰之后剩下來(lái)的從服務(wù)器中, 我們選出復(fù)制偏移量(replication offset)最大的那個(gè)從服務(wù)器作為新的主服務(wù)器;如果復(fù)制偏移量不可用, 或者從服務(wù)器的復(fù)制偏移量相同, 那么帶有最小運(yùn)行 ID 的那個(gè)從服務(wù)器成為新的主服務(wù)器。

Sentinel 自動(dòng)故障遷移的一致性特質(zhì)
Sentinel 自動(dòng)故障遷移使用 Raft 算法來(lái)選舉領(lǐng)頭(leader) Sentinel , 從而確保在一個(gè)給定的紀(jì)元(epoch)里, 只有一個(gè)領(lǐng)頭產(chǎn)生。

這表示在同一個(gè)紀(jì)元中, 不會(huì)有兩個(gè) Sentinel 同時(shí)被選中為領(lǐng)頭, 并且各個(gè) Sentinel 在同一個(gè)紀(jì)元中只會(huì)對(duì)一個(gè)領(lǐng)頭進(jìn)行投票。

更高的配置紀(jì)元總是優(yōu)于較低的紀(jì)元, 因此每個(gè) Sentinel 都會(huì)主動(dòng)使用更新的紀(jì)元來(lái)代替自己的配置。

簡(jiǎn)單來(lái)說(shuō), 可以將 Sentinel 配置看作是一個(gè)帶有版本號(hào)的狀態(tài)。一個(gè)狀態(tài)會(huì)以最后寫(xiě)入者勝出(last-write-wins)的方式(也即是,最新的配置總是勝出)傳播至所有其他 Sentinel 。

舉個(gè)例子, 當(dāng)出現(xiàn)網(wǎng)絡(luò)分割(network partitions)時(shí), 一個(gè) Sentinel 可能會(huì)包含了較舊的配置, 而當(dāng)這個(gè) Sentinel 接到其他 Sentinel 發(fā)來(lái)的版本更新的配置時(shí), Sentinel 就會(huì)對(duì)自己的配置進(jìn)行更新。

如果要在網(wǎng)絡(luò)分割出現(xiàn)的情況下仍然保持一致性, 那么應(yīng)該使用 min-slaves-to-write 選項(xiàng), 讓主服務(wù)器在連接的從實(shí)例少于給定數(shù)量時(shí)停止執(zhí)行寫(xiě)操作, 與此同時(shí), 應(yīng)該在每個(gè)運(yùn)行 Redis 主服務(wù)器或從服務(wù)器的機(jī)器上運(yùn)行 Redis Sentinel 進(jìn)程。


Sentinel 狀態(tài)的持久化
Sentinel 的狀態(tài)會(huì)被持久化在 Sentinel 配置文件里面。每當(dāng) Sentinel 接收到一個(gè)新的配置, 或者當(dāng)領(lǐng)頭 Sentinel 為主服務(wù)器創(chuàng)建一個(gè)新的配置時(shí), 這個(gè)配置會(huì)與配置紀(jì)元一起被保存到磁盤(pán)里面。這意味著停止和重啟 Sentinel 進(jìn)程都是安全的。

Sentinel 在非故障遷移的情況下對(duì)實(shí)例進(jìn)行重新配置
即使沒(méi)有自動(dòng)故障遷移操作在進(jìn)行, Sentinel 總會(huì)嘗試將當(dāng)前的配置設(shè)置到被監(jiān)視的實(shí)例上面。特別是:

根據(jù)當(dāng)前的配置, 如果一個(gè)從服務(wù)器被宣告為主服務(wù)器, 那么它會(huì)代替原有的主服務(wù)器, 成為新的主服務(wù)器, 并且成為原有主服務(wù)器的所有從服務(wù)器的復(fù)制對(duì)象。
那些連接了錯(cuò)誤主服務(wù)器的從服務(wù)器會(huì)被重新配置, 使得這些從服務(wù)器會(huì)去復(fù)制正確的主服務(wù)器。
不過(guò), 在以上這些條件滿(mǎn)足之后, Sentinel 在對(duì)實(shí)例進(jìn)行重新配置之前仍然會(huì)等待一段足夠長(zhǎng)的時(shí)間, 確保可以接收到其他 Sentinel 發(fā)來(lái)的配置更新, 從而避免自身因?yàn)楸4媪诉^(guò)期的配置而對(duì)實(shí)例進(jìn)行了不必要的重新配置。


總結(jié)來(lái)說(shuō),故障轉(zhuǎn)移分為三個(gè)步驟:

1)從下線(xiàn)的主服務(wù)的所有從服務(wù)里面挑選一個(gè)從服務(wù),將其轉(zhuǎn)成主服務(wù)
sentinel狀態(tài)數(shù)據(jù)結(jié)構(gòu)中保存了主服務(wù)的所有從服務(wù)信息,領(lǐng)頭sentinel按照如下的規(guī)則從從服務(wù)列表中挑選出新的主服務(wù);
刪除列表中處于下線(xiàn)狀態(tài)的從服務(wù);
刪除最近5秒沒(méi)有回復(fù)過(guò)領(lǐng)頭sentinel info信息的從服務(wù);
刪除與已下線(xiàn)的主服務(wù)斷開(kāi)連接時(shí)間超過(guò) down-after-milliseconds*10毫秒的從服務(wù),這樣就能保留從的數(shù)據(jù)比較新(沒(méi)有過(guò)早的與主斷開(kāi)連接);
領(lǐng)頭sentinel從剩下的從列表中選擇優(yōu)先級(jí)高的,如果優(yōu)先級(jí)一樣,選擇偏移量最大的(偏移量大說(shuō)明復(fù)制的數(shù)據(jù)比較新),如果偏移量一樣,選擇運(yùn)行id最小的從服務(wù)。

2)已下線(xiàn)主服務(wù)的所有從服務(wù)改為復(fù)制新的主服務(wù)
挑選出新的主服務(wù)之后,領(lǐng)頭sentinel 向原主服務(wù)的從服務(wù)發(fā)送 slaveof 新主服務(wù) 的命令,復(fù)制新master。

3)將已下線(xiàn)的主服務(wù)設(shè)置成新的主服務(wù)的從服務(wù),當(dāng)其回復(fù)正常時(shí),復(fù)制新的主服務(wù),變成新的主服務(wù)的從服務(wù)
同理,當(dāng)已下線(xiàn)的服務(wù)重新上線(xiàn)時(shí),sentinel會(huì)向其發(fā)送slaveof命令,讓其成為新主的從。

溫馨提示:還可以向任意sentinel發(fā)生sentinel failover 進(jìn)行手動(dòng)故障轉(zhuǎn)移,這樣就不需要經(jīng)過(guò)上述主客觀(guān)和選舉的過(guò)程。

sentinel.conf文件配置參數(shù)解釋

1)sentinel monitor mymaster 192.168.10.202 6379 2
Sentine監(jiān)聽(tīng)的maste地址,第一個(gè)參數(shù)是給master起的名字,第二個(gè)參數(shù)為master IP,第三個(gè)為master端口,第四個(gè)為當(dāng)該master掛了的時(shí)候,若想將該master判為失效,
在Sentine集群中必須至少2個(gè)Sentine同意才行,只要該數(shù)量不達(dá)標(biāo),則就不會(huì)發(fā)生故障遷移。也就是說(shuō)只要有2個(gè)sentinel認(rèn)為master下線(xiàn),就認(rèn)為該master客觀(guān)下線(xiàn),
啟動(dòng)failover并選舉產(chǎn)生新的master。通常最后一個(gè)參數(shù)不能多于啟動(dòng)的sentinel實(shí)例數(shù)。
 
這個(gè)配置是sentinel需要監(jiān)控的master/slaver信息,格式為sentinel monitor <mastername> <masterIP> <masterPort> <quorum> 
其中<quorum>應(yīng)該小于集群中slave的個(gè)數(shù),當(dāng)失效的節(jié)點(diǎn)數(shù)超過(guò)了<quorum>,則認(rèn)為整個(gè)體系結(jié)構(gòu)失效
 
不過(guò)要注意, 無(wú)論你設(shè)置要多少個(gè) Sentinel 同意才能判斷一個(gè)服務(wù)器失效, 一個(gè) Sentinel 都需要獲得系統(tǒng)中多數(shù)(majority) Sentinel 的支持, 才能發(fā)起一次自動(dòng)故障遷移,
并預(yù)留一個(gè)給定的配置紀(jì)元 (configuration Epoch ,一個(gè)配置紀(jì)元就是一個(gè)新主服務(wù)器配置的版本號(hào))。
  
換句話(huà)說(shuō), 在只有少數(shù)(minority) Sentinel 進(jìn)程正常運(yùn)作的情況下, Sentinel 是不能執(zhí)行自動(dòng)故障遷移的。
-----------------------------------------------------------------------------------------------
2)sentinel down-after-milliseconds mymaster 30000
表示master被當(dāng)前sentinel實(shí)例認(rèn)定為失效的間隔時(shí)間。
master在多長(zhǎng)時(shí)間內(nèi)一直沒(méi)有給Sentine返回有效信息,則認(rèn)定該master主觀(guān)下線(xiàn)。也就是說(shuō)如果多久沒(méi)聯(lián)系上redis-servevr,認(rèn)為這個(gè)redis-server進(jìn)入到失效(SDOWN)狀態(tài)。
  
如果服務(wù)器在給定的毫秒數(shù)之內(nèi), 沒(méi)有返回 Sentinel 發(fā)送的 PING 命令的回復(fù), 或者返回一個(gè)錯(cuò)誤, 那么 Sentinel 將這個(gè)服務(wù)器標(biāo)記為主觀(guān)下線(xiàn)(subjectively down,簡(jiǎn)稱(chēng) SDOWN )。
不過(guò)只有一個(gè) Sentinel 將服務(wù)器標(biāo)記為主觀(guān)下線(xiàn)并不一定會(huì)引起服務(wù)器的自動(dòng)故障遷移: 只有在足夠數(shù)量的 Sentinel 都將一個(gè)服務(wù)器標(biāo)記為主觀(guān)下線(xiàn)之后, 服務(wù)器才會(huì)被標(biāo)記為客觀(guān)下線(xiàn)
(objectively down, 簡(jiǎn)稱(chēng) ODOWN ), 這時(shí)自動(dòng)故障遷移才會(huì)執(zhí)行。
將服務(wù)器標(biāo)記為客觀(guān)下線(xiàn)所需的 Sentinel 數(shù)量由對(duì)主服務(wù)器的配置決定。
-----------------------------------------------------------------------------------------------
3)sentinel parallel-syncs mymaster 2
當(dāng)在執(zhí)行故障轉(zhuǎn)移時(shí),設(shè)置幾個(gè)slave同時(shí)進(jìn)行切換master,該值越大,則可能就有越多的slave在切換master時(shí)不可用,可以將該值設(shè)置為1,即一個(gè)一個(gè)來(lái),這樣在某個(gè)
slave進(jìn)行切換master同步數(shù)據(jù)時(shí),其余的slave還能正常工作,以此保證每次只有一個(gè)從服務(wù)器處于不能處理命令請(qǐng)求的狀態(tài)。
  
parallel-syncs 選項(xiàng)指定了在執(zhí)行故障轉(zhuǎn)移時(shí), 最多可以有多少個(gè)從服務(wù)器同時(shí)對(duì)新的主服務(wù)器進(jìn)行同步, 這個(gè)數(shù)字越小, 完成故障轉(zhuǎn)移所需的時(shí)間就越長(zhǎng)。
  
如果從服務(wù)器被設(shè)置為允許使用過(guò)期數(shù)據(jù)集(參見(jiàn)對(duì) redis.conf 文件中對(duì) slave-serve-stale-data 選項(xiàng)的說(shuō)明), 那么你可能不希望所有從服務(wù)器都在同一時(shí)間向新的主服務(wù)器發(fā)送同步請(qǐng)求,
因?yàn)楸M管復(fù)制過(guò)程的絕大部分步驟都不會(huì)阻塞從服務(wù)器, 但從服務(wù)器在載入主服務(wù)器發(fā)來(lái)的 RDB 文件時(shí), 仍然會(huì)造成從服務(wù)器在一段時(shí)間內(nèi)不能處理命令請(qǐng)求: 如果全部從服務(wù)器一起對(duì)新的主
服務(wù)器進(jìn)行同步, 那么就可能會(huì)造成所有從服務(wù)器在短時(shí)間內(nèi)全部不可用的情況出現(xiàn)。
 
當(dāng)新master產(chǎn)生時(shí),同時(shí)進(jìn)行"slaveof"到新master并進(jìn)行"SYNC"的slave個(gè)數(shù)。 
默認(rèn)為1,建議保持默認(rèn)值 
在salve執(zhí)行salveof與同步時(shí),將會(huì)終止客戶(hù)端請(qǐng)求。 
此值較大,意味著"集群"終止客戶(hù)端請(qǐng)求的時(shí)間總和和較大。 
此值較小,意味著"集群"在故障轉(zhuǎn)移期間,多個(gè)salve向客戶(hù)端提供服務(wù)時(shí)仍然使用舊數(shù)據(jù)。 
-----------------------------------------------------------------------------------------------
4)sentinel can-failover mymaster yes
在sentinel檢測(cè)到O_DOWN后,是否對(duì)這臺(tái)redis啟動(dòng)failover機(jī)制
-----------------------------------------------------------------------------------------------
5)sentinel auth-pass mymaster 20180408
設(shè)置sentinel連接的master和slave的密碼,這個(gè)需要和redis.conf文件中設(shè)置的密碼一樣
-----------------------------------------------------------------------------------------------
6)sentinel failover-timeout mymaster 180000
failover過(guò)期時(shí)間,當(dāng)failover開(kāi)始后,在此時(shí)間內(nèi)仍然沒(méi)有觸發(fā)任何failover操作,當(dāng)前sentinel將會(huì)認(rèn)為此次failoer失敗。 
執(zhí)行故障遷移超時(shí)時(shí)間,即在指定時(shí)間內(nèi)沒(méi)有大多數(shù)的sentinel 反饋master下線(xiàn),該故障遷移計(jì)劃則失效
-----------------------------------------------------------------------------------------------
7)sentinel config-epoch mymaster 0
選項(xiàng)指定了在執(zhí)行故障轉(zhuǎn)移時(shí), 最多可以有多少個(gè)從服務(wù)器同時(shí)對(duì)新的主服務(wù)器進(jìn)行同步。這個(gè)數(shù)字越小, 完成故障轉(zhuǎn)移所需的時(shí)間就越長(zhǎng)。
-----------------------------------------------------------------------------------------------
8)sentinel notification-script mymaster /var/redis/notify.sh
當(dāng)failover時(shí),可以指定一個(gè)"通知"腳本用來(lái)告知當(dāng)前集群的情況。
腳本被允許執(zhí)行的最大時(shí)間為60秒,如果超時(shí),腳本將會(huì)被終止(KILL)
-----------------------------------------------------------------------------------------------
9)sentinel leader-epoch mymaster 0
同時(shí)一時(shí)間最多0個(gè)slave可同時(shí)更新配置,建議數(shù)字不要太大,以免影響正常對(duì)外提供服務(wù)。

Sentinel工作原理

首先要能理解SDOWN和ODOWN這兩個(gè)詞的含義,上面已經(jīng)詳細(xì)介紹了它們倆。在此再提一下:
SDOWN:subjectively down,直接翻譯的為"主觀(guān)"失效,即當(dāng)前sentinel實(shí)例認(rèn)為某個(gè)redis服務(wù)為"不可用"狀態(tài).
ODOWN:objectively down,直接翻譯為"客觀(guān)"失效,即多個(gè)sentinel實(shí)例都認(rèn)為master處于"SDOWN"狀態(tài),那么此時(shí)master將處于ODOWN,ODOWN可以簡(jiǎn)單理解為master已經(jīng)被集群確定
為"不可用",將會(huì)開(kāi)啟failover.

SDOWN適合于master和slave,但是ODOWN只會(huì)使用于master;當(dāng)slave失效超過(guò)"down-after-milliseconds"后,那么所有sentinel實(shí)例都會(huì)將其標(biāo)記為"SDOWN"。


1) SDOWN與ODOWN轉(zhuǎn)換過(guò)程:
每個(gè)sentinel實(shí)例在啟動(dòng)后,都會(huì)和已知的slaves/master以及其他sentinels建立TCP連接,并周期性發(fā)送PING(默認(rèn)為1秒)
在交互中,如果redis-server無(wú)法在"down-after-milliseconds"時(shí)間內(nèi)響應(yīng)或者響應(yīng)錯(cuò)誤信息,都會(huì)被認(rèn)為此redis-server處于SDOWN狀態(tài)。
如果SDOWN的server為master,那么此時(shí)sentinel實(shí)例將會(huì)向其他sentinel間歇性(一秒)發(fā)送"is-master-down-by-addr "指令并獲取響應(yīng)信息,如果足夠多的
sentinel實(shí)例檢測(cè)到master處于SDOWN,那么此時(shí)當(dāng)前sentinel實(shí)例標(biāo)記master為ODOWN…其他sentinel實(shí)例做同樣的交互操作。
配置項(xiàng)"sentinel monitor “,如果檢測(cè)到master處于SDOWN狀態(tài)的slave個(gè)數(shù)達(dá)到,那么此時(shí)此sentinel實(shí)例將會(huì)認(rèn)為
master處于ODOWN。每個(gè)sentinel實(shí)例將會(huì)間歇性(10秒)向master和slaves發(fā)送"INFO"指令,如果master失效且沒(méi)有新master選出時(shí),每1秒發(fā)送一次"INFO”;"INFO"的主要目的就是
獲取并確認(rèn)當(dāng)前集群環(huán)境中slaves和master的存活情況。

經(jīng)過(guò)上述過(guò)程后,所有的sentinel對(duì)master失效達(dá)成一致后,開(kāi)始failover.


2) Sentinel與slaves"自動(dòng)發(fā)現(xiàn)"機(jī)制:
在sentinel的配置文件中(local-sentinel.conf),都指定了port,此port就是sentinel實(shí)例偵聽(tīng)其他sentinel實(shí)例建立鏈接的端口.在集群穩(wěn)定后,最終會(huì)每個(gè)sentinel實(shí)例之間都
會(huì)建立一個(gè)tcp鏈接,此鏈接中發(fā)送"PING"以及類(lèi)似于"is-master-down-by-addr"指令集,可用用來(lái)檢測(cè)其他sentinel實(shí)例的有效性以及"ODOWN"和"failover"過(guò)程中信息的交互.

在sentinel之間建立連接之前,sentinel將會(huì)盡力和配置文件中指定的master建立連接.sentinel與master的連接中的通信主要是基于pub/sub來(lái)發(fā)布和接收信息,發(fā)布的信息內(nèi)容包
括當(dāng)前sentinel實(shí)例的偵聽(tīng)端口:
+sentinel sentinel 127.0.0.1:26579 127.0.0.1 26579 …

發(fā)布的主題名稱(chēng)為"sentinel:hello";同時(shí)sentinel實(shí)例也是"訂閱"此主題,以獲得其他sentinel實(shí)例的信息.由此可見(jiàn),環(huán)境首次構(gòu)建時(shí),在默認(rèn)master存活的情況下,所有的
sentinel實(shí)例可以通過(guò)pub/sub即可獲得所有的sentinel信息,此后每個(gè)sentinel實(shí)例即可以根據(jù)+sentinel信息中的"ip+port"和其他sentinel逐個(gè)建立tcp連接即可.不過(guò)需要提醒
的是,每個(gè)sentinel實(shí)例均會(huì)間歇性(5秒)向"sentinel:hello"主題中發(fā)布自己的ip+port,目的就是讓后續(xù)加入集群的sentinel實(shí)例也能或得到自己的信息。
根據(jù)上文,我們知道在master有效的情況下,即可通過(guò)"INFO"指令獲得當(dāng)前master中已有的slave列表;此后任何slave加入集群,master都會(huì)向"主題中"發(fā)布"+slave 127.0.0.1:6579 …",
那么所有的sentinel也將立即獲得slave信息,并和slave建立鏈接并通過(guò)PING檢測(cè)其存活性.

補(bǔ)充一下,每個(gè)sentinel實(shí)例都會(huì)保存其他sentinel實(shí)例的列表以及現(xiàn)存的master/slaves列表,各自的列表中不會(huì)有重復(fù)的信息(不可能出現(xiàn)多個(gè)tcp連接),對(duì)于sentinel將使用ip+port
做唯一性標(biāo)記,
對(duì)于master/slaver將使用runid做唯一性標(biāo)記,其中redis-server的runid在每次啟動(dòng)時(shí)都不同.


3) Leader選舉:
其實(shí)在sentinels故障轉(zhuǎn)移中,仍然需要一個(gè)"Leader"來(lái)調(diào)度整個(gè)過(guò)程:master的選舉以及slave的重配置和同步。當(dāng)集群中有多個(gè)sentinel實(shí)例時(shí),如何選舉其中一個(gè)sentinel為leader呢?

在配置文件中"can-failover""quorum"參數(shù),以及"is-master-down-by-addr"指令配合來(lái)完成整個(gè)過(guò)程。
A) “can-failover"用來(lái)表明當(dāng)前sentinel是否可以參與"failover"過(guò)程,如果為"YES"則表明它將有能力參與"Leader"的選舉,否則它將作為"Observer”,observer參與leader選舉投票但
不能被選舉;
B) "quorum"不僅用來(lái)控制master ODOWN狀態(tài)確認(rèn),同時(shí)還用來(lái)選舉leader時(shí)最小"贊同票"數(shù);
C) “is-master-down-by-addr”,它可以用來(lái)檢測(cè)"ip + port"的master是否已經(jīng)處于SDOWN狀態(tài),不過(guò)此指令不僅能夠獲得master是否處于SDOWN,同時(shí)它還額外的返回當(dāng)前sentinel
本地"投票選舉"的Leader信息(runid);

每個(gè)sentinel實(shí)例都持有其他的sentinels信息,在Leader選舉過(guò)程中(當(dāng)為leader的sentinel實(shí)例失效時(shí),有可能master server并沒(méi)失效,注意分開(kāi)理解),sentinel實(shí)例將從所有的
sentinels集合中去除"can-failover = no"和狀態(tài)為SDOWN的sentinels,在剩余的sentinels列表中按照runid按照"字典"順序排序后,取出runid最小的sentinel實(shí)例,并將它"投票選舉"
為L(zhǎng)eader,并在其他sentinel發(fā)送的"is-master-down-by-addr"指令時(shí)將推選的runid追加到響應(yīng)中。每個(gè)sentinel實(shí)例都會(huì)檢測(cè)"is-master-down-by-addr"的響應(yīng)結(jié)果,如果"投票選舉"的
leader為自己,且狀態(tài)正常的sentinels實(shí)例中,“贊同者"的自己的sentinel個(gè)數(shù)不小于(>=) 50% + 1,且不小與,那么此sentinel就會(huì)認(rèn)為選舉成功且leader為自己。
在sentinel.conf文件中,我們期望有足夠多的sentinel實(shí)例配置"can-failover yes”,這樣能夠確保當(dāng)leader失效時(shí),能夠選舉某個(gè)sentinel為leader,以便進(jìn)行failover。如果leader無(wú)法產(chǎn)生,
比如較少的sentinels實(shí)例有效,那么failover過(guò)程將無(wú)法繼續(xù).


4) failover過(guò)程:
在Leader觸發(fā)failover之前,首先wait數(shù)秒(隨即0~5),以便讓其他sentinel實(shí)例準(zhǔn)備和調(diào)整(有可能多個(gè)leader??),如果一切正常,那么leader就需要開(kāi)始將一個(gè)salve提升為master,此slave
必須為狀態(tài)良好(不能處于SDOWN/ODOWN狀態(tài))且權(quán)重值最低(redis.conf中)的,當(dāng)master身份被確認(rèn)后,開(kāi)始failover
A)"+failover-triggered": Leader開(kāi)始進(jìn)行failover,此后緊跟著"+failover-state-wait-start",wait數(shù)秒。
B)"+failover-state-select-slave": Leader開(kāi)始查找合適的slave
C)"+selected-slave": 已經(jīng)找到合適的slave
D) “+failover-state-sen-slaveof-noone”: Leader向slave發(fā)送"slaveof no one"指令,此時(shí)slave已經(jīng)完成角色轉(zhuǎn)換,此slave即為master
E) “+failover-state-wait-promotition”: 等待其他sentinel確認(rèn)slave
F)"+promoted-slave":確認(rèn)成功
G)"+failover-state-reconf-slaves": 開(kāi)始對(duì)slaves進(jìn)行reconfig操作。
H)"+slave-reconf-sent":向指定的slave發(fā)送"slaveof"指令,告知此slave跟隨新的master
I)"+slave-reconf-inprog": 此slave正在執(zhí)行slaveof + SYNC過(guò)程,如過(guò)slave收到"+slave-reconf-sent"之后將會(huì)執(zhí)行slaveof操作。
J)"+slave-reconf-done": 此slave同步完成,此后leader可以繼續(xù)下一個(gè)slave的reconfig操作。循環(huán)G)
K)"+failover-end": 故障轉(zhuǎn)移結(jié)束
L)"+switch-master":故障轉(zhuǎn)移成功后,各個(gè)sentinel實(shí)例開(kāi)始監(jiān)控新的master。



版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

本文鏈接:

https://blog.csdn.net/weixin_45572139/article/details/106295494








瀏覽 131
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩va| 91国视频| 国产美女自拍| 日本五十路| 91网址| 一区二区三区四区五区无码| 天天干天天天天| 97精品人人A片免费看| 在线观看AV91| 免费看操逼| 操b在线| 国精产品秘成人一区二| 亚洲爆乳无码一区二区三区| 艹逼网站| 91嫖妓站街按店老熟女| 好看的中文字幕av| 国产一区亚洲| 国产人妻一区二区三区欧美毛片| 欧美精品一区二区三区使用方法| 日逼图| 999久久久| 亚洲一区二区精品| 久草资源在线观看| 麻豆国产在线| 五月天综合在线| 日本三级片中文字幕| 国产特黄| 99热| av在线天堂| 四虎无码| 97人妻视频| 高清无码做爱视频| 国内精品久久久久久久| 伊人综合大香蕉| 亚洲三级电影在线观看| 人操人碰| 人妻丰满精品一区二区| 久久亚洲热| 国产一区免费视频| 亚洲图片在线播放| 懂色成人视频在线观看| 日欧美美女逼| 中文字幕免费在线观看| 在线观看日韩| 欧美性爱一区二区| 一级黄色视频在线观看| 欧美综合自拍| 91视频综合网| 91麻豆精品国产91久久久久久久久 | 人妻少妇视频| 精品久久久久久久久久| 99色综合| 欧美日韩视频在线播放| 欧美V∧| 怡春院院成人免费视频| 久久婷婷五月丁香| 婷婷五月亚洲精品AAA片在| 黄色一级aa片| 久久久999精品视频| 日韩欧美一区二区三区不卡| 99精品热| 安徽妇搡BBBB搡BBBB按摩小说| h片在线观看免费| 国产一级片免费看| 国产做爱| 中文资源在线a中文| 吹潮喷水高潮HD| 一级a免一级a做免费线看内裤| 瑟瑟免费视频| 亚洲精品成人无码熟妇在线| 色男天堂| AV网站入口| 柠檬福利第一导航| 青春草视频| 日本Sm/调教/捆绑/紧缚| 成人视频在线播放| 久久久久久AV| 一级片黄色| 日韩精品成人无码免费| 亚洲精品熟女| 狠狠干中文字幕| 国产做受91一片二片老头| 少妇喷水视频| 久久成人网豆花视频| 天天色粽合合合合合合合| 亚洲国产精品精JIZZ老师 | 午夜福利100理论片| 欧美在线一级片| 精品成人在线观看| 亚洲黄色视频在线观看网站| 精品一区二区三区四区学生| 日本爱爱片| 三须三级久久三级久久18| 人人操人人干人人妻| 欧美三级免费| 人妻在线无码| 久久中文字幕无码| 成人毛片在线大全免费| 人妻无码在线观看| 猫咪亚洲AV成人无码电影| 免费观看高清无码视频| 色老板在线精品免费观看| 无码成人在线观看| 青娱在线视频| 亚洲激情精品| 狼人综合影院| 五月天亚洲无码| 成人免费无码A片免费| 学生妹作爱片| 亚洲无码免费视频在线观看| 亚洲日韩网站在线观看| 国产小毛片| 九九伊人大香蕉| 97免费在线视频| 亚洲在线观看网站| 狠狠搞狠狠操| 黄91在线观看| 精品视频在线看| 日韩三级精品| 国产网友自拍| 亚洲A片电影| 成人免费精品视频| 亚洲黄色电影网| 国产成人高清视频| 日韩人妻码一区二区三区| 欧洲成人午夜精品无码区久久| 国产av日韩| 色婷婷六月天| 日本综合久久| 大鸡吧在线视频| 一级A爱爱| 91.xxxxx| 丁香五月av| 91精品久久久久久久| 成人三级片在线观看| 波多野结衣一区二区| 亚洲综合在线视频| 在线免费看AV片| 免费V片在线观看| 亚洲欧美婷婷五月色综合| 亚洲欧洲视频在线观看| 国产精品人妻无码一区牛牛影视| 久久五月亭亭| 不卡成人| 成人v| 一本一道伊人99久久综| 五月伊人激情| 大香蕉网视频| 国产1区| 国产福利在线| 18sav| 一级黄A片| 91丨PORN首页| 国内精品久久久久久久久久变脸| 色老板在线观看视频| 加勒比日韩| av在线资源观看| 男女69视频| 国产美女自拍视频| 亚洲十八禁| 日日干干| 毛片天堂| 操逼三级片| 日本免费版网站nba| 91丨九色丨熟女泻火| 91成人福利视频| 天天狠狠干| 午夜高清无码视频| 91av在线看| 精品人妻一区二区三区在| 中文无码日韩| 欧美AAAAA| 欧美狠狠插| 波多野结衣一级| 黄色电影一级片| 亚洲欧美日韩综合| 成人精品三级AV在线看| 色我影院| 久久影院三级片| 在线免费观看av网站| 青青青亚州视频在线| 无码国产高清| 亚洲性爱一级片| 日本无码专区| 国产午夜视频| 中文无码熟妇一区二区| 欧美成人日韩| 亚洲无码人妻视频| 8x8x黄色| 操逼视频国产| 国产麻豆AⅤMDMD0071| av无码导航| 一本色道久久综合无码人妻四虎| 91人妻人人澡人人爽精品| 欧美三级网站| 免费观看高清无码视频| 国产一区二区波多野结衣| 国产酒店自拍| 亚洲视频一区二区三区四区娇小视频在线观看视频 | 天天无码视频| AAAA毛片| 久艹视频在线观看| 日韩成人无| 色婷婷香蕉在线一区二区| 91精品久久久久久久久久久久| 人人色人人操人人干| 色丁香五月婷婷| 欧美日韩成人电影| 亚洲成人免费福利| 成年人AV| 操鸡巴网站| 日韩中文字幕人妻| 91精品一区| 操你啦青青草| 中文字幕乱码中文乱码图片| 少妇推油呻吟白浆啪啪成人片| 欧美成人免费网站| 亚洲AV成人无码网天堂| 四虎激情影院| 亚洲黄色视频在线观看网站| 无码在线不卡| 九九热精品视频在线播放| 黄色视频在线免费看| 亚洲中文字幕日本| 一区视频免费观看| 国产精品a久久久久| 国产女人18毛片18精品| 91无码一区二区三区在线| 深爱五月天| 一级黄色免费看| 丰满少妇在线观看网站| 西西444www大胆高清图片| av操操操| 免费网站观看www在线观| 欧美一级免费观看| 欧美日本国产| 亚洲av二区| 777三级| 无码成人A片在线观看| 黄色片在线播放| 玖玖热在线视频| 后入av| 无码人妻精品一区二区蜜桃91| 婷婷五月在线视频| 国产三级AV在线观看| 日韩无码AV中文字幕| 亚洲AV无码精品成人| 国产午夜无码福利视频| 婷婷视频网站| 日本69AV| 黄色影院在线观看| 亚洲性爱在线| 青青久久91| 欧美一级AA大片免费看视频| 2021无码| 久热9191| 久操网在线| 国产无码区| 91在线视频| 天天日天天噜| 日韩精品一区二区在线观看| 激情五月综合网| 毛片黄片| 黄片无码视频| 久久久福利视频| 久久青留社区金玉| 超碰成人欧美| 丁香五月影院| 日韩无码人妻久久一区二区三区| 色吧超碰| 91精品国产三级| 日本操骚逼| 欧美视频一| 久久午夜电影| AV免费网站| 欧美一级操逼视频| 97人妻精品一区二区三区图片| 精品香蕉视频| 成人无码欧美大片免费看| 99热综合在线| 亚洲免费高清视频| 九九九色视频| 久操亚洲| 苍井空无码| 五月天黄色电影网站| sm在线观看| av在线无码| 亚洲黄片在线| 男女日皮的视频| 麻豆乱婬一区二区三区| 先锋影音男人资源站| 中文字幕乱码中文字幕| 一区二区三区久久久| 国产精品自产拍| 日韩家庭乱伦| 欧美一二三区黄色免费视屏| 100国产精品人妻无码| 亚洲无码视频网站| 久久成人A片| 婷婷毛片| 精品国产无码怀孕| 一区二区三区国产精品| 欧美性受XXXX黑人XYX性爽冫 | 国产一级AA大片毛片| 91成人福利视频| 日本操B| 色综合社区| 欧美成人视屏| 日本一级特黄电影| 成人无码精品亚洲| 国产成人精品无码免费| 久草三级片| 97在线视频免费观看| 老女人操逼视频| 一区二区三区无码专区| 成人电影一区| 性欧美一区二区| 亚洲美女操| 日韩无码高清视频| 青青草娱乐视频| 天堂网av在线| 小黄片在线免费观看| 久久久精品免费视频| 无码视频在线| 51精品日本| 国产激情无码视频| 91精品少妇| 人人爱,人人操| 高清av免费| 人成免费在线视频| 久热中文字幕| 亚洲狼人综合网| 亚洲精品视频无码| 午夜精品久久久久久久99热精东| 久久精品中文| 久久这里有精品视频| 国产精品第二页| 欧美日韩在线免费观看| 91爱爱·com| 久久精品视频在线观看| 国内自拍欧美| 色婷婷AV国产精品| 大香蕉久久久久久久| 欧美一区二区三区精品| 亚洲精品字幕久久久久| 亚久久| 免费成人黄视频| 成人性爱视频在线播放| 99热8| 晚上碰视频| 大香蕉视频网| 人人操人人妻人人看| 强辱丰满人妻HD中文字幕| 亚洲图片中文字幕| 女人AV天堂| 丁香激情视频| 91导航| 性爱视频91| 一级A级毛片| 欧美性爱操逼视频| 亚洲成人视频免费在线观看| 日本成人视频在线免费播放| 日韩激情一区| 欧美操操操| 91国内精品视频| 欧美色图在线观看| 欧美精产国品一二三区别| 日本黄色免费视频| 亚洲成人电影无码| 狠狠的日| 中文字幕VA| 天天拍天天干| 国产免费观看视频| 久久久一区二区| 精品成人在线视频| 黄色在线网站| 又黄又爽的视频| 日本三级网站| 欧一美一婬一伦一区二区三区自慰, | 日本成人电影在线观看| 免费中文资源在线观看| 国产多人搡BBBB槡BBBB| AV你懂得| 在线18禁| 北条麻妃一区二区三区在线 | 69视频网站| 色狠久| 婷婷日韩| 99成人网站| 日韩操逼视频| 免费18禁网站| 免费无码A片在线观看全| 无码一区二区三区在线观看| 国产综合亚洲精品一区二| 青娱乐AV在线| 91视频免费在线看| 91绿帽人妻-ThePorn| 亚洲午夜激情电影| 人人妻人人澡人人爽人人| 亚洲AⅤ无码一区二区波多野按摩 69国产成人综合久久精品欧美 | 91亚洲精品乱码久久久久久蜜桃| 一卡二卡久久| 中文字幕日韩在线视频| av青草| 乱伦91| 蜜臀av在线播放| 一级黄色蜜芽视频| 无码一区二区三区在线观看| 性满足BBwBBWBBw| 日本超碰在线| 苍井空视频| 中文字幕在线观看av| 伊人久久香蕉网| 天堂在线视频| 国产精品成人一区二区| 91丨PORNY丨在线中文| 可以免费看的av| PORNY九色视频9l自拍| 天天做天天爱| 欧美精品亚洲| 欧美专区一区| 国内老熟妇对白HDXXXX| 天天做天天日| 亚洲操操操| 91精品国产一区二区| 嫩草视频在线观看免费网站| 国产一卡二卡在线| 在线中文AV| 亚洲黄色电影网站| 亚洲无码视频看看| 五月丁香六月情| 999免费视频| 成人毛片一区二区三区无码 | 美日韩综合| 天天操免费视频| 就爱搞搞| 天天射综合| 欧美丰满美乳XXⅩ高潮www| 亚洲成a人无码| 青青草在线视频免费观看| 亚洲五区| 午夜成人福利视频在线观看 | 亚洲无码手机在线观看| 国产小毛片| 欧美一级黄色电影| 国产99久久久| 美女啪啪网站| 日韩欧美爱爱| 99精品视频国产| 青青青在线| 91在线一区二区| 国产三级性爱视频| 91在线免费视频| JLZZJLZZ亚洲女人| 96精品| 亚洲va在线va天堂va偷拍| 成人黄色AV| 波多野结衣视频在线观看| 51妺妺嘿嘿午夜成人A片| 无码伦理| 另类视频区| 自拍偷拍国产| 91中文字幕在线播放| 国产精品一级二级三级| 人人人人人操| 特黄AAAAAAAAA真人毛片| 亚洲日韩免费在线观看| 日韩免费A片| 激情无码一区二区三区| 99精品视频北条麻妃国产版| 婷婷丁香激情| 秘亚洲国产精品成人网站| 特级西西444WWW高清大视频 | 日韩美女久久| 手机毛片在线播放| 日韩福利在线| 91超碰人人| 成人精品永久免费视频99久久精品 | 欧美天堂成人三级| 2018最好看的中文字幕高清电影 | 国产三级电影| 亚洲AV成人无码精品直播在线| 少婦揉BBBB揉BBBB揉| 国产中文字幕AV在线播放| 久久黄色网址| 中文字幕第72页| 三级国产网站| 午夜视频福利| 18AV在线观看| 国产精品卡一| 亚洲第一中文字幕网| 中文字幕亚洲区| 91探花在线播放| 国产成人毛片18女人18精品| 嫩BBB嫩BBB嫩BBB| 在线观看免费国产| 蜜桃影院| 精品一区二区三区毛片| 国产精品99久久久久的广告情况 | 日本成人A片| 亚洲人成高清| 超碰中文字幕| 国产成人自拍在线| aaa成人| 91一区二区在线播放精品| 操东北老女人| 丰满岳乱妇一区二区三区| 国产亚洲精品成人a| 精品国产乱码久久久久夜深人妻 | 亚洲性夜夜天天天天天天| 懂色av,蜜臀AV粉嫩av| 啪啪网站免费观看| 午夜精品久久久久久久99热精东| 久久偷拍视频| 九九热热| www.插插| 特黄色A级片视频| 俺来也官网欧美久久精品| 亚洲视频二区| 精品无码一区二区三区免费| 国产69视频在线观看| 久久久久久97电影院电影院无码| 中文字幕在线观看日韩| 亚洲无码在线视频观看| 在线a视频免费观看| 一品国精和二品国精的文化意义| 色男人色天堂| 成人精品水蜜桃| 男女av免费观看| 成人国产AV网站| 夜夜骚av.一区二区三区| 亚洲视频中文字幕在线观看| 西西人体视频| 女人18片毛片60分钟翻译| 国产AV高清| 日韩AV高清| 午夜啊啊啊| 欧美熟妇高潮流白浆| 欧美自拍一区| 高清无码网站| 91aaa在线观看| 911国产精品| 亚洲一线视频| 黄色的视频网站| 中字无码| www超碰| 亚洲AV小说| 人操人操人操| 樱桃Av| 人妻无码中文久久久久专区| 国产女18毛片多18精品| 一级a一级a爱片免费免免高潮| 你懂的视频在线播放| 丁香婷婷网| 搡BBBB搡BBB搡五十粉嫩| 色婷婷综合在线| 三级片在线网站| 亚洲一区二区在线播放| 在线观看国产一级片| 做爱网站在线观看| 久久一级片| 91免费小视频| www四虎com| 毛片操逼| 韩日av| 成人免费无码激情AV片| 狼人伊人综合| 黄色片在线免费观看| 中文字幕-区二区三区四区视频中国| 精品无码一区二区三区的天堂| 性爱免费视频网站| 中国老少配BBwBBwBBW| 色丁香视频在线观看的| 国产精品秘久久久久久久久| www.国产精品| 国产原创精品| 中文字幕亚洲视频在线观看 | 国产三级片精品| 成人伊人电影| 四虎成人精品永久免费AV九九| 豆花无码视频一区二区| 无限高潮| 亚洲成人高清| 女人一级A片色黄情免费| 国产欧美综合在线| 日韩爆乳在线| 欧美日韩国产成人综合| 国产成人黄色片| 操逼无码精品| 淫荡少妇美红久久久久久久久久| 亚洲vs无码秘蜜桃少妇| 四川女人毛多水多A片| 亚洲精品成AV人片天堂无码| 日本AAAA片| 日本一区免费观看| 不卡无码免费视频| 成人手机看片| 久久久一区二区三区四曲免费听| 国产精品色哟哟| 婷婷香蕉| 国产精品成人99一区无码| 中文无码第一页| 国产jizz| 尤物视频在线观看视频| 四虎亚洲无码| 成人黄色视频网| 国产亚洲色情| 国产狂喷水潮免费网站www| 日韩人妻精品无码| 久久精品三级片| 少妇搡BBBB搡BBB搡视频一级| 亚洲欧美日本在线观看| 精品国产偷拍| 色婷婷小说| 青娱乐日韩| 久视频在线观看| 不卡无码中文字幕| 亚洲欧洲自拍| 九九九色视频| 91国产精品视频在线| 日本三级片在线| 欧美中文字幕在线| 亚洲天天操| 欧美色图15P| 三级三级久久三级久久18| 日本精品在线视频| 亚洲福利在线观看视频| 麻豆黄色片| 国产精品成人免费视频| 影音先锋乱伦| 韩国免费一级a一片在线播放| 特黄无码| 99精品999| 中文字幕无码一区二区三区一本久 | 俺来也俺就去www色情网| 无码成人av| 2025国产成人精品一区| 欧美伊人大香蕉| 一起草在线视频| 亚洲中文字幕免费在线观看| 日韩免费小视频| 久久91精品| 精品少妇人妻一区二区| 国语操逼| 欧美操逼在线观看| 大香蕉久久伊人| 大香蕉少妇| 欧美级黑寡妇毛片app| 国产SM视频| 另类老妇奶性生BBwBBw偷拍| 97av在线| 久久久久久久极品内射| 亚洲综合免费观看高清完整版在线观| 婷婷A片| 亚洲色情在线播放| 三级久久网| TokyoKot大交乱无码| 女同一区二区三区| 在线看操逼| 黄色免费在线观看网站| 亚洲AV无码一区二区三区少妇| 久草一区二区三区| 亚洲视频456| 九九热无码| 天天日天天日天天日| 五月天色色小说| 午夜视频99| 偷窥丶亚洲丶熟女| 久久久久久99| 大香蕉福利在线| 人人爱人人操人人爽| 久久精品视频播放| 欧美性爱内射| 国产婬片一级A片AAA毛片AⅤ| 波多野结衣视频在线观看| 久热这里只有| 欧美a片在线看| 婷婷五月综合激情| 456成人| 国产久久性爱| 北条麻妃三区| 肏屄视频网| jizz日韩| 大香蕉AV在线观看| 久久国产欧美| 午夜男人天堂| 蜜桃av一区二区三区| 黄色视频网站在线免费观看 | 亚洲成人一区二区| 国产AV资源| 永井玛丽亚av无码中出流出| 中文字幕你懂的在线三级| 亚洲国产一区二区在线| 欧美aaaaaa| 成人五月天黄色电影| www.无码视频| 无码在线看| 91插插插插| 国产成人综合在线| 亚洲欧美影院| 波多野结衣一区二区三区在线观看| 草久网| 欧美一级特黄A片免费| 亚洲人在线| 在线你懂| 东京热综合网| 国产熟妇码视频黑料| 日韩精品一区二区三区四区蜜桃视频| 欧美色色色网| 香蕉一级视频| 日本天堂网在线观看| 免费国产黄色视频网站| 91亚洲国产成人久久精品网站 | 丰满少妇一区二区三区| 色色9999| 日韩AV在线电影| 婷婷久久五月天| 肏少妇女情人大骚逼直播一区二区| 日韩乱轮小说与视频| 一级a在线| 国产伦精品一区二区三区妓女下载| 在线观看亚| 久操久| 国产视频1区| 国产成人精品二三区麻豆| 俺来也网| 东京热这里只有精品| 久久久成人网| 午色婷婷国产无码| 五十路義母| 四虎无码视频| 亚洲欧美另类色图| 一区二区有限公司| 婷色| 亚洲AV无码一区| AV电影在线观看| 无码视频在线观看| 99精品欲| 综合网在线| 黄色av免费网站| 久草视频播放| 欧美三级片在线视频| 日本黄色免费看| 99re视频在线观看| 91双飞会所双飞在线| 天天操天天射天天爽| 亚洲日本三级| 亚洲日韩欧美中在线| 欧美性爱xxxx| 日本不卡中文字幕| 国产无码电影| 国产欧美在线综合| 亚洲成人一| 日本黄A三级三级三级| 久久久精品久久久| 日韩激情毛片| 青青草免费公开视频| 欧美黄片免费| 91成人免费电影片| 中文字幕在线观看网| 无码爆操| 艹逼国产| sesese999| 国产三级视频| 黑人av在线观看| 日本免费在线黄色视频| 欧美天天性爱| 一级全黄120分钟免费| 狠狠干在线视频| 欧美三级在线| 久久中文字幕无码| 日本免费黄色小视频| 成人无码电影在线观看| 久久久久99精品成人网站| 青青操在线观看| 亚洲AV秘一区二区色盗战流出| 欧美老女人逼| 9l视频自拍九色9l视频成人| 欧美偷拍精品| 欧美操操| 新亚洲天堂男子Av-| 丰满的人妻一区二区10| 九九热在线精品视频| 亚洲ww| 毛片视频免费观看| 五月天黄色电影| 亚洲综合伊人无码| 影音先锋AV资源在线| 亚洲综合干| 中文在线字幕电视剧免费平台| 国产777| 亚洲三级精品| 久草免费福利| 一道本无码一区| 日韩人妻一区二区三区| 巨い巨乳の少妇あジed2k| 揄拍成人国产精品视频| аⅴ资源新版在线天堂| 午夜天堂精品久久| 欧洲一级片| 国产一级a毛一级a毛片视频黑人| 人妻丰满熟妇av无码| 西西444| 亚洲无码一级| 亚洲欧美成人| 中日韩精品A片中文字幕| 性爱小说视频| 91探花视频在线观看| 99热这里只有精品9| 国产成人高清在线| 国产无码影视| 日韩欧美123| 婷婷五月中文字幕| 无码国产传媒精品一区| 激情另类视频| 免费一级A片在线播放| 日本日韩欧美| 亚洲AV无码成人精品区东京热| 一级A片黄色| 国产一区二区三区在线视频| 高清无码视频免费观看| 欧美区在线观看| 日韩群交视频| 69AV无码| 五月丁香啪| 三级av网站| 特级西西人体444www高清大胆| www.亚洲精品| 色色一区| 亚洲国产高清国产精品| 日本中文字幕亚洲| 第一福利视频导航| 国产精品色情A级片| 清清草在线视频| 北条麻妃av在线播放| 99视频网| 欧美偷拍一区二区| 欧美后门菊门交3p、| 中文字幕11页| 人人摸人人| 大地资源第5页在线| 影音先锋av资源在线| 影音先锋男人站| 美女网站色| 99操逼网| 亚洲一区二区三| 开心激情网站| 免费草逼网站| 五月婷亚洲精品AV天堂| 国产午夜福利电影| 在线不卡中文字幕| 国产精品第二页| 国产ts在线| 国产久久视频在线观看| 狠狠狠狠狠狠狠狠狠| 午夜精品18视频国产17c| 亚洲无码视频在线观看高清| 中文字幕第一页av| 亚洲欧美国产日韩字幕| 无码秘蜜桃一区二区| 加勒比国产在线| 人人澡人人澡人人| 日本无码在线观看| 高清在线无码视频| 自拍偷拍AV| 婷婷综合在线| 天堂中文资源在线观看| AV天天看| 这里只有精品视频| 无码三级午夜久久人妻| 草久网| 欧美色网| 亚洲中文免费观看| 国产在线视频一区| 欧美一级黄色片| 三级视频国产| 伊人视频在线观看| 在线观看免费完整版中文字幕视频| 免费在线观看视频a| 免费视频二区| 6969电视影片最新更新| 操屄在线观看| 婷婷香蕉| A级黄视频| 久久久久麻豆V国产精华液好用吗 色噜噜狠狠一区二区三区牛牛影视 | 激情六月婷婷| 日韩三级麻豆| 杨贵妃一级婬片90分钟| 欧美自拍视频| 国产日韩欧美91| 国产欧美精品一区二区色综合| 欧美日韩性爰视频| 男女av免费观看| 亚洲精品在线观看视频| 肏逼视频免费看| 99福利| 在线观看国产视频| 天天草天天爽| 日本親子亂子倫XXXX50路| 艾操网|