天天看點

Redis服務之高可用元件sentinel

Redis服務之高可用元件sentinel

Sentinel是一個分布式系統,我們可以在一個架構中運作多個sentinel,這些sentinel程序使用流言協定(gossipprotocols)來接收關于 Master是否下線的資訊,并使用投票協定(Agreement Protocols)來決定是否執行自動故障遷移,以及選擇哪個 Slave 作為新的 Master。每個sentinel程序會向其他sentinel程序、master、slave定時發送消息,以確定對方是否”活”着,如果發現對方在指定配置時間(可配置的)内未得到回應,則暫時認為對方已掉線,也就是所謂的”主觀認為當機” ,英文名稱:Subjective Down,簡稱 SDOWN。

  前文我們了解了redis的常用資料類型相關指令的使用和說明,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13419690.html;今天我們來聊一下redis的高可用元件sentinel;首先來回顧下redis的主從同步,主從同步最主要的作用是讓master的資料在其他伺服器上實時存在副本,起到了備份的效果;對于redis的讀寫來說,主從架構能夠讓讀的請求分散到多個從伺服器上,進而降低了單台redis讀請求的io壓力,同時也提高了redis讀請求的并發能力;通常為了資料的一緻性,從伺服器一旦成為某一台redis的slave,那麼從伺服器上之前有的資料會被清空,然後把master發送過來的資料應用到記憶體,進而實作和master資料一緻;除此之外slave通常會是隻讀屬性,也就說slave端隻能執行讀操作,寫操作會被拒絕,是以寫請求始終是由master來完成;那麼問題來了,對于這種主從複制架構的環境中,如果master當機了,master當機意味着整個系統将不能夠寫資料到redis,很顯然這種情況我們應該及時解決;怎麼解決呢?有沒有這樣的一元件幫我們對master做實時的監控,一旦發現master當機就提升一個slave當選新的master,如果原master還有其他slave,将其他slave都從屬于新的master;除此之外它還應該讓系統在發生切換master時觸發報警通知,讓管理者盡快把壞掉的master修複上線;對,sentinel就有我們上述的這些功能,它能夠監控主從同步叢集中的master節點,在master發生當機後能夠自動故障轉移,将提升一台slave作為新的master,然後通知管理者;

  Sentinel是一個分布式系統,我們可以在一個架構中運作多個sentinel,這些sentinel程序使用流言協定(gossipprotocols)來接收關于 Master是否下線的資訊,并使用投票協定(Agreement Protocols)來決定是否執行自動故障遷移,以及選擇哪個 Slave 作為新的 Master。每個sentinel程序會向其他sentinel程序、master、slave定時發送消息,以確定對方是否”活”着,如果發現對方在指定配置時間(可配置的)内未得到回應,則暫時認為對方已掉線,也就是所謂的”主觀認為當機” ,英文名稱:Subjective Down,簡稱 SDOWN。有主觀當機,肯定就有客觀當機。當多個sentinel程序中多數的sentinel程序在對 Master 做出 SDOWN 的判斷,并且通過 SENTINEL is-master-down-by-addr 指令互相交流之後,得出的 Master Server 下線判斷,這種方式就是“客觀當機”,英文名稱是:Objectively Down, 簡稱 ODOWN。通過一定的 vote 算法,從剩下的 slave 從伺服器節點中,選一台提升為 Master 伺服器節點,然後自動修改相關配置,并開啟故障轉移(failover)。

  配置使用sentinel

  環境說明

角色 ip位址 端口
master 192.168.0.41 6379
slave01 192.168.0.42
slave02 192.168.0.43
sentinel01 26379
sentinel02
sentinel03

  架構圖

Redis服務之高可用元件sentinel

  提示:從上面的架構圖可以知道,首先我們必須要有一個主從架構的叢集,然後在部署sentinel 來對主從同步叢集做監控;

  redis主從複制叢集搭建

  1、在192.168.0.41/42/43上安裝redis,可以使用yum安裝,也可以使用編譯安裝,redis安裝請參考https://www.cnblogs.com/qiuhom-1874/p/13378138.html;

  2、配置192.168.0.41/42/43上的redis監聽在非本機127.0.0.1上并配置42/43上的redis從屬于192.168.0.41

  master

Redis服務之高可用元件sentinel

  slave01

Redis服務之高可用元件sentinel

  slave02

Redis服務之高可用元件sentinel

  提示:redis支援線上修改配置,儲存配置到配置檔案;SLAVEOF 指令用于指定redismaster的ip位址和端口,表示把該redis配置成對應master的slave角色;CONFIG REWRITE是把我們的配置儲存到配置檔案;

  在master上檢視是否有兩個從節點連接配接到master

Redis服務之高可用元件sentinel

  驗證:在master上寫資料,看看是否能夠及時同步到兩個slave上?

Redis服務之高可用元件sentinel
Redis服務之高可用元件sentinel
Redis服務之高可用元件sentinel

  提示:可以看到在主庫上寫資料,從庫上能夠及時的同步主庫上的資料;到此redis的主從叢集就搭建完畢了;

  配置sentinel,讓其監控master

Redis服務之高可用元件sentinel

  提示:三個sentinel的配置都是一樣的,這裡需要明确指定監控主從同步叢集的master的ip位址和端口,以及有效法定票數,有效法定票數指的是至少有多少個sentinel主觀認為master down了,然後才觸發選舉新master操作;通常在這種流言協定中,一般都是大于叢集半數,如果是3台sentinel,至少要2台主觀認為master當機,才開始觸發選舉新master;如果是5台,那至少要3台;如果master配置的有認證密碼,我們還需要在sentinel中指定認證密碼;

  sentinel配置檔案說明

  bind:該指令和redis配置檔案中的bind是同樣的用法,用于指定sentinel的監聽位址;預設不指定,監聽本機所有可用位址;

  protected-mode:指定是否開啟保護模式;

  port:用于指定sentinel的監聽端口;預設是26379

  daemonize:用于指定sentinel是否運作為守護程序,yes表示運作為背景守護程序;no表示不運作為守護程序,直接在前台運作;

  pidfile:指定pid檔案路徑;

  logfile:指定日志檔案路徑;

  dir:指定sentinel的工作路徑;

  sentinel monitor <master-name> <ip> <redis-port> <quorum>:用于指定監控master節點的ip位址和端口以及有效法定票數;其中<master-name>是給監控的master一個名稱,可以随便寫,起辨別的作用;<quorum>表示sentinel叢集的quorum機制,即至少有quorum個sentinel節點同時判定主節點故障時,才認為其真的故障;

  sentinel auth-pass <master-name> <password>:指定master認證密碼;通常都需要設定密碼,并且master的密碼和slave的密碼應該是一樣;

  sentinel down-after-milliseconds <master-name> <milliseconds>:配置監控到指定的叢集的主節點異常狀态持續多久方才将标記為“故障”;

  sentinel parallel-syncs <master-name> <numslaves>:指在failover過程中,能夠被sentinel并行配置的從節點的數量;

  sentinel failover-timeout <master-name> <milliseconds>:sentinel必須在此指定的時長内完成故障轉移操作,否則,将視為故障轉移操作失敗;

  sentinel notification-script <master-name> <script-path>:通知腳本,此腳本被自動傳遞多個參數;

  了解了sentinel的配置檔案,接下我們把3台sentinel都啟動起來

Redis服務之高可用元件sentinel
Redis服務之高可用元件sentinel
Redis服務之高可用元件sentinel

  提示:從上面的資訊可以看到3個sentinel都監控master的ip位址和端口,其實他們3個的配置檔案都是一樣的;

  檢視sentinel日志

Redis服務之高可用元件sentinel

  提示:從上面的日志資訊可以了解到sentinel監控的master是192.168.0.41:6379;并且有兩個slave分别是192.168.0.42:6379和192.168.0.43:6379;

  檢視sentinel狀态

Redis服務之高可用元件sentinel

  提示:它提示我們開啟了保護模式;

  關閉保護模式

Redis服務之高可用元件sentinel

  重新開機sentinel,再次檢視sentinel狀态

[root@master ~]# systemctl restart redis-sentinel.service 
[root@master ~]# ss -tnl
State      Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
LISTEN     0      511                       *:26379                                 *:*                  
LISTEN     0      511                       *:6379                                  *:*                  
LISTEN     0      128                       *:22                                    *:*                  
LISTEN     0      100               127.0.0.1:25                                    *:*                  
LISTEN     0      511                      :::26379                                :::*                  
LISTEN     0      128                      :::22                                   :::*                  
LISTEN     0      100                     ::1:25                                   :::*                  
[root@master ~]# redis-cli -h 192.168.0.41 -p 26379       
192.168.0.41:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.0.41:6379,slaves=2,sentinels=3
192.168.0.41:26379> info clients
# Clients
connected_clients:3
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
192.168.0.41:26379> CLIENT LIST
id=2 addr=192.168.0.42:59048 fd=14 name=sentinel-f60b324b-cmd age=38 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=3 addr=192.168.0.43:37480 fd=15 name=sentinel-eada229c-cmd age=38 idle=1 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=publish
id=4 addr=192.168.0.41:36706 fd=16 name= age=32 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
192.168.0.41:26379> 
      

  提示:從上面的狀态資訊可以看到目前sentinel監控的master是出于正常ok狀态,有兩個slave和3個sentinel;對于192.168.0.41:26379目前有3個用戶端連接配接,二個是sentinel,一個本機;到此3台sentinel搭建啟動完成;

  驗證:把master當機,看看sentinel是否将在兩個從節點選舉一個為新master?是否将另外一個slave重新指向新master?

Redis服務之高可用元件sentinel

  在slave01上檢視主從同步資訊

Redis服務之高可用元件sentinel

  提示:第一次檢視隻是告訴我們master當機了,第二次檢視就告訴我們目前節點為master,并且擁有一個slave節點,這說明已經完成了故障轉移,slave01已經被提升為新的master了;

  在192.168.0.43上檢視主從資訊,看看是否指向新的master?

Redis服務之高可用元件sentinel

  提示:在slave02上看主從同步資訊,可以看到slave02已經從屬新master了;

  檢視故障轉移時 sentinel日志

Redis服務之高可用元件sentinel

  提示:從上面的日志資訊可以了解到,在從sdown到odown後,就會觸發vote算法開始選舉leader;然後将原master降級為slave,然後将選舉出來的leader原salve屬性去除(slaveof no one);然後提升新master,然後将剩下的slave重新配置新master為主;最後是切換master,開始新的監控;

  檢視故障 轉移後的 redis 配置檔案

Redis服務之高可用元件sentinel

  提示:故障轉移後 redis.conf 中的 slaveof 行的 master IP 會被修改,sentinel.conf 中的 sentinel monitor IP 會被修改。同時在sentinel配置檔案的末尾還會有添加known-slave和known-sentinel等資訊;

  修複舊master 讓其重新上線

Redis服務之高可用元件sentinel

  提示:把原master啟動後,它自動就成為了新主的slave;這主要是因為sentinel在故障轉移時把其配置檔案中的slaveof 修改成新的master位址了;

  在新master上檢視主從同步資訊

Redis服務之高可用元件sentinel

  提示:在沒有恢複原master時,在新master上檢視主從同步資訊,隻能看到一個salve,啟動原master後,在看就有兩個slave是線上;

作者:Linux-1874

出處:https://www.cnblogs.com/qiuhom-1874/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.

繼續閱讀