redis之哨兵集群(2)

2022-07-30 22:09:11 字數 2262 閱讀 9053

前面提到過,如果乙個哨兵在執行過程中發生故障,那麼是不是還能進行主從庫切換

實際上一旦多個例項組成了哨兵集群,即使有哨兵例項出現故障掛掉了,其他哨兵還能繼續協作完成主從庫切換的工作,包括判定主庫是不是處於下線狀態,選擇新主庫,以及通知從庫和客戶端。

配置哨兵所用到的資訊:

sentinel monitor 需要主庫名稱 id 埠號 和哨兵判斷主庫客觀下線所需投票數量

所以為了解決乙個哨兵掛掉,不影響哨兵集群的正常使用,下面需要介紹哨兵集群的組成和執行機制

哨兵集群間的例項可以相互發現主要是要歸功於 redis 提供的 pub/sub 機制,也就是發布 / 訂閱機制。

哨兵例項和主庫建立連線後,就能夠向主庫傳送資訊,比如發布自己的連線資訊如ip和埠號,同時它也可以從主庫上獲得其他哨兵發布的連線資訊,當多個哨兵例項都在主庫上做了發布和訂閱操作後,它們之間就能知道彼此的 ip 位址和埠。

但是在在redis例項上進行訊息發布於訂閱的不止哨兵,所以為了區分不同應用的訊息,redis 會以頻道的形式,對這些訊息進行分門別類的管理。所謂的頻道,實際上就是訊息的類別。當訊息類別相同時,它們就屬於同乙個頻道,反之,則不屬於同乙個頻道,只有訂閱了同乙個頻道的應用,才能通過發布的訊息進行訊息轉換。

在主從集群中,主庫上有乙個名為「__sentinel__:hello」的頻道,不同哨兵就是通過它來相互發現,實現互相通訊的。

當所有哨兵集群之間相互通訊時,哨兵集群就形成了,它們之間可以通過網路連線的方式進行通訊,比如說對主庫有沒有下線這件事兒進行判斷和協商。

哨兵除了彼此之間建立連線外,還需要和從庫建立連線,因為,在哨兵的監控任務中,它需要對主從庫都進行心跳判斷,而且在主從庫切換完成後,它還需要通知從庫,讓它們和新主庫進行同步。

哨兵是如何知道從庫的 ip 位址和埠的呢?

哨兵是如何知道從庫的 ip 位址和埠的呢?

哨兵會向主庫傳送info命令,主庫就會把從庫的列表返回給哨兵,哨兵就可以根據從庫列表中的連線資訊,和每個從庫建立連線,並在這個連線上持續地對從庫進行監控。

通過 pub/sub 機制,哨兵之間可以組成集群,同時,哨兵又通過 info 命令,獲得了從庫連線資訊,也能和從庫建立連線,並進行監控了。通過info資訊還會返回關於主伺服器本身的資訊,包括伺服器執行id以及伺服器記錄的伺服器角色

主從庫切換後,哨兵也需要將新主庫資訊告訴客戶端這個任務。----------

每個哨兵例項也提供 pub/sub 機制,客戶端可以從哨兵訂閱訊息。哨兵提供的訊息訂閱頻道有很多,不同頻道包含了主從庫切換過程中的不同關鍵事件。

客戶端讀取哨兵的配置檔案後,可以獲得哨兵的位址和埠,和哨兵建立網路連線。然後,我們可以在客戶端執行訂閱命令,來獲取不同的事件訊息。

下面列舉了一些常用的事件表

主觀下線事件:+sdown 例項進入主觀下線狀態 -sdown 例項進入主觀下線狀態

+odown:例項進入客觀下線狀態 -odown:例項進入客觀下線狀態

接下來就要介紹,由哪個哨兵例項來進行主從伺服器切換

任何乙個例項只要自身判斷主庫「主觀下線」後,就會給其他例項傳送 is-master-down-by-addr 命令。接著,其他例項會根據自己和主庫的連線情況,做出 y 或 n 的響應,y 相當於贊成票,n 相當於反對票。

當該例項獲得仲裁所需的贊成票數後,就可以標記主庫為客觀下線狀態,這個所需的贊成票數是通過哨兵配置檔案中的 quorum 配置項設定的。

此時,這個哨兵就可以再給其他哨兵傳送命令,表明希望由自己來執行主從切換,並讓所有其他哨兵進行投票。這個投票過程稱為「leader 選舉」。因為最終執行主從切換的哨兵稱為 leader,投票過程就是確定 leader

在投票過程中,任何乙個想成為 leader 的哨兵,要滿足兩個條件:第一,拿到半數以上的贊成票(即n/2 +1票);第二,拿到的票數同時還需要大於等於哨兵配置檔案中的 quorum 值。以 3 個哨兵為例,假設此時的 quorum 設定為 2,那麼,任何乙個想成為 leader 的哨兵只要拿到 2 張贊成票,就可以了。

在投票過程中,如果最終沒有選舉出leader,哨兵集群會等待一段時間(也就是哨兵故障轉移超時時間的 2 倍),再重新選舉。這是因為,哨兵集群能夠進行成功投票,很大程度上依賴於選舉命令的正常網路傳播。如果網路壓力較大或有短時堵塞,就可能導致沒有乙個哨兵能拿到半數以上的贊成票。所以,等到網路擁塞好轉之後,再進行投票選舉,成功的概率就會增加。

易弄混:哨兵會與主從伺服器建立命令連線和訂閱連線,而哨兵與哨兵之間只會建立訂閱連線

每個與sentinel連線的伺服器sentinel即通過命令連線向伺服器的_sentinel_hello 頻道傳送資訊,又通過訂閱連線伺服器的_sentinel_hello頻道接受資訊

Redis 哨兵集群

redis核心技術與實戰 08 哨兵掛了,還能監測主庫狀態,保證服務不間斷嗎?多個例項組成哨兵集群,即使乙個哨兵掛掉了,其他哨兵也可以繼續協作完成主從庫切換的工作,包括判定主庫是不是處於下線狀態,選擇新主庫,以及通知從庫和客戶端。在配置哨兵的資訊時,我們只需要用到下面的這個配置項,設定主庫的 ip ...

Redis高可靠之哨兵集群

a 在主從模式下,如果從庫跪了,客戶端可以繼續向其他從庫傳送請求,進行相關的操作,但是如果主庫跪了,就無法向主庫中寫資料,主庫中的資料也無法同步到從庫.對於高可靠的集群來說,肯定是不可取的.因此需要有乙個角色來做如下相關的事情 如下圖所示 而上述這些事情就是哨兵來做的.a 小菜,你問的問題越來越有水...

redis主從,哨兵集群

準備工作 本文用的linux為centos6.5,redis為5.0.9在兩台伺服器 redis安裝請看 redis版本 5.0.9 主 172.16.38.225 26379 sentinel 26380 主 172.16.38.226 26379 sentinel 26380 redis支援主從...