国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于騰訊云CVM自建高可用Redis實(shí)踐

DataPipeline / 1210人閱讀

摘要:環(huán)境說(shuō)明需求與目標(biāo)本文將通過(guò)對(duì)目前主流的幾種高可用方案進(jìn)行對(duì)比分析,并基于騰訊云和等基礎(chǔ)產(chǎn)品進(jìn)行搭建配置測(cè)試總結(jié)。

本文來(lái)源 | 云+社區(qū)專欄文章
作者 | 萬(wàn)守兵,騰訊云資深架構(gòu)師。8年以上大型互聯(lián)網(wǎng)公司運(yùn)維工作經(jīng)驗(yàn),騰訊云資深遷云架構(gòu)師,一直從事大型互聯(lián)網(wǎng)服務(wù)端架構(gòu)設(shè)計(jì)和優(yōu)化工作。個(gè)人專注于云計(jì)算、k8s和 DevOps領(lǐng)域。

導(dǎo)讀:在企業(yè)實(shí)際生產(chǎn)環(huán)境中為了能夠給業(yè)務(wù)上層應(yīng)用提供高可靠、低延遲、低數(shù)據(jù)損失的Redis緩存服務(wù),本文通過(guò)對(duì)目前主流的幾種redis高可用方案進(jìn)行對(duì)比分析,并基于騰訊云CVM和HAVIP等基礎(chǔ)產(chǎn)品進(jìn)行搭建、配置、測(cè)試、總結(jié),供大家參考。

01環(huán)境說(shuō)明

1.需求與目標(biāo)

本文將通過(guò)對(duì)目前主流的幾種redis高可用方案進(jìn)行對(duì)比分析,并基于騰訊云CVM和HAVIP等基礎(chǔ)產(chǎn)品進(jìn)行搭建、配置、測(cè)試、總結(jié)。

2.軟件版本

redis用3.2.8版本,keepalived用1.2.19版本。

3.基本環(huán)境

采用同一網(wǎng)絡(luò)內(nèi)的三臺(tái)主機(jī)(可以是物理主機(jī)、虛擬機(jī)或docker容器),要求三臺(tái)主機(jī)之間都能相互訪問(wèn)。我這里使用騰訊云上3臺(tái)CVM,每臺(tái)CVM上開啟一個(gè)redis-server、redis-sentinel和keepalived服務(wù),redis-server端口為6379,redis-sentinel的端口為26379(我這里用默認(rèn)端口,生產(chǎn)環(huán)境中可以修改默認(rèn)端口),3臺(tái)CVM上都安裝keepalived服務(wù)。

02幾種redis高可用方案說(shuō)明

1.一般的主從復(fù)制方案

由于redis目前只支持主從復(fù)制備份(不支持主主復(fù)制),當(dāng)主redis掛了,從redis只能提供讀服務(wù),無(wú)法提供寫服務(wù)。所以,還得想辦法,當(dāng)主redis掛了,讓從redis升級(jí)成為主redis。

優(yōu)點(diǎn):
(1)實(shí)現(xiàn)了對(duì)master數(shù)據(jù)的備份,一旦master出現(xiàn)故障,slave節(jié)點(diǎn)可以提升為新的master,頂替舊的master繼續(xù)提供服務(wù)

(2)實(shí)現(xiàn)讀擴(kuò)展。使用主從復(fù)制架構(gòu), 一般都是為了實(shí)現(xiàn)讀擴(kuò)展。Master主要實(shí)現(xiàn)寫功能, Slave實(shí)現(xiàn)讀的功能

缺點(diǎn):
(1)一旦主節(jié)點(diǎn)宕機(jī),從節(jié)點(diǎn)晉升成主節(jié)點(diǎn),同時(shí)需要修改應(yīng)用方的主節(jié)點(diǎn)地址,還需要命令所有從節(jié)點(diǎn)去復(fù)制新的主節(jié)點(diǎn),整個(gè)過(guò)程需要人工干預(yù),此時(shí)需要經(jīng)過(guò)如下操作(假設(shè)提升Slave1為Master):

在Slave1上執(zhí)slaveof no one命令提升Slave1為新的Master節(jié)點(diǎn)
在Slave1上配置為可寫,這是因?yàn)榇蠖鄶?shù)情況下,都將slave配置只讀
告訴Client端(也就是連接Redis的程序)新的Master節(jié)點(diǎn)的連接地址
配置Slave2從新的Master進(jìn)行數(shù)據(jù)復(fù)制

(2)主節(jié)點(diǎn)的寫能力受到單機(jī)的限制

(3)主節(jié)點(diǎn)的存儲(chǔ)能力受到單機(jī)的限制

2.sentinel高可用方案

客戶端程序(如PHP程序)連接redis時(shí)需要ip和port,但redis-server進(jìn)行故障轉(zhuǎn)移時(shí),主redis是變化的,所以ip地址也是變化的。客戶端程序如何感知當(dāng)前主redis的ip地址和端口呢?redis-sentinel提供了接口,請(qǐng)求任何一個(gè)sentinel,發(fā)送SENTINEL get-master-addr-by-name 就能得到當(dāng)前主redis的ip和port。需要注意的是,Redis Sentinel 端口和 Redis 主節(jié)點(diǎn)均需要開放訪問(wèn)權(quán)限。如果前端業(yè)務(wù)使用 Java,有 JedisSentinelPool 可以復(fù)用;如果前端業(yè)務(wù)使用 PHP,可以在 phpredis 的基礎(chǔ)上做二次封裝。

優(yōu)點(diǎn):
(1)redis sentinel帶有自動(dòng)故障轉(zhuǎn)移功能(failover),當(dāng)一個(gè)主redis不能提供服務(wù)時(shí),redis sentinel可以將一個(gè)從redis升級(jí)為主redis,并對(duì)其他從redis進(jìn)行配置,讓它們使用新的主redis進(jìn)行復(fù)制備份;

(2)服務(wù)探測(cè)故障及時(shí);

(3)DBA 維護(hù)成本低。

缺點(diǎn):
(1)對(duì)應(yīng)用有入侵性:客戶端每次連接redis前,先向sentinel發(fā)送請(qǐng)求,獲得主redis的ip和port,然后用返回的ip和port連接redis。每次操作redis至少需要發(fā)送兩次連接請(qǐng)求,第一次請(qǐng)求sentinel,第二次請(qǐng)求redis;

(2)Sentinel服務(wù)器和Redis節(jié)點(diǎn)需要開放訪問(wèn)權(quán)限。

3.redis-sentinel+VIP方案+自定義腳本方案

底層是Redis Sentinel 集群,代理著 Redis 主從,Web端通過(guò)VIP提供服務(wù)。在部署Redis主從的時(shí)候,需要將虛擬IP綁定到當(dāng)前的Redis 節(jié)點(diǎn)。當(dāng)主節(jié)點(diǎn)發(fā)生故障,比如機(jī)器故障、Redis節(jié)點(diǎn)故障或者網(wǎng)絡(luò)不可達(dá),Sentinel 集群會(huì)調(diào)用 client-reconfig-script 配置的腳本,將VIP漂移到新的主節(jié)點(diǎn)上。

比如:當(dāng)前redis系統(tǒng)中主redis的ip地址是172.16.2.4,那么VIP(172.16.2.250)指向172.16.2.4,客戶端程序用VIP(172.16.2.250)地址連接redis,實(shí)際上連接的就是當(dāng)前主redis,這樣就避免了向sentinel發(fā)送請(qǐng)求。

優(yōu)點(diǎn):
(1)腳本自定義,架構(gòu)可控;

(2)對(duì)應(yīng)用透明,當(dāng)主redis宕機(jī),進(jìn)行故障轉(zhuǎn)移時(shí),192.168.56.102這臺(tái)服務(wù)器上的redis提升為主,這時(shí)VIP(172.16.2.4)指向192.168.56.102,這樣客戶端程序不需要修改任何代碼,連接的是192.168.56.102這臺(tái)主redis;

(3)秒級(jí)切換,在 5s 內(nèi)完成整個(gè)切換操作.

缺點(diǎn):
(1)使用VIP增加維護(hù)成本,存在IP混亂風(fēng)險(xiǎn);

(2)需要自行編寫VIP切換腳本,需要通過(guò)ip addr手動(dòng)先在主redis上配置vip,配置相對(duì)復(fù)雜;

(3)Sentinel模式存在短時(shí)間的服務(wù)不可用;

(4)應(yīng)用場(chǎng)景局限于內(nèi)網(wǎng),例如部分業(yè)務(wù)只能通過(guò)外網(wǎng)訪問(wèn)Redis時(shí),該方案不可用

注意:
VIP方案對(duì)配置的環(huán)境有一定的要求,在騰訊云上搭建redis,需要用到騰訊云HAVIP,文檔見:https://cloud.tencent.com/doc...

4.redis-sentinel+keepalived方案

keepalived通過(guò)vrrp_script檢測(cè)當(dāng)前主機(jī)上的redis-server是否以master狀態(tài)運(yùn)行,如果當(dāng)前主機(jī)上的redis-server正在以master狀態(tài)運(yùn)行,則將vrrp_instance標(biāo)記為存活狀態(tài),并分配VIP;如果當(dāng)前主機(jī)上的redis-server正在以slave狀態(tài)運(yùn)行,則將vrrp_instance標(biāo)記為錯(cuò)誤狀態(tài)。當(dāng)某臺(tái)主機(jī)宕機(jī)后,其他兩臺(tái)主機(jī)上的keepalived會(huì)將VIP切換到新的master(當(dāng)前主機(jī)上的redis-server正在以master狀態(tài)運(yùn)行)上。

優(yōu)點(diǎn):
(1)相對(duì)redis-sentinel+VIP方案,不需編寫VIP切換腳本,配置更簡(jiǎn)潔、清晰;

(2)對(duì)應(yīng)用透明;

(3)秒級(jí)切換。

缺點(diǎn):
(1)對(duì)網(wǎng)絡(luò)環(huán)境有要求:keepalived的核心協(xié)議VRRP使用IP多播數(shù)據(jù)包進(jìn)行封裝,組地址為224.0.0.18,發(fā)布范圍只限于同一局域網(wǎng)內(nèi),而且在網(wǎng)絡(luò)不受自己控制時(shí)基本不能用,但是騰訊云是支持組播協(xié)議,可以使用keepalived;

(2)存在腦裂;

(3)Sentinel模式存在短時(shí)間的服務(wù)不可用

注意:
keepalived方案也需要一個(gè)VIP,且網(wǎng)絡(luò)要能支持組播協(xié)議。

03安裝部署
方案一:sentinel高可用方案

1.首先下載安裝redis:(http://download.redis.io/rele...)
$ wget http://download.redis.io/rele...

$ tar -zxvf redis-3.2.8.tar.gz

$ cd redis-3.2.8

$ make (如果沒(méi)有安裝gcc會(huì)報(bào)錯(cuò),所以強(qiáng)烈建議在make之前先yum install gcc先安裝gcc)
make報(bào)錯(cuò)如下:(make是用來(lái)編譯的,從Makefile中讀取指令,安裝到指定的位置)

make3: gcc: Command not found
make3: * net.o Error 127
make3: Leaving directory `/opt/redis-3.2.8/deps/hiredis"
make2: * hiredis Error 2
make2: Leaving directory `/opt/redis-3.2.8/deps"
make1: persist-settings Error 2 (ignored)
CC adlist.o
/bin/sh: cc: command not found
make1: * adlist.o Error 127
make1: Leaving directory `/opt/redis-3.2.8/src"
make: * all Error 2
安裝gcc:

yum install gcc
繼續(xù)編譯:

make
Make報(bào)錯(cuò)如下:

make1: Entering directory `/opt/redis-3.2.8/src"
CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory

include

^
compilation terminated.
make1: * adlist.o Error 1
make1: Leaving directory `/opt/redis-3.2.8/src"
make: * all Error 2
重新編譯:

make MALLOC=libc
編譯成功!!!

2.基本配置:

(1)make完后 redis-3.2.8目錄下會(huì)出現(xiàn)編譯后的redis服務(wù)程序redis-server,還有用于測(cè)試的客戶端程序redis-cli,兩個(gè)程序位于安裝目錄 src 目錄下:

復(fù)制redis相關(guān)命令到/usr/sbin目錄下,這樣就可以直接執(zhí)行這些命令,不用寫全路徑。

$ cd src

$ cp redis-cli redis-server redis-sentinel /usr/sbin/
(2)在redis目錄下有redis.conf和sentinel.conf配置文件示例,將兩個(gè)配置文件復(fù)制到/etc目錄下(當(dāng)然也可以在/etc/目錄新建配置文件),然后修改配置文件

$ cp redis.conf sentinel.conf /etc/
(3)redis.conf 是一個(gè)默認(rèn)的配置文件。我們可以根據(jù)需要修改配置文件

●修改主redis-server(172.16.2.4)配置文件內(nèi)容如下:

不修改,使用默認(rèn)端口

port 6379

修改為0.0.0.0,可以從外部連接redis服務(wù)端

bind 0.0.0.0

默認(rèn)情況下redis運(yùn)行在保護(hù)模式(這種模式下,訪問(wèn)不需要密碼),但是這種模式只允許本地回路訪問(wèn),這里改為no

protected-mode no

默認(rèn)情況下,redis不是在后臺(tái)模式運(yùn)行的,如果需要在后臺(tái)進(jìn)程運(yùn)行,把該項(xiàng)的值更改為yes,默認(rèn)為no

daemonize yes

redis服務(wù)以后臺(tái)進(jìn)程運(yùn)行的時(shí)候,Redis默認(rèn)會(huì)把pid寫入/var/run/redis.pid文件組

pidfile /var/run/redis.pid

開啟AOF持久化,默認(rèn)是關(guān)閉的,RDB默認(rèn)是開啟的,但是AOF的優(yōu)先級(jí)更高,啟動(dòng)時(shí)Redis 會(huì)優(yōu)先載入 AOF 文件來(lái)恢復(fù)數(shù)據(jù),與 RDB 相比,AOF 的實(shí)時(shí)性更好,因此已成為主流的持久化方案 如果不希望丟掉任何一條數(shù)據(jù)的話就該用純累加模式:一旦開啟這個(gè)模式,Redis會(huì)把每次寫入的數(shù)據(jù)在接收后都寫入 appendonly.aof 文件。

appendonly yes

● 修改從redis-server(172.16.2.2和172.16.2.15)配置文件內(nèi)容如下:

不修改,使用默認(rèn)端口

port 6379

修改為0.0.0.0,可以從外部連接redis服務(wù)端

bind 0.0.0.0

默認(rèn)情況下redis運(yùn)行在保護(hù)模式(這種模式下,訪問(wèn)不需要密碼),但是這種模式只允許本地回路訪問(wèn),這里改為no

protected-mode no

默認(rèn)情況下,redis不是在后臺(tái)模式運(yùn)行的,如果需要在后臺(tái)進(jìn)程運(yùn)行,把該項(xiàng)的值更改為yes,默認(rèn)為no

daemonize yes

redis服務(wù)以后臺(tái)進(jìn)程運(yùn)行的時(shí)候,Redis默認(rèn)會(huì)把pid寫入/var/run/redis.pid文件組,改為yes

pidfile /var/run/redis.pid

開啟AOF持久化,默認(rèn)是關(guān)閉的,RDB默認(rèn)是開啟的,但是AOF的優(yōu)先級(jí)更高,啟動(dòng)時(shí)Redis 會(huì)優(yōu)先載入 AOF 文件來(lái)恢復(fù)數(shù)據(jù),與 RDB 相比,AOF 的實(shí)時(shí)性更好,因此已成為主流的持久化方案 如果不希望丟掉任何一條數(shù)據(jù)的話就該用純累加模式:一旦開啟這個(gè)模式,Redis會(huì)把每次寫入的數(shù)據(jù)在接收后都寫入 appendonly.aof 文件。

appendonly yes

從redis比主redis多這一行,使用slaveof實(shí)現(xiàn)主從復(fù)制

slaveof 172.16.2.4 6379
● 啟動(dòng)redis服務(wù)之前,建議先修改kernel參數(shù),重啟生效

vim /etc/sysctl.conf

表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何

vm.overcommit_memory = 1

定義了TCP全連接隊(duì)列長(zhǎng)度,默認(rèn)128太小,啟動(dòng)redis服務(wù)會(huì)報(bào)錯(cuò)

net.core.somaxconn = 511

使配置文件永久生效

sysctl -p
(4)啟動(dòng)redis-server服務(wù):

$ redis-server & #加上‘&’號(hào)使redis以后臺(tái)程序方式運(yùn)行

$ redis-server /etc/redis.conf #通過(guò)指定配置文件啟動(dòng),在生產(chǎn)環(huán)境中強(qiáng)烈建議使用這種方式啟動(dòng)服務(wù)
(5)停止:

使用客戶端:

$ redis-cli shutdown
因?yàn)镽edis可以妥善處理SIGTERM信號(hào),所以直接kill -9也是可以的

$ kill -9 PID
(6)啟動(dòng)redis服務(wù)進(jìn)程后,就可以使用測(cè)試客戶端程序redis-cli和redis服務(wù)交互了,連接redis-server:

$ redis-cli #本地連接redis-server,如果要連接遠(yuǎn)程redis,redis-cli -h host -p port -a password

redis> set key1 value1

OK

redis> get key1

"value1"
(7)查看主從狀態(tài):

通過(guò)redis-cli 進(jìn)入主redis命令行,執(zhí)行info replication查看當(dāng)前主從配置,可以發(fā)現(xiàn)兩個(gè)從節(jié)點(diǎn)信息,表明redis-server主從已經(jīng)配置完畢。

redis> INFO replication

查看redis主從關(guān)系已經(jīng)建立

● 可能遇到的問(wèn)題:redis主從建立失敗,有可能是啟動(dòng)服務(wù)時(shí)沒(méi)有指定正確的配置文件

● 解決思路:

(1)通過(guò)ps -ef查看服務(wù)進(jìn)程ID

(2)通過(guò)lsof -p pid查看進(jìn)程打開的文件,如果打開文件有誤,通過(guò)redis-server /etc/redis.conf指定正確的配置文件重新啟動(dòng)服務(wù)

(8)搭建redis-sentinel系統(tǒng):

redis-sentinel程序上面已經(jīng)安裝過(guò)了,這里只需要修改配置文件就可以了。修改/etc/sentinel.conf如下:

● 三臺(tái)sentinel服務(wù)器配置都一致

當(dāng)前Sentinel服務(wù)運(yùn)行的端口

port 26379

監(jiān)控的master的名字叫做mymaster(自定義),地址為172.16.2.4:6379,行尾最后的一個(gè)2代表在sentinel集群中,多少個(gè)sentinel認(rèn)為masters死了,才能真正認(rèn)為該master不可用了

sentinel monitor mymaster 172.16.2.4 6379 2

每個(gè)Sentinel節(jié)點(diǎn)都要定期PING命令來(lái)判斷Redis數(shù)據(jù)節(jié)點(diǎn)和其余Sentinel節(jié)點(diǎn)是否可達(dá),如果超過(guò)30秒且沒(méi)有回復(fù),則判定不可達(dá)

sentinel down-after-milliseconds mymaster 30000

當(dāng)Sentinel節(jié)點(diǎn)集合對(duì)主節(jié)點(diǎn)故障判定達(dá)成一致時(shí),Sentinel領(lǐng)導(dǎo)者節(jié)點(diǎn)會(huì)做故障轉(zhuǎn)移操作,選出新的主節(jié)點(diǎn),原來(lái)的從節(jié)點(diǎn)會(huì)向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作,限制每次向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作的從節(jié)點(diǎn)個(gè)數(shù)為1,在從Redis實(shí)例較多的情況下這個(gè)數(shù)字越小,同步的時(shí)間越長(zhǎng),完成故障轉(zhuǎn)移所需的時(shí)間就越長(zhǎng)

sentinel parallel-syncs mymaster 1

failover過(guò)期時(shí)間,當(dāng)failover開始后,在此時(shí)間內(nèi)仍然沒(méi)有觸發(fā)任何failover操作,當(dāng)前sentinel將會(huì)認(rèn)為此次failover失敗。默認(rèn)180秒,即3分鐘。

sentinel failover-timeout mymaster 18000

如果Sentinel監(jiān)控的主節(jié)點(diǎn)配置了密碼,可以通過(guò)sentinel auth-pass配置通過(guò)添加主節(jié)點(diǎn)的密碼,防止Sentinel節(jié)點(diǎn)無(wú)法對(duì)主節(jié)點(diǎn)進(jìn)行監(jiān)控。 例如:sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

sentinel auth-pass

在故障轉(zhuǎn)移期間,當(dāng)一些警告級(jí)別的Sentinel事件發(fā)生(指重要事件,如主觀下線,客觀下線等)時(shí),會(huì)觸發(fā)對(duì)應(yīng)路徑的腳本,想腳本發(fā)送相應(yīng)的事件參數(shù)。 例如:sentinel notification-script mymaster /var/redis/notify.sh

sentinel notification-script

在故障轉(zhuǎn)移結(jié)束后,觸發(fā)應(yīng)對(duì)路徑的腳本,并向腳本發(fā)送故障轉(zhuǎn)移結(jié)果的參數(shù)。 例如:sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

sentinel client-reconfig-script
● 常見問(wèn)題:在172.16.2.4(主redis)上查看sentinel的信息,發(fā)現(xiàn)報(bào)錯(cuò)

查看sentinel服務(wù)報(bào)錯(cuò)

● 解決方案:修改/etc/sentinel.conf文件

原因是sentinel沒(méi)有指定bind和密碼訪問(wèn),所以被開啟了protected-mode保護(hù)模式,拒絕其他sentinel的連接。導(dǎo)致進(jìn)入了ODWON。在sentinel.conf里加入關(guān)閉保護(hù),protected-mode no

protected-mode no

指定文件啟動(dòng)sentinel服務(wù)

redis-sentinel sentinel.conf &
3.測(cè)試驗(yàn)證:

(1)基本連接測(cè)試:

redis-cli -h host -p port info sentinel
三個(gè)redis-sentinel服務(wù)啟動(dòng)完畢后,連接任意sentinel服務(wù)可以獲知當(dāng)前主redis服務(wù)信息,說(shuō)明sentinel服務(wù)已經(jīng)成功起來(lái)

查看sentinel服務(wù)已經(jīng)啟動(dòng)

(2)測(cè)試sentinel的failover故障切換功能:

● 把主redis(172.16.2.4)停掉

redis-cli -h 172.16.2.4 -p 6379 shutdown
● 查看redis-sentinel的監(jiān)控狀態(tài):

redis-cli -h 172.16.2.4 -p 26379 info sentinel

查看sentinel信息發(fā)現(xiàn)master已經(jīng)切換為172.16.2.2

● 發(fā)現(xiàn)172.16.2.2這臺(tái)redis-server提升為主:

redis-cli -h 172.16.2.2 -p 6379 info replication

在master上查看主從狀態(tài)

● 控制臺(tái)也輸出相關(guān)信息,表示主從切換成功。

控制臺(tái)log,redis主從切換成功

● 172.16.2.2切換成主之后,也可以執(zhí)行寫操作了。至此,redis的sentinel方案已經(jīng)搭建完成。

確認(rèn)當(dāng)前主可以執(zhí)行寫操作

4.客戶端使用方式:

客戶端程序(如PHP程序)連接redis時(shí)需要ip和port,但redis-server進(jìn)行故障轉(zhuǎn)移時(shí),主redis是變化的,所以ip地址也是變化的。客戶端程序如何感知當(dāng)前主redis的ip地址和端口呢?redis-sentinel提供了接口,請(qǐng)求任何一個(gè)sentinel,發(fā)送SENTINEL get-master-addr-by-name就能得到當(dāng)前主redis的ip和port。

● 連接到sentinel獲取當(dāng)前主redis的ip和端口(因?yàn)橛謭?zhí)行了一次切換,這里的主已經(jīng)切換到172.16.2.15,這里只是說(shuō)明客戶端的使用方式)

客戶端程序連接方式
方案二:redis-sentinel+vip方案

1.方案說(shuō)明

VIP方案是redis系統(tǒng)對(duì)外始終是同一ip地址,當(dāng)redis主從進(jìn)行故障轉(zhuǎn)移時(shí),需要做的是將VIP從之前的redis服務(wù)器漂移到現(xiàn)在新的主redis服務(wù)器上。
比如:當(dāng)前redis系統(tǒng)中主redis的ip地址是172.16.2.4,那么VIP(172.16.2.250)指向172.16.2.4,客戶端程序用VIP(172.16.2.250)地址連接redis,實(shí)際上連接的就是當(dāng)前主redis,這樣就避免了向sentinel發(fā)送請(qǐng)求。

● 正常情況下VIP指向172.16.2.4

正常情況下VIP指向172.16.2.4

● 故障情況下,VIP漂移指向172.16.2.2

master故障情況下,VIP自動(dòng)漂移指向172.16.2.2

2.基本配置:

那么現(xiàn)在的問(wèn)題是,如何在進(jìn)行redis故障轉(zhuǎn)移時(shí),將VIP漂移到新的主redis服務(wù)器上。在方案一的配置基礎(chǔ)之上增加對(duì)sentinel.conf的配置,具體配置如下:
(1)在sentinel.conf配置文件設(shè)置要執(zhí)行的vip漂移的腳本

使用sentinel.conf配置文件的有一個(gè)參數(shù)client-reconfig-script,這個(gè)參數(shù)配置執(zhí)行腳本,sentinel在做failover的時(shí)候會(huì)執(zhí)行這個(gè)腳本,并且傳遞6個(gè)參數(shù),其中是新主redis的IP地址,可以在這個(gè)腳本里做VIP漂移操作。

修改三個(gè)服務(wù)器的redis-sentinel配置文件/etc/sentinel.conf,增加下面一行。

vi /etc/sentinel.conf

sentinel client-reconfig-script mymaster /opt/notify_mymaster.sh
(2)創(chuàng)建VIP漂移腳本(VIP用之前在騰訊云控制臺(tái)上申請(qǐng)的VIP)

然后在/opt/目錄下創(chuàng)建notify_mymaster.sh腳本文件,這個(gè)腳本做VIP漂移操作。
chmod 777 notify_mymaster.sh #賦予腳本執(zhí)行權(quán)限
腳本內(nèi)容如下:

notify_mymaster.sh腳本內(nèi)容 !/bin/bash

MASTER_IP=$6 #第六個(gè)參數(shù)是新主redis的ip地址

LOCAL_IP="172.16.2.2" #其他兩個(gè)服務(wù)器上為172.16.2.4,172.16.2.15

VIP="172.16.2.250"

NETMASK="24"

INTERFACE="eth0"

if [ ${MASTER_IP} = ${LOCAL_IP} ];then

sudo /sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE} #將VIP綁定到該服務(wù)器上

sudo /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}

exit 0

else

sudo /sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE} #將VIP從該服務(wù)器上刪除

exit 0

fi

exit 1 #如果返回1,sentinel會(huì)一直執(zhí)行這個(gè)腳本
(3)第一次需在主redis上手工設(shè)置VIP

只需要第一次手工在主redis上設(shè)置vip,現(xiàn)在當(dāng)前主redis是172.16.2.2,需要手動(dòng)綁定VIP到該服務(wù)器上。(注意強(qiáng)烈建議加sudo執(zhí)行)
sudo /sbin/ip addr add 172.16.2.250/24 dev eth0
sudo /sbin/arping -q -c 3 -A 172.16.2.250 -I eth0
3.測(cè)試驗(yàn)證

(1)配置完成之后,去另一個(gè)服務(wù)器上(172.16.2.15)通過(guò)VIP地址連接redis-server和redis-sentinel。從上面可以看到主redis是172.16.2.2

VIP成功綁定在master 172.16.2.2上

(2)驗(yàn)證:下面關(guān)閉這臺(tái)主redis服務(wù)(172.16.2.2),看看VIP是否漂移到另一臺(tái)服務(wù)器上

redis-cli -h 172.16.2.2 -p 6379 shutdown
通過(guò)查詢sentinel發(fā)現(xiàn)172.16.2.15提升為主。

sentinel自動(dòng)failover,將172.16.2.15提升為master

(3)通過(guò)訪問(wèn)VIP連接查看redis sentinel信息和redis-server主從關(guān)系,發(fā)現(xiàn)VIP確實(shí)指向了172.16.2.15

通過(guò)VIP成功查看sentinel狀態(tài)

通過(guò)VIP成功查看redis的狀態(tài)
方案三:redis-sentinel+keepalived方案

1.方案說(shuō)明

VIP方案是通過(guò)sentinel服務(wù)在做redis主從切換的時(shí)候,通過(guò)配置文件sentinel.conf中的一個(gè)參數(shù)client-reconfig-script來(lái)執(zhí)行相應(yīng)的腳本,這種方式需要自己編寫腳本。而keepalived方案通過(guò)vrrp_script檢測(cè)當(dāng)前主機(jī)上的redis-server是否以master狀態(tài)運(yùn)行,如果當(dāng)前主機(jī)上的redis-server正在以master狀態(tài)運(yùn)行,則將vrrp_instance標(biāo)記為存活狀態(tài),并分配VIP;如果當(dāng)前主機(jī)上的redis-server正在以slave狀態(tài)運(yùn)行,則將vrrp_instance標(biāo)記為錯(cuò)誤狀態(tài)。當(dāng)某臺(tái)主機(jī)宕機(jī)后,其他兩臺(tái)主機(jī)上的keepalived會(huì)將VIP切換到新的master(當(dāng)前主機(jī)上的redis-server正在以master狀態(tài)運(yùn)行)上。三臺(tái)CVM都需要安裝keepalived組件。

2.在VIP方案基礎(chǔ)之上安裝keepalived組件(3臺(tái)CVM都需要安裝)

wget -c http://www.keepalived.org/sof...

tar zxf keepalived-1.2.19.tar.gz

cd keepalived-1.2.19

./configure --prefix=/usr/local/keepalived

make

make install
3.基本配置

(1)編譯安裝keepalived之后,做初始化

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

cd /etc/init.d/

chkconfig --add keepalived

chkconfig keepalived on

mkdir -p /etc/keepalived
(2)關(guān)于keepalived的配置文件

keepalived的配置文件默認(rèn)是沒(méi)有的,當(dāng)然sample&example文件還是有的,通常在PREFIX/etc/sample目錄下。
keepalived master和backup(backups)之間不同的是:

1.優(yōu)先級(jí)的不同,master的優(yōu)先級(jí)priority的數(shù)字要高一些,我這里主redis上設(shè)置為100,從redis上設(shè)置為99;

2.global_defs段的router_id都不一樣,實(shí)際中可以用任意名字區(qū)分也可以用主機(jī)名區(qū)分;

3.backup的配置文件中還有一個(gè)nopreempt字段,意思是設(shè)置為非搶占模式,作用是讓master優(yōu)先獲取到VIP,并保證VIP是在原先的master上。
● 主redis172.16.2.4上的配置:

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {

notification_email { #指定keepalived在發(fā)生切換時(shí)需要發(fā)送email到的對(duì)象,一行一個(gè)

 root@localhost

}

notification_email_from keepalived@localhost #指定發(fā)件人

smtp_server 127.0.0.1 #指定smtp服務(wù)器地址

smtp_connect_timeout 10 #指定smtp連接超時(shí)時(shí)間

router_id keepalivedha_1 #運(yùn)行keepalived機(jī)器的一個(gè)標(biāo)識(shí)

}

vrrp_script chk_http_port { #執(zhí)行的腳本

script "redis-cli info | grep role:master >/dev/null 2>&1"

interval 1

timeout 2

fall 2

rise 1

}

vrrp_sync_group VG_1 { #監(jiān)控多個(gè)網(wǎng)段的實(shí)例

group {

    VI_1        #實(shí)例名

}

}

vrrp_instance VI_1 {

state BACKUP

interface eth0      #設(shè)置實(shí)例綁定的網(wǎng)卡

#use_vmac keepalived

#vmac_xmit_base

mcast_src_ip 172.16.2.4

smtp_alert

virtual_router_id 20        #路由器標(biāo)識(shí),MASTER和BACKUP必須是一致的

priority 100        #優(yōu)先級(jí),高優(yōu)先級(jí)競(jìng)選為master

advert_int 1

authentication {        #設(shè)置認(rèn)證

    auth_type PASS      #認(rèn)證方式

    auth_pass password      #認(rèn)證密碼

}

virtual_ipaddress {     #設(shè)置vip

    172.16.2.250

}

track_script {      #監(jiān)測(cè)的對(duì)象

    chk_http_port

}

}
● 從redis172.16.2.2上的配置:

! Configuration File for keepalived

global_defs {

notification_email {

 root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 10

router_id keepalivedha_2

}

vrrp_script chk_http_port {

script "redis-cli info | grep role:master >/dev/null 2>&1"

interval 1

timeout 2

fall 2

rise 1

}

vrrp_sync_group VG_1 {

group {

    VI_1

}

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

#use_vmac keepalived

#vmac_xmit_base

mcast_src_ip 172.16.2.2

smtp_alert

virtual_router_id 20

priority 99

advert_int 1

authentication {

    auth_type PASS

    auth_pass password

}

virtual_ipaddress {

    172.16.2.250

}

track_script {

    chk_http_port

}

    nopreempt

}
● 從redis172.16.2.15上的配置:

! Configuration File for keepalived

global_defs {

notification_email {

 root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 10

router_id keepalivedha_3

}

vrrp_script chk_http_port {

script "redis-cli info | grep role:master >/dev/null 2>&1"

interval 1

timeout 2

fall 2

rise 1

}

vrrp_sync_group VG_1 {

group {

    VI_1

}

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

#use_vmac keepalived

#vmac_xmit_base

mcast_src_ip 172.16.2.15

smtp_alert

virtual_router_id 20

priority 99

advert_int 1

authentication {

    auth_type PASS

    auth_pass password

}

virtual_ipaddress {

    172.16.2.250

}

track_script {

    chk_http_port

}

    nopreempt

}
4.啟動(dòng)keepalived

service keepalived start

tail /var/log/messages
(1)如果在主redis上keepalived啟動(dòng)后日志如下圖顯示則表示啟動(dòng)成功

keepalived日志輸出

(2)用ip add查看VIP已經(jīng)綁定到主redis上

查看vip地址已經(jīng)綁定

5.測(cè)試驗(yàn)證

模擬主redis故障時(shí),redis的set、get和復(fù)制情況

(1)停掉主Redis(172.16.2.4)上的redis-server服務(wù)

停掉主Redis(172.16.2.4)上的redis-server服務(wù)

(2)主Redis(172.16.2.4)上的VIP已經(jīng)被移除

主Redis(172.16.2.4)上的VIP已經(jīng)被移除

(3)查看Redis(172.16.2.15)上的Redis狀態(tài)已經(jīng)切換成master

查看Redis(172.16.2.15)上的Redis狀態(tài)已經(jīng)切換成master

(4)可以看出,VIP已經(jīng)漂移到新的redis master(172.16.2.15)上

可以看出,VIP已經(jīng)漂移到新的redis-server master了

(5)從sentinel進(jìn)行redis主從切換,到VIP的漂移過(guò)程是需要時(shí)間的,用ping VIP來(lái)做測(cè)試,中斷時(shí)間大概需要幾秒左右,如下圖所示:

04總結(jié)

以上通過(guò)搭建、配置、驗(yàn)證、測(cè)試,了解到幾種redis高可用方案各有優(yōu)缺點(diǎn),如果網(wǎng)絡(luò)環(huán)境能夠支持組播協(xié)議,建議采用redis-sentinel+keepalived方案,這種方案配置更簡(jiǎn)單;如果網(wǎng)絡(luò)環(huán)境不支持組播協(xié)議,可以使用redis-sentinel+VIP方案;如果業(yè)務(wù)代碼上能夠接受在每次操作redis之前都先額外進(jìn)行一次sentinel查詢操作,就可以采用sentinel方案。

以下是實(shí)戰(zhàn)過(guò)程中總結(jié)出的最佳實(shí)踐:

(1)Redis Sentinel 集群建議使用 >= 5 臺(tái)機(jī)器;

(2)不同的大業(yè)務(wù)可以使用一套 Redis Sentinel 集群,代理該業(yè)務(wù)下的所有端口;

(3)根據(jù)不同的業(yè)務(wù)劃分好 Redis 端口范圍;

(4)自定義腳本建議采用 Python 實(shí)現(xiàn),擴(kuò)展便利;

(5)自定義腳本傳入?yún)?shù): ;

(6)自定義腳本需要遠(yuǎn)程 ssh 操作機(jī)器,建議使用 paramiko 庫(kù),避免重復(fù)建立 SSH 連接,消耗時(shí)間;

(7)加速 SSH 連接,建議關(guān)閉以下兩個(gè)參數(shù):
UseDNS no
GSSAPIAuthentication no

(8)微信或者郵件告警,建議 fork 一個(gè)進(jìn)程,避免主進(jìn)程阻塞;

(9)自動(dòng)切換和故障切換,所有操作建議在 15s 以內(nèi)完成。

以上幾種方案都是針對(duì)單個(gè)redis實(shí)例的高可用,比較適合中小型業(yè)務(wù)的應(yīng)用。如果業(yè)務(wù)數(shù)據(jù)量比較大,并發(fā)量比較高的情況下,建議搭建redis集群,比如官方redis cluster和開源的codis方案,或者使用騰訊云PAAS層redis集群方案,文檔說(shuō)明見:
https://cloud.tencent.com/doc...。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/12003.html

相關(guān)文章

  • 騰訊和阿里對(duì)比哪個(gè)好?計(jì)算優(yōu)勢(shì)測(cè)評(píng)

    摘要:騰訊云和阿里云針對(duì)按量計(jì)費(fèi)的云服務(wù)器,均要求賬戶內(nèi)有一定的余額騰訊云好像沒(méi)有最低充值要求,充值元即可阿里云要求賬戶內(nèi)至少有元余額。基于上述原因,我們分別在騰訊云和阿里云創(chuàng)建最低配版的云數(shù)據(jù)庫(kù)和。 云計(jì)算市場(chǎng)爭(zhēng)奪阿里云作為名副其實(shí)的國(guó)內(nèi)業(yè)界第一,名聲非常大,不過(guò)最近 IT 之家的事鬧出來(lái)之后,我有點(diǎn)慶幸最終沒(méi)有選擇它。騰訊云算是業(yè)界老二,而且有著騰訊這個(gè)強(qiáng)大的靠山,云服務(wù)產(chǎn)品的種類和質(zhì)量...

    zengdongbao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<