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

資訊專欄INFORMATION COLUMN

基于騰訊云CVM自建高可用Redis實踐

DataPipeline / 1201人閱讀

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

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

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

01環(huán)境說明

1.需求與目標

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

2.軟件版本

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

3.基本環(huán)境

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

02幾種redis高可用方案說明

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

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

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

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

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

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

(2)主節(jié)點的寫能力受到單機的限制

(3)主節(jié)點的存儲能力受到單機的限制

2.sentinel高可用方案

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

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

(2)服務(wù)探測故障及時;

(3)DBA 維護成本低。

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

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

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

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

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

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

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

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

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

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

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

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

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

4.redis-sentinel+keepalived方案

keepalived通過vrrp_script檢測當前主機上的redis-server是否以master狀態(tài)運行,如果當前主機上的redis-server正在以master狀態(tài)運行,則將vrrp_instance標記為存活狀態(tài),并分配VIP;如果當前主機上的redis-server正在以slave狀態(tài)運行,則將vrrp_instance標記為錯誤狀態(tài)。當某臺主機宕機后,其他兩臺主機上的keepalived會將VIP切換到新的master(當前主機上的redis-server正在以master狀態(tài)運行)上。

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

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

(3)秒級切換。

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

(2)存在腦裂;

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

注意:
keepalived方案也需要一個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 (如果沒有安裝gcc會報錯,所以強烈建議在make之前先yum install gcc先安裝gcc)
make報錯如下:(make是用來編譯的,從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報錯如下:

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目錄下會出現(xiàn)編譯后的redis服務(wù)程序redis-server,還有用于測試的客戶端程序redis-cli,兩個程序位于安裝目錄 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配置文件示例,將兩個配置文件復(fù)制到/etc目錄下(當然也可以在/etc/目錄新建配置文件),然后修改配置文件

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

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

不修改,使用默認端口

port 6379

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

bind 0.0.0.0

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

protected-mode no

默認情況下,redis不是在后臺模式運行的,如果需要在后臺進程運行,把該項的值更改為yes,默認為no

daemonize yes

redis服務(wù)以后臺進程運行的時候,Redis默認會把pid寫入/var/run/redis.pid文件組

pidfile /var/run/redis.pid

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

appendonly yes

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

不修改,使用默認端口

port 6379

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

bind 0.0.0.0

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

protected-mode no

默認情況下,redis不是在后臺模式運行的,如果需要在后臺進程運行,把該項的值更改為yes,默認為no

daemonize yes

redis服務(wù)以后臺進程運行的時候,Redis默認會把pid寫入/var/run/redis.pid文件組,改為yes

pidfile /var/run/redis.pid

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

appendonly yes

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

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

vim /etc/sysctl.conf

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

vm.overcommit_memory = 1

定義了TCP全連接隊列長度,默認128太小,啟動redis服務(wù)會報錯

net.core.somaxconn = 511

使配置文件永久生效

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

$ redis-server & #加上‘&’號使redis以后臺程序方式運行

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

使用客戶端:

$ redis-cli shutdown
因為Redis可以妥善處理SIGTERM信號,所以直接kill -9也是可以的

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

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

redis> set key1 value1

OK

redis> get key1

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

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

redis> INFO replication

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

● 可能遇到的問題:redis主從建立失敗,有可能是啟動服務(wù)時沒有指定正確的配置文件

● 解決思路:

(1)通過ps -ef查看服務(wù)進程ID

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

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

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

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

當前Sentinel服務(wù)運行的端口

port 26379

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

sentinel monitor mymaster 172.16.2.4 6379 2

每個Sentinel節(jié)點都要定期PING命令來判斷Redis數(shù)據(jù)節(jié)點和其余Sentinel節(jié)點是否可達,如果超過30秒且沒有回復(fù),則判定不可達

sentinel down-after-milliseconds mymaster 30000

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

sentinel parallel-syncs mymaster 1

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

sentinel failover-timeout mymaster 18000

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

sentinel auth-pass

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

sentinel notification-script

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

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

查看sentinel服務(wù)報錯

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

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

protected-mode no

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

redis-sentinel sentinel.conf &
3.測試驗證:

(1)基本連接測試:

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

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

(2)測試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這臺redis-server提升為主:

redis-cli -h 172.16.2.2 -p 6379 info replication

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

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

控制臺log,redis主從切換成功

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

確認當前主可以執(zhí)行寫操作

4.客戶端使用方式:

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

● 連接到sentinel獲取當前主redis的ip和端口(因為又執(zhí)行了一次切換,這里的主已經(jīng)切換到172.16.2.15,這里只是說明客戶端的使用方式)

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

1.方案說明

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

● 正常情況下VIP指向172.16.2.4

正常情況下VIP指向172.16.2.4

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

master故障情況下,VIP自動漂移指向172.16.2.2

2.基本配置:

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

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

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

vi /etc/sentinel.conf

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

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

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

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

LOCAL_IP="172.16.2.2" #其他兩個服務(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會一直執(zhí)行這個腳本
(3)第一次需在主redis上手工設(shè)置VIP

只需要第一次手工在主redis上設(shè)置vip,現(xiàn)在當前主redis是172.16.2.2,需要手動綁定VIP到該服務(wù)器上。(注意強烈建議加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.測試驗證

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

VIP成功綁定在master 172.16.2.2上

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

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

sentinel自動failover,將172.16.2.15提升為master

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

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

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

1.方案說明

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

2.在VIP方案基礎(chǔ)之上安裝keepalived組件(3臺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的配置文件默認是沒有的,當然sample&example文件還是有的,通常在PREFIX/etc/sample目錄下。
keepalived master和backup(backups)之間不同的是:

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

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

3.backup的配置文件中還有一個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ā)生切換時需要發(fā)送email到的對象,一行一個

 root@localhost

}

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

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

smtp_connect_timeout 10 #指定smtp連接超時時間

router_id keepalivedha_1 #運行keepalived機器的一個標識

}

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)控多個網(wǎng)段的實例

group {

    VI_1        #實例名

}

}

vrrp_instance VI_1 {

state BACKUP

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

#use_vmac keepalived

#vmac_xmit_base

mcast_src_ip 172.16.2.4

smtp_alert

virtual_router_id 20        #路由器標識,MASTER和BACKUP必須是一致的

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

advert_int 1

authentication {        #設(shè)置認證

    auth_type PASS      #認證方式

    auth_pass password      #認證密碼

}

virtual_ipaddress {     #設(shè)置vip

    172.16.2.250

}

track_script {      #監(jiān)測的對象

    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.啟動keepalived

service keepalived start

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

keepalived日志輸出

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

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

5.測試驗證

模擬主redis故障時,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進行redis主從切換,到VIP的漂移過程是需要時間的,用ping VIP來做測試,中斷時間大概需要幾秒左右,如下圖所示:

04總結(jié)

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

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

(1)Redis Sentinel 集群建議使用 >= 5 臺機器;

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • 騰訊和阿里對比哪個好?計算優(yōu)勢測評

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

    zengdongbao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<