服務項目每一個(gè)設計作品都舉世無雙

當前位置: 主頁> 服務項目> 成功案例>

Redis Sentinel集群部署

日期:2016-09-13 13:33:48 / 人(rén)氣: 3774

Redis Sentinel集群部署

什(shén)麽是Redis Sentinel

Redis Sentinel是用(yòng)來(lái)實現Redis高(gāo)可(kě)用(yòng)的(de)一套解決方案。Redis Sentinel由兩個(gè)部分(fēn)組成:由一個(gè)或者多(duō)個(gè)Sentinel實例組成Sentinel系統;由一個(gè)主Redis服務器(Master Redis)和(hé)多(duō)個(gè)從Redis服務器(Slave Redis)組成主從備份的(de)Redis系統。

Sentinel系統本身是一個(gè)分(fēn)布式的(de)系統,它的(de)作用(yòng)是監視Redis服務器,在Master Redis下(xià)線時(shí),自動将某個(gè)Slave Redis提升爲新的(de)主服務器。Redis系統由Master Redis處理(lǐ)客戶端的(de)命令請求,Slave Redis作爲主服務器的(de)備份而存在。

Redis Sentinel主要作用(yòng)

  • 監控(Monitoring):Sentinel 會不斷地檢查你的(de)主服務器和(hé)從服務器是否運作正常。

  • 提醒(Notification):當被監控的(de)某個(gè)Redis服務器出現問題時(shí), Sentinel可(kě)以通(tōng)過API向管理(lǐ)員(yuán)或者其他(tā)應用(yòng)程序發送通(tōng)知。

  • 自動故障遷移(Automatic failover):當一個(gè)主服務器不能正常工作時(shí), Sentinel會開始一次自動故障遷移操作,它會将失效主服務器的(de)其中一個(gè)從服務器升級爲新的(de)主服務器,并讓失效主服務器的(de)其他(tā)從服務器改爲複制新的(de)主服務器;當客戶端試圖連接失效的(de)主服務器時(shí),集群也(yě)會向客戶端返回新主服務器的(de)地址,使得(de)集群可(kě)以使用(yòng)新主服務器代替失效服務器。

Redis Sentinel系統架構圖

Sentinel的(de)原理(lǐ)并不複雜(zá):

  • 啓動N個(gè)Sentinel實例,這(zhè)些Sentinel實例會去監控你指定的(de)Redis Master/Slaves。

  • 當Redis Master節點挂掉後,Sentinel實例通(tōng)過ping檢測失敗發現這(zhè)種情況就認爲該節點進入 SDOWN狀态,也(yě)就是檢測的(de)Sentinel實例主觀地(Subjectively)認爲該Redis Master節點挂掉。

  • 當一定數目(Quorum參數設定的(de)Sentinel實例都認爲該Master挂掉的(de)情況下(xià),該節點将轉換進入ODOWN狀态,也(yě)就是客觀地(Objectively)挂掉的(de)狀态。

  • 接下(xià)來(lái)Sentinel實例之間發起選舉,選擇其中一個(gè)Sentinel實例發起failover過程:從Slave中選擇一台作爲新的(de)Master,讓其它Slave從新的(de)Master複制數據,并通(tōng)過Pub/Sub發布事件。

  • 使用(yòng)者客戶端從任意Sentinel實例獲取Redis配置信息,并監聽(tīng)(可(kě)選)Sentinel發出的(de)事件: SDOWN, ODOWN以及failover等,并做(zuò)相應主從切換,Sentinel還(hái)扮演了(le)服務發現的(de)角色。

  • Sentinel的(de)Leader選舉采用(yòng)的(de)是Raft協議(yì)。

構建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

一個(gè)一主多(duō)從的(de)Redis系統中,可(kě)以使用(yòng)多(duō)個(gè)Sentinel進行監控任務以保證系統足夠穩健。此時(shí),不僅Sentinel會同時(shí)監控主數據庫和(hé)從數據庫,Sentinel之間也(yě)會相互監控。在這(zhè)裏,建議(yì)大(dà)家Sentinel至少部署三個(gè),并且使用(yòng)奇數個(gè)Sentinel。

安裝Redis和(hé)Sentinel

在三台服務器上分(fēn)别安裝Redis和(hé)Sentinel。需要注意的(de)是,如果要給Redis設置密碼,需要在三個(gè)Redis的(de)配置文件中設置相同的(de)密碼。

安裝的(de)Redis版本必須在2.8版本以上。

$ apt-get install redis-server redis-sentinel

配置Redis和(hé)Sentinel

配置Redis

三台Redis主機配置類似,隻是初次配置時(shí)角色不同。這(zhè)裏以主機dev-master-01爲例,其它兩台按實際情況修改就行了(le)。

Redis默認會綁定到127.0.0.1,這(zhè)裏要在多(duō)台機器間通(tōng)信,我們将它綁定到主機IP上。

$ vim /etc/redis/redis.conf
bind 192.168.2.210

如果要給Redis設置密碼,需要在三個(gè)Redis的(de)配置文件中設置相同的(de)密碼。

$ vim /etc/redis/redis.conf
requirepass "000000"

設置主從複制

在兩個(gè)Slave Redis的(de)配置文件中聲明(míng)所從屬的(de)主數據庫。

$ vim /etc/redis/redis.conf
slaveof 192.168.2.210 6379

這(zhè)裏需要注意一點:當一個(gè)Master配置需要密碼才能連接時(shí),客戶端和(hé)Slave在連接時(shí)都需要提供密碼。Master通(tōng)過requirepass設置自身的(de)密碼,不提供密碼無法連接到這(zhè)個(gè)Master。Slave通(tōng)過masterauth來(lái)設置訪問Master時(shí)的(de)密碼。

Sentinel可(kě)以切換主從數據庫,主數據庫可(kě)能會變成從數據庫,所以三台機器上都需要同時(shí)設置requirepass和(hé)masterauth配置項。

$ vim /etc/redis/redis.conf
requirepass "000000"
masterauth "000000"

配置Sentinel

redis-sentinel軟件包中默認包含了(le)一個(gè)名爲sentinel.conf的(de)文件,默認在/etc/redis/sentinel.conf。這(zhè)裏以主機dev-master-01爲例,其它兩台配置類似,按實際情況修改就行了(le)。

運行一個(gè)Sentinel所需的(de)最少配置如下(xià)所示:

$ 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

以上配置項說明(míng):

  • daemonize yes

以後台進程模式運行。

  • port 26379

Sentinel實例之間的(de)通(tōng)訊端口,該端口号默認爲26379。

  • bind 192.168.2.210

Sentinel默認會綁定到127.0.0.1,這(zhè)裏要在多(duō)台機器間通(tōng)信,我們将它綁定到主機IP上。

  • sentinel monitor redis-master 192.168.2.210 6379 2

Sentinel去監視一個(gè)名爲redis-master的(de)主服務器,這(zhè)個(gè)主服務器的(de)IP地址爲192.168.2.210 ,端口号爲6379。将這(zhè)個(gè)主服務器判斷爲失效至少需要2個(gè)Sentinel同意,一般設置爲N/2+1(N爲Sentinel總數)。隻要同意Sentinel的(de)數量不達标,自動故障遷移就不會執行。

不過要注意,無論你設置要多(duō)少個(gè)Sentinel同意才能判斷一個(gè)服務器失效, 一個(gè)Sentinel都需要獲得(de)系統中多(duō)數Sentinel的(de)支持,才能發起一次自動故障遷移,并預留一個(gè)給定的(de)配置紀元。(configuration Epoch ,一個(gè)配置紀元就是一個(gè)新主服務器配置的(de)版本号)。

  • sentinel down-after-milliseconds redis-master 5000

down-after-milliseconds選項指定了(le)Sentinel認爲服務器已經斷線所需的(de)毫秒數。如果服務器在給定的(de)毫秒數之内,沒有返回Sentinel發送的(de)PING命令的(de)回複,或者返回一個(gè)錯誤,那麽Sentinel将這(zhè)個(gè)服務器标記爲主觀下(xià)線(subjectively down,簡稱SDOWN)。

不過隻有一個(gè)Sentinel将服務器标記爲主觀下(xià)線并不一定會引起服務器的(de)自動故障遷移,隻有在足夠數量的(de)Sentinel都将一個(gè)服務器标記爲主觀下(xià)線之後,服務器才會被标記爲客觀下(xià)線(objectively down,簡稱ODOWN), 這(zhè)時(shí)自動故障遷移才會執行。将服務器标記爲客觀下(xià)線所需的(de)Sentinel數量由對(duì)主服務器的(de)配置(sentinel monitor參數)決定。

  • sentinel failover-timeout redis-master 180000

如果在多(duō)少毫秒内沒有把宕掉的(de)那台Master恢複,那Sentinel認爲這(zhè)是一次真正的(de)宕機。在下(xià)一次選取時(shí)排除該宕掉的(de)Master作爲可(kě)用(yòng)的(de)節點,然後等待一定的(de)設定值的(de)毫秒數後再來(lái)探測該節點是否恢複,如果恢複就把它作爲一台Slave加入Sentinel監測節點群,并在下(xià)一次切換時(shí)爲他(tā)分(fēn)配一個(gè)”選取号”。

  • sentinel parallel-syncs redis-master 2

parallel-syncs選項指定了(le)在執行故障轉移時(shí),最多(duō)可(kě)以有多(duō)少個(gè)從服務器同時(shí)對(duì)新的(de)主服務器進行同步。這(zhè)個(gè)數字越小,完成故障轉移所需的(de)時(shí)間就越長(cháng)。

如果從服務器被設置爲允許使用(yòng)過期數據集(slave-serve-stale-data選項), 那麽你可(kě)能不希望所有從服務器都在同一時(shí)間向新的(de)主服務器發送同步請求。因爲盡管複制過程的(de)絕大(dà)部分(fēn)步驟都不會阻塞從服務器,但從服務器在載入主服務器發來(lái)的(de)RDB文件時(shí),仍然會造成從服務器在一段時(shí)間内不能處理(lǐ)命令請求。

如果全部從服務器一起對(duì)新的(de)主服務器進行同步,那麽就可(kě)能會造成所有從服務器在短時(shí)間内全部不可(kě)用(yòng)的(de)情況出現。你可(kě)以通(tōng)過将這(zhè)個(gè)值設爲1來(lái)保證每次隻有一個(gè)從服務器處于不能處理(lǐ)命令請求的(de)狀态。

  • sentinel auth-pass redis-master 000000

當Master設置了(le)密碼時(shí),Sentinel連接Master和(hé)Slave時(shí)需要通(tōng)過設置參數auth-pass配置相應密碼。

  • sentinel notification-script redis-master /etc/redis/notify.sh

指定Sentinel檢測到該監控的(de)Redis實例failover時(shí)調用(yòng)的(de)報警腳本。腳本被允許執行的(de)最大(dà)時(shí)間爲60秒,超過這(zhè)個(gè)時(shí)間腳本會被kill。該配置項可(kě)選,但線上系統建議(yì)配置。這(zhè)裏的(de)通(tōng)知腳本簡單的(de)記錄一下(xià)failover事件。

# 創建通(tōng)知腳本
$ 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之後重配置客戶端時(shí)執行的(de)腳本,該配置項可(kě)選,但線上系統建議(yì)配置。

  • logfile /var/log/redis/redis-sentinel.log

日志文件所在位置,默認在/var/log/redis/redis-sentinel.log。

運行Sentinel

配置完Redis和(hé)Sentinel之後,按順序啓動各個(gè)角色。啓動順序如下(xià):Master->Slave->Sentinel,要确保按照(zhào)這(zhè)個(gè)順序依次啓動。

  • 啓動Redis

$ systemctl start redis
  • 啓動Sentinel

運行Sentinel有兩種方式:

雖然Redis Sentinel有單獨的(de)軟件安裝包,但實際上它隻是一個(gè)運行在特殊模式下(xià)的(de)Redis實例。當前Redis Stable版已經自帶了(le)redis-sentinel這(zhè)個(gè)工具。你可(kě)以在啓動一個(gè)普通(tōng)Redis實例時(shí)通(tōng)過給定--sentinel選項來(lái)啓動Redis Sentinel。

第一種:用(yòng)單獨的(de)可(kě)執行文件redis-sentinel

$ redis-sentinel /etc/redis/sentinel.conf

第二種:使用(yòng)redis-server的(de)—sentinel選項