初始
作用
可以監(jiān)視主服務(wù)器、從服務(wù)器等多種服務(wù)器,甚至還可以監(jiān)視其他的sentinel服務(wù)器;sentinel服務(wù)器和普通服務(wù)器的區(qū)別
sentinel服務(wù)器不使用數(shù)據(jù)庫(kù),因此初始化的時(shí)候不需要RDB或者AOF文件;另外,包括一些操作鍵值對(duì)的命令(SET等),發(fā)布訂閱,腳本,事務(wù)等功能,sentinel服務(wù)器均不使用;sentinel服務(wù)器的命令表中也并沒(méi)有存儲(chǔ)這些命令;客戶端可以對(duì)sentinel服務(wù)器使用的命令僅包括:PING,SENTINEL,INFO,SUBSCRIBE,UNSUBSCRIBE,PSUBSCRIBE,PUNSUBSCRIBE;(新版本中可能會(huì)有增加)命令連接和訂閱連接
sentinel服務(wù)器需要和每一個(gè)由它監(jiān)視的主(從)服務(wù)器創(chuàng)建2個(gè)連接,分別是命令連接和訂閱連接。命令連接的作用是向主(從)服務(wù)器發(fā)送命令以及接收相應(yīng)的回復(fù);訂閱連接的作用是訂閱主(從)服務(wù)器的sentinel:hello頻道,避免頻道發(fā)送的信息丟失;
監(jiān)視網(wǎng)絡(luò)
dict *masters和dict *slaves字典
dict *masters就是sentinel服務(wù)器所監(jiān)視的所有redis服務(wù)器(鍵為服務(wù)器名,值是指向sentinelRedisInstance結(jié)構(gòu)體的指針,該結(jié)構(gòu)體保存著各類(lèi)信息);sentinel服務(wù)器定期通過(guò)命令連接向其監(jiān)控的master服務(wù)器發(fā)送INFO命令,返回的信息中會(huì)包含master服務(wù)器本身的信息(如run id),以及其附屬的slave服務(wù)器,根據(jù)這些信息,sentinel分別創(chuàng)建包含master和slave服務(wù)器的底層結(jié)構(gòu)(兩個(gè)字典,分別代表master和slave,key就是服務(wù)器的地址,value是一個(gè)特制的數(shù)據(jù)結(jié)構(gòu),代表一個(gè)服務(wù)器實(shí)例結(jié)構(gòu))dict *sentinels字典
sentinel通過(guò)命令連接向__sentinel__:hello頻道發(fā)送消息,通過(guò)訂閱連接從__sentinel__:hello接收消息。不僅如此,如果有多個(gè)sentinel監(jiān)視著同一個(gè)服務(wù)器,那么各個(gè)服務(wù)器還可以通過(guò)從頻道接收到的信息感知到其他sentinel的存在,并加到服務(wù)器的實(shí)例結(jié)構(gòu)的dict *sentinels字段中。相互感知到對(duì)方存在的sentinel會(huì)共同建立命令連接(注意,沒(méi)有訂閱連接),形成網(wǎng)絡(luò);主觀下線和客觀下線
sentinel會(huì)定期向其監(jiān)視的服務(wù)器發(fā)送PING命令,探測(cè)回復(fù)是否有效(有效信息包括“+PONG”, "-LOADING", "MASTERDOWN"),如果無(wú)效或無(wú)響應(yīng),則認(rèn)為其主觀下線;當(dāng)判斷某個(gè)服務(wù)器主觀下線以后,sentinel會(huì)和其他sentinel通信,詢(xún)問(wèn)其他sentinel是否認(rèn)為該服務(wù)器主觀下線,如果票數(shù)足夠多,則認(rèn)為其客觀下線,并執(zhí)行故障轉(zhuǎn)移操作;(注意,“客觀下線”也是一種主觀標(biāo)準(zhǔn),前面說(shuō)的“票數(shù)”,是通過(guò)配置文件進(jìn)行配置的,而各個(gè)sentinel的配置文件可能不一樣。舉個(gè)例子,對(duì)于sentinel1來(lái)說(shuō),可能票數(shù)為2的時(shí)候,就認(rèn)為服務(wù)器客觀下線,而對(duì)于sentinel2,可能票數(shù)為5時(shí),才認(rèn)為這個(gè)服務(wù)器客觀下線)領(lǐng)頭sentinel
當(dāng)sentinel認(rèn)為某個(gè)服務(wù)器客觀下線之后,監(jiān)視這個(gè)服務(wù)器的所有sentinel就會(huì)互相發(fā)送命令選舉出領(lǐng)頭sentinel。具體方式也很簡(jiǎn)單,就是先到先得,某個(gè)sentinel發(fā)送命令,要求其他sentinel投他一票,其他sentinel的票數(shù)是先到先得的。最終,如果某個(gè)sentinel得到的票數(shù)超過(guò)一半,就成為最終的領(lǐng)頭sentinel。領(lǐng)頭sentinel的作用就是執(zhí)行故障轉(zhuǎn)移。故障轉(zhuǎn)移
就是挑選出一個(gè)從服務(wù)器變?yōu)橹鞣?wù)器,將有故障的主服務(wù)器在正常之后轉(zhuǎn)為從服務(wù)器,其他從服務(wù)器都改為復(fù)制新的主服務(wù)器;