Redis Sentinel集群部署
日期:2016-09-13 13:33:48 / 人氣: 14551
什么是Redis Sentinel
Redis Sentinel是用來實現Redis高可用的一套解決方案。Redis Sentinel由兩個部分組成:由一個或者多個Sentinel實例組成Sentinel系統;由一個主Redis服務器(Master Redis)和多個從Redis服務器(Slave Redis)組成主從備份的Redis系統。
Sentinel系統本身是一個分布式的系統,它的作用是監視Redis服務器,在Master Redis下線時,自動將某個Slave Redis提升為新的主服務器。Redis系統由Master Redis處理客戶端的命令請求,Slave Redis作為主服務器的備份而存在。
Redis Sentinel主要作用
-
監控(Monitoring):Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
-
提醒(Notification):當被監控的某個Redis服務器出現問題時, Sentinel可以通過API向管理員或者其他應用程序發送通知。
-
自動故障遷移(Automatic failover):當一個主服務器不能正常工作時, Sentinel會開始一次自動故障遷移操作,它會將失效主服務器的其中一個從服務器升級為新的主服務器,并讓失效主服務器的其他從服務器改為復制新的主服務器;當客戶端試圖連接失效的主服務器時,集群也會向客戶端返回新主服務器的地址,使得集群可以使用新主服務器代替失效服務器。
Redis Sentinel系統架構圖
Sentinel的原理并不復雜:
-
啟動N個Sentinel實例,這些Sentinel實例會去監控你指定的Redis Master/Slaves。
-
當Redis Master節點掛掉后,Sentinel實例通過ping檢測失敗發現這種情況就認為該節點進入 SDOWN狀態,也就是檢測的Sentinel實例主觀地(Subjectively)認為該Redis Master節點掛掉。
-
當一定數目(Quorum參數設定的Sentinel實例都認為該Master掛掉的情況下,該節點將轉換進入ODOWN狀態,也就是客觀地(Objectively)掛掉的狀態。
-
接下來Sentinel實例之間發起選舉,選擇其中一個Sentinel實例發起failover過程:從Slave中選擇一臺作為新的Master,讓其它Slave從新的Master復制數據,并通過Pub/Sub發布事件。
-
使用者客戶端從任意Sentinel實例獲取Redis配置信息,并監聽(可選)Sentinel發出的事件: SDOWN, ODOWN以及failover等,并做相應主從切換,Sentinel還扮演了服務發現的角色。
-
Sentinel的Leader選舉采用的是Raft協議。
構建Redis Sentinel集群
Redis Sentinel環境準備
主機名 | IP | 端口號 | 角色 |
---|---|---|---|
dev-master-01 | 192.168.2.210 | 6379/26379 | Redis Master/Sentinel |
dev-node-01 | 192.168.2.211 | 6379/26379 | Redis Master/Sentinel |
dev-node-02 | 192.168.2.212 | 6379/26379 | Redis Master/Sentinel |
一個一主多從的Redis系統中,可以使用多個Sentinel進行監控任務以保證系統足夠穩健。此時,不僅Sentinel會同時監控主數據庫和從數據庫,Sentinel之間也會相互監控。在這里,建議大家Sentinel至少部署三個,并且使用奇數個Sentinel。
安裝Redis和Sentinel
在三臺服務器上分別安裝Redis和Sentinel。需要注意的是,如果要給Redis設置密碼,需要在三個Redis的配置文件中設置相同的密碼。
安裝的Redis版本必須在2.8版本以上。
$ apt-get install redis-server redis-sentinel
配置Redis和Sentinel
配置Redis
三臺Redis主機配置類似,只是初次配置時角色不同。這里以主機dev-master-01
為例,其它兩臺按實際情況修改就行了。
Redis默認會綁定到127.0.0.1
,這里要在多臺機器間通信,我們將它綁定到主機IP上。
$ vim /etc/redis/redis.conf
bind 192.168.2.210
如果要給Redis設置密碼,需要在三個Redis的配置文件中設置相同的密碼。
$ vim /etc/redis/redis.conf
requirepass "000000"
設置主從復制
在兩個Slave Redis的配置文件中聲明所從屬的主數據庫。
$ vim /etc/redis/redis.conf
slaveof 192.168.2.210 6379
這里需要注意一點:當一個Master配置需要密碼才能連接時,客戶端和Slave在連接時都需要提供密碼。Master通過requirepass
設置自身的密碼,不提供密碼無法連接到這個Master。Slave通過masterauth
來設置訪問Master時的密碼。
Sentinel可以切換主從數據庫,主數據庫可能會變成從數據庫,所以三臺機器上都需要同時設置requirepass
和masterauth
配置項。
$ vim /etc/redis/redis.conf
requirepass "000000"
masterauth "000000"
配置Sentinel
redis-sentinel軟件包中默認包含了一個名為sentinel.conf
的文件,默認在/etc/redis/sentinel.conf
。這里以主機dev-master-01
為例,其它兩臺配置類似,按實際情況修改就行了。
運行一個Sentinel所需的最少配置如下所示:
$ vim /etc/redis/sentinel.conf
daemonize yes
port 26379
bind 192.168.2.210
sentinel monitor redis-master 192.168.2.210 6379 2
sentinel down-after-milliseconds redis-master 5000
sentinel failover-timeout redis-master 180000
sentinel parallel-syncs redis-master 2
sentinel auth-pass redis-master 000000
sentinel notification-script redis-master /etc/redis/notify.sh
sentinel client-reconfig-script redis-master /etc/redis/failover.sh
logfile /var/log/redis/redis-sentinel.log
以上配置項說明:
-
daemonize yes
以后臺進程模式運行。
-
port 26379
Sentinel實例之間的通訊端口,該端口號默認為26379。
-
bind 192.168.2.210
Sentinel默認會綁定到127.0.0.1
,這里要在多臺機器間通信,我們將它綁定到主機IP上。
-
sentinel monitor redis-master 192.168.2.210 6379 2
Sentinel去監視一個名為redis-master的主服務器,這個主服務器的IP地址為192.168.2.210 ,端口號為6379。將這個主服務器判斷為失效至少需要2個Sentinel同意,一般設置為N/2+1(N為Sentinel總數)。只要同意Sentinel的數量不達標,自動故障遷移就不會執行。
不過要注意,無論你設置要多少個Sentinel同意才能判斷一個服務器失效, 一個Sentinel都需要獲得系統中多數Sentinel的支持,才能發起一次自動故障遷移,并預留一個給定的配置紀元。(configuration Epoch ,一個配置紀元就是一個新主服務器配置的版本號)。
-
sentinel down-after-milliseconds redis-master 5000
down-after-milliseconds
選項指定了Sentinel認為服務器已經斷線所需的毫秒數。如果服務器在給定的毫秒數之內,沒有返回Sentinel發送的PING命令的回復,或者返回一個錯誤,那么Sentinel將這個服務器標記為主觀下線(subjectively down,簡稱SDOWN)。
不過只有一個Sentinel將服務器標記為主觀下線并不一定會引起服務器的自動故障遷移,只有在足夠數量的Sentinel都將一個服務器標記為主觀下線之后,服務器才會被標記為客觀下線(objectively down,簡稱ODOWN), 這時自動故障遷移才會執行。將服務器標記為客觀下線所需的Sentinel數量由對主服務器的配置(sentinel monitor
-
sentinel failover-timeout redis-master 180000
如果在多少毫秒內沒有把宕掉的那臺Master恢復,那Sentinel認為這是一次真正的宕機。在下一次選取時排除該宕掉的Master作為可用的節點,然后等待一定的設定值的毫秒數后再來探測該節點是否恢復,如果恢復就把它作為一臺Slave加入Sentinel監測節點群,并在下一次切換時為他分配一個”選取號”。
-
sentinel parallel-syncs redis-master 2
parallel-syncs
選項指定了在執行故障轉移時,最多可以有多少個從服務器同時對新的主服務器進行同步。這個數字越小,完成故障轉移所需的時間就越長。
如果從服務器被設置為允許使用過期數據集(slave-serve-stale-data
選項), 那么你可能不希望所有從服務器都在同一時間向新的主服務器發送同步請求。因為盡管復制過程的絕大部分步驟都不會阻塞從服務器,但從服務器在載入主服務器發來的RDB文件時,仍然會造成從服務器在一段時間內不能處理命令請求。
如果全部從服務器一起對新的主服務器進行同步,那么就可能會造成所有從服務器在短時間內全部不可用的情況出現。你可以通過將這個值設為1來保證每次只有一個從服務器處于不能處理命令請求的狀態。
-
sentinel auth-pass redis-master 000000
當Master設置了密碼時,Sentinel連接Master和Slave時需要通過設置參數auth-pass
配置相應密碼。
-
sentinel notification-script redis-master /etc/redis/notify.sh
指定Sentinel檢測到該監控的Redis實例failover時調用的報警腳本。腳本被允許執行的最大時間為60秒,超過這個時間腳本會被kill。該配置項可選,但線上系統建議配置。這里的通知腳本簡單的記錄一下failover事件。
# 創建通知腳本
$ vim /etc/redis/notify.sh
#! /bin/bash
echo "master failovered at `date`" > /var/log/redis/redis_issues.log
# 給腳本增加執行權限
$ chmod +x /etc/redis/notify.sh
-
sentinel client-reconfig-script redis-master /etc/redis/failover.sh
指定Sentinel failover之后重配置客戶端時執行的腳本,該配置項可選,但線上系統建議配置。
-
logfile /var/log/redis/redis-sentinel.log
日志文件所在位置,默認在/var/log/redis/redis-sentinel.log。
運行Sentinel
配置完Redis和Sentinel之后,按順序啟動各個角色。啟動順序如下:Master->Slave->Sentinel
,要確保按照這個順序依次啟動。
-
啟動Redis
$ systemctl start redis
-
啟動Sentinel
運行Sentinel有兩種方式:
雖然Redis Sentinel有單獨的軟件安裝包,但實際上它只是一個運行在特殊模式下的Redis實例。當前Redis Stable版已經自帶了redis-sentinel這個工具。你可以在啟動一個普通Redis實例時通過給定--sentinel
選項來啟動Redis Sentinel。
第一種:用單獨的可執行文件redis-sentinel
$ redis-sentinel /etc/redis/sentinel.conf
第二種:使用redis-server的—sentinel選項