荫蒂添的好舒服嗯快嗯视频_久色婷婷高清无码_老肥熟妇丰满大屁股在线播放_欧美成人性视频播放_软萌仙女白丝夹腿自慰滴蜡_最新国产美女av_波多野结衣在线高清一区二区_极品少妇被猛地白浆直流草莓_亚洲欧美日韩国产电影_无码专区丝袜日韩精品

服務(wù)項(xiàng)目每一個(gè)設(shè)計(jì)作品都舉世無雙

當(dāng)前位置: 主頁> 服務(wù)項(xiàng)目> 成功案例>

Redis Sentinel集群部署

日期:2016-09-13 13:33:48 / 人氣: 7031

Redis Sentinel集群部署

什么是Redis Sentinel

Redis Sentinel是用來實(shí)現(xiàn)Redis高可用的一套解決方案。Redis Sentinel由兩個(gè)部分組成:由一個(gè)或者多個(gè)Sentinel實(shí)例組成Sentinel系統(tǒng);由一個(gè)主Redis服務(wù)器(Master Redis)和多個(gè)從Redis服務(wù)器(Slave Redis)組成主從備份的Redis系統(tǒng)。

Sentinel系統(tǒng)本身是一個(gè)分布式的系統(tǒng),它的作用是監(jiān)視Redis服務(wù)器,在Master Redis下線時(shí),自動(dòng)將某個(gè)Slave Redis提升為新的主服務(wù)器。Redis系統(tǒng)由Master Redis處理客戶端的命令請(qǐng)求,Slave Redis作為主服務(wù)器的備份而存在。

Redis Sentinel主要作用

  • 監(jiān)控(Monitoring):Sentinel 會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。

  • 提醒(Notification):當(dāng)被監(jiān)控的某個(gè)Redis服務(wù)器出現(xiàn)問題時(shí), Sentinel可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知。

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

Redis Sentinel系統(tǒng)架構(gòu)圖

Sentinel的原理并不復(fù)雜:

  • 啟動(dòng)N個(gè)Sentinel實(shí)例,這些Sentinel實(shí)例會(huì)去監(jiān)控你指定的Redis Master/Slaves。

  • 當(dāng)Redis Master節(jié)點(diǎn)掛掉后,Sentinel實(shí)例通過ping檢測(cè)失敗發(fā)現(xiàn)這種情況就認(rèn)為該節(jié)點(diǎn)進(jìn)入 SDOWN狀態(tài),也就是檢測(cè)的Sentinel實(shí)例主觀地(Subjectively)認(rèn)為該Redis Master節(jié)點(diǎn)掛掉。

  • 當(dāng)一定數(shù)目(Quorum參數(shù)設(shè)定的Sentinel實(shí)例都認(rèn)為該Master掛掉的情況下,該節(jié)點(diǎn)將轉(zhuǎn)換進(jìn)入ODOWN狀態(tài),也就是客觀地(Objectively)掛掉的狀態(tài)。

  • 接下來Sentinel實(shí)例之間發(fā)起選舉,選擇其中一個(gè)Sentinel實(shí)例發(fā)起failover過程:從Slave中選擇一臺(tái)作為新的Master,讓其它Slave從新的Master復(fù)制數(shù)據(jù),并通過Pub/Sub發(fā)布事件。

  • 使用者客戶端從任意Sentinel實(shí)例獲取Redis配置信息,并監(jiān)聽(可選)Sentinel發(fā)出的事件: SDOWN, ODOWN以及failover等,并做相應(yīng)主從切換,Sentinel還扮演了服務(wù)發(fā)現(xiàn)的角色。

  • Sentinel的Leader選舉采用的是Raft協(xié)議。

構(gòu)建Redis Sentinel集群

Redis Sentinel環(huán)境準(zhǔn)備

主機(jī)名 IP 端口號(hào) 角色
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è)一主多從的Redis系統(tǒng)中,可以使用多個(gè)Sentinel進(jìn)行監(jiān)控任務(wù)以保證系統(tǒng)足夠穩(wěn)健。此時(shí),不僅Sentinel會(huì)同時(shí)監(jiān)控主數(shù)據(jù)庫和從數(shù)據(jù)庫,Sentinel之間也會(huì)相互監(jiān)控。在這里,建議大家Sentinel至少部署三個(gè),并且使用奇數(shù)個(gè)Sentinel。

安裝Redis和Sentinel

在三臺(tái)服務(wù)器上分別安裝Redis和Sentinel。需要注意的是,如果要給Redis設(shè)置密碼,需要在三個(gè)Redis的配置文件中設(shè)置相同的密碼。

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

$ apt-get install redis-server redis-sentinel

配置Redis和Sentinel

配置Redis

三臺(tái)Redis主機(jī)配置類似,只是初次配置時(shí)角色不同。這里以主機(jī)dev-master-01為例,其它兩臺(tái)按實(shí)際情況修改就行了。

Redis默認(rèn)會(huì)綁定到127.0.0.1,這里要在多臺(tái)機(jī)器間通信,我們將它綁定到主機(jī)IP上。

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

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

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

設(shè)置主從復(fù)制

在兩個(gè)Slave Redis的配置文件中聲明所從屬的主數(shù)據(jù)庫。

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

這里需要注意一點(diǎn):當(dāng)一個(gè)Master配置需要密碼才能連接時(shí),客戶端和Slave在連接時(shí)都需要提供密碼。Master通過requirepass設(shè)置自身的密碼,不提供密碼無法連接到這個(gè)Master。Slave通過masterauth來設(shè)置訪問Master時(shí)的密碼。

Sentinel可以切換主從數(shù)據(jù)庫,主數(shù)據(jù)庫可能會(huì)變成從數(shù)據(jù)庫,所以三臺(tái)機(jī)器上都需要同時(shí)設(shè)置requirepassmasterauth配置項(xiàng)。

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

配置Sentinel

redis-sentinel軟件包中默認(rèn)包含了一個(gè)名為sentinel.conf的文件,默認(rèn)在/etc/redis/sentinel.conf。這里以主機(jī)dev-master-01為例,其它兩臺(tái)配置類似,按實(shí)際情況修改就行了。

運(yùn)行一個(gè)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

以上配置項(xiàng)說明:

  • daemonize yes

以后臺(tái)進(jìn)程模式運(yùn)行。

  • port 26379

Sentinel實(shí)例之間的通訊端口,該端口號(hào)默認(rèn)為26379。

  • bind 192.168.2.210

Sentinel默認(rèn)會(huì)綁定到127.0.0.1,這里要在多臺(tái)機(jī)器間通信,我們將它綁定到主機(jī)IP上。

  • sentinel monitor redis-master 192.168.2.210 6379 2

Sentinel去監(jiān)視一個(gè)名為redis-master的主服務(wù)器,這個(gè)主服務(wù)器的IP地址為192.168.2.210 ,端口號(hào)為6379。將這個(gè)主服務(wù)器判斷為失效至少需要2個(gè)Sentinel同意,一般設(shè)置為N/2+1(N為Sentinel總數(shù))。只要同意Sentinel的數(shù)量不達(dá)標(biāo),自動(dòng)故障遷移就不會(huì)執(zhí)行。

不過要注意,無論你設(shè)置要多少個(gè)Sentinel同意才能判斷一個(gè)服務(wù)器失效, 一個(gè)Sentinel都需要獲得系統(tǒng)中多數(shù)Sentinel的支持,才能發(fā)起一次自動(dòng)故障遷移,并預(yù)留一個(gè)給定的配置紀(jì)元。(configuration Epoch ,一個(gè)配置紀(jì)元就是一個(gè)新主服務(wù)器配置的版本號(hào))。

  • sentinel down-after-milliseconds redis-master 5000

down-after-milliseconds選項(xiàng)指定了Sentinel認(rèn)為服務(wù)器已經(jīng)斷線所需的毫秒數(shù)。如果服務(wù)器在給定的毫秒數(shù)之內(nèi),沒有返回Sentinel發(fā)送的PING命令的回復(fù),或者返回一個(gè)錯(cuò)誤,那么Sentinel將這個(gè)服務(wù)器標(biāo)記為主觀下線(subjectively down,簡(jiǎn)稱SDOWN)。

不過只有一個(gè)Sentinel將服務(wù)器標(biāo)記為主觀下線并不一定會(huì)引起服務(wù)器的自動(dòng)故障遷移,只有在足夠數(shù)量的Sentinel都將一個(gè)服務(wù)器標(biāo)記為主觀下線之后,服務(wù)器才會(huì)被標(biāo)記為客觀下線(objectively down,簡(jiǎn)稱ODOWN), 這時(shí)自動(dòng)故障遷移才會(huì)執(zhí)行。將服務(wù)器標(biāo)記為客觀下線所需的Sentinel數(shù)量由對(duì)主服務(wù)器的配置(sentinel monitor參數(shù))決定。

  • sentinel failover-timeout redis-master 180000

如果在多少毫秒內(nèi)沒有把宕掉的那臺(tái)Master恢復(fù),那Sentinel認(rèn)為這是一次真正的宕機(jī)。在下一次選取時(shí)排除該宕掉的Master作為可用的節(jié)點(diǎn),然后等待一定的設(shè)定值的毫秒數(shù)后再來探測(cè)該節(jié)點(diǎn)是否恢復(fù),如果恢復(fù)就把它作為一臺(tái)Slave加入Sentinel監(jiān)測(cè)節(jié)點(diǎn)群,并在下一次切換時(shí)為他分配一個(gè)”選取號(hào)”。

  • sentinel parallel-syncs redis-master 2

parallel-syncs選項(xiàng)指定了在執(zhí)行故障轉(zhuǎn)移時(shí),最多可以有多少個(gè)從服務(wù)器同時(shí)對(duì)新的主服務(wù)器進(jìn)行同步。這個(gè)數(shù)字越小,完成故障轉(zhuǎn)移所需的時(shí)間就越長(zhǎng)。

如果從服務(wù)器被設(shè)置為允許使用過期數(shù)據(jù)集(slave-serve-stale-data選項(xiàng)), 那么你可能不希望所有從服務(wù)器都在同一時(shí)間向新的主服務(wù)器發(fā)送同步請(qǐng)求。因?yàn)楸M管復(fù)制過程的絕大部分步驟都不會(huì)阻塞從服務(wù)器,但從服務(wù)器在載入主服務(wù)器發(fā)來的RDB文件時(shí),仍然會(huì)造成從服務(wù)器在一段時(shí)間內(nèi)不能處理命令請(qǐng)求。

如果全部從服務(wù)器一起對(duì)新的主服務(wù)器進(jìn)行同步,那么就可能會(huì)造成所有從服務(wù)器在短時(shí)間內(nèi)全部不可用的情況出現(xiàn)。你可以通過將這個(gè)值設(shè)為1來保證每次只有一個(gè)從服務(wù)器處于不能處理命令請(qǐng)求的狀態(tài)。

  • sentinel auth-pass redis-master 000000

當(dāng)Master設(shè)置了密碼時(shí),Sentinel連接Master和Slave時(shí)需要通過設(shè)置參數(shù)auth-pass配置相應(yīng)密碼。

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

指定Sentinel檢測(cè)到該監(jiān)控的Redis實(shí)例failover時(shí)調(diào)用的報(bào)警腳本。腳本被允許執(zhí)行的最大時(shí)間為60秒,超過這個(gè)時(shí)間腳本會(huì)被kill。該配置項(xiàng)可選,但線上系統(tǒng)建議配置。這里的通知腳本簡(jiǎn)單的記錄一下failover事件。

# 創(chuàng)建通知腳本
$ vim /etc/redis/notify.sh

#! /bin/bash

echo "master failovered at `date`" > /var/log/redis/redis_issues.log
# 給腳本增加執(zhí)行權(quán)限
$ chmod +x /etc/redis/notify.sh
  • sentinel client-reconfig-script redis-master /etc/redis/failover.sh

指定Sentinel failover之后重配置客戶端時(shí)執(zhí)行的腳本,該配置項(xiàng)可選,但線上系統(tǒng)建議配置。

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

日志文件所在位置,默認(rèn)在/var/log/redis/redis-sentinel.log。

運(yùn)行Sentinel

配置完Redis和Sentinel之后,按順序啟動(dòng)各個(gè)角色。啟動(dòng)順序如下:Master->Slave->Sentinel,要確保按照這個(gè)順序依次啟動(dòng)。

  • 啟動(dòng)Redis

$ systemctl start redis
  • 啟動(dòng)Sentinel

運(yùn)行Sentinel有兩種方式:

雖然Redis Sentinel有單獨(dú)的軟件安裝包,但實(shí)際上它只是一個(gè)運(yùn)行在特殊模式下的Redis實(shí)例。當(dāng)前Redis Stable版已經(jīng)自帶了redis-sentinel這個(gè)工具。你可以在啟動(dòng)一個(gè)普通Redis實(shí)例時(shí)通過給定--sentinel選項(xiàng)來啟動(dòng)Redis Sentinel。

第一種:用單獨(dú)的可執(zhí)行文件redis-sentinel

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

第二種:使用redis-server的—sentinel選項(xiàng)