Redis服務之高可用組件sentinel

  前文咱們瞭解了redis的經常使用數據類型相關命令的使用和說明,回顧請參考http://www.javashuo.com/article/p-qvvmnuco-nq.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,而後通知管理員;html

  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)。redis

  配置使用sentinel算法

  環境說明bash

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

 

 

 

 

 

 

 

 

 

  架構圖服務器

  提示:從上面的架構圖能夠知道,首先咱們必需要有一個主從架構的集羣,而後在部署sentinel 來對主從同步集羣作監控;架構

  redis主從複製集羣搭建併發

  一、在192.168.0.41/42/43上安裝redis,可使用yum安裝,也可使用編譯安裝,redis安裝請參考http://www.javashuo.com/article/p-ckvacwaq-kp.html分佈式

  二、配置192.168.0.41/42/43上的redis監聽在非本機127.0.0.1上並配置42/43上的redis從屬於192.168.0.413d

  masterrest

  slave01

  slave02

  提示:redis支持在線修改配置,保存配置到配置文件;SLAVEOF 指令用於指定redismaster的ip地址和端口,表示把該redis配置成對應master的slave角色;CONFIG REWRITE是把咱們的配置保存到配置文件;

  在master上查看是否有兩個從節點鏈接到master

  驗證:在master上寫數據,看看是否可以及時同步到兩個slave上?

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

  配置sentinel,讓其監控master

  提示:三個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都啓動起來

  master

  slave01

  slave02

  提示:從上面的信息能夠看到3個sentinel都監空master的ip地址和端口,他們3個的配置文件都是同樣的;

  查看sentinel日誌

  提示:從上面的日誌信息能夠了解到sentinel監控的master是192.168.0.41:6379;而且有兩個slave分別是192.168.0.42:6379和192.168.0.43:6379;

  查看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?

  在slave02上查看主從同步信息

  提示:第一次查看只是告訴咱們master宕機了,第二次查看就告訴咱們當前節點爲master,而且擁有一個slave節點;

  在192.168.0.43上查看主從信息,看看是否指向新的master?

  提示:在slave02上看主從同步信息,能夠看到slave02已經從屬新master了;

  查看故障轉移時 sentinel日誌

  提示:從上面的日誌信息能夠了解到,在從sdown到odown後,就會觸發vote算法開始選舉leader;而後將原master降級爲slave,而後將選舉出來的leader原salve屬性去除(slaveof no one);而後提示新master,而後將剩下的slave從新配置新master爲主;最後是切換master,開始新的監控;

  查看故障 轉移後的 s redis 配置文件

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

  修復舊master 讓其從新上線

  提示:把原master啓動後,它自動就成爲了新主的slave;這主要是由於sentinel在故障轉移時把其配置文件中的slaveof 修改爲新的master地址了;

  在新master上查看主從同步信息

  提示:在沒有恢復原master時,在新master上查看主從同步信息,只能看到一個salve,啓動原master後,在看就有兩個slave是在線;

相關文章
相關標籤/搜索