1.傳統(tǒng)redis高可用方案只加了sentinel,在主庫(kù)故障后,雖然可以選主,然后切換只讀參數(shù),但是,對(duì)應(yīng)用來(lái)說(shuō)卻需要更改連接的IP或者在hosts中更改解析。算得上是半自動(dòng)。
2.利用consul系統(tǒng)的服務(wù)注冊(cè)與服務(wù)健康檢查功能可以實(shí)現(xiàn)全自動(dòng)的故障切換與地址解析。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出海勃灣免費(fèi)做網(wǎng)站回饋大家。
1.建立consul集群,在redis節(jié)點(diǎn)上布置consul agent
2.建立sentinel集群
3.注冊(cè)服務(wù)(重點(diǎn))
cat >/root/check/redis_role.sh<
注:腳本使用方式:/root/check/redis_role.sh 2222 master
第一個(gè)參數(shù)2222代表端口
第二個(gè)參數(shù)master代表主,也可使用slave
原理:摘出info命令中replication段的role屬性,然后和第二個(gè)變量相對(duì)比,相同,則輸出0
(shell腳本正常運(yùn)行的返回值),否則返回2(shell腳本執(zhí)行異常的返回值)
cat >/etc/consu/redis_2222.json<
在redis3333實(shí)例所在的主機(jī)上同樣操作。
解釋?zhuān)涸?222實(shí)例上我們注冊(cè)兩個(gè)服務(wù),一個(gè)為redis-master,一個(gè)為redis-slave。
在3333實(shí)例上也注冊(cè)了同樣的兩個(gè)服務(wù),在consul系統(tǒng)中,將json配置文件中name屬性相同的
服務(wù)視為同一個(gè)服務(wù)。因?yàn)閏onsul本身是具備健康檢查的功能,一個(gè)服務(wù)中如果兩個(gè)節(jié)點(diǎn)都OK
服務(wù)域名解析是將會(huì)輪詢(xún)到兩個(gè)節(jié)點(diǎn)中,但健康檢查失敗后,域名解析時(shí)會(huì)自動(dòng)踢出fail節(jié)點(diǎn)。
情況1:redis2222為主實(shí)例,redis3333為從實(shí)例
通過(guò)在腳本對(duì)redis的主從屬性進(jìn)行檢查, "args":["/root/check/redis_role.sh","2222","master"],
在腳本中,我們?cè)O(shè)置了讀取傳入的兩個(gè)參數(shù)并進(jìn)行使用,在consul配置文件中,對(duì)傳入?yún)?shù)
需要使用“,”分割,并且無(wú)論數(shù)字或者字符串都需要加上雙引號(hào)。
2222的實(shí)例中role為master,3333的實(shí)例role為 slave。分別滿足了redis-master和redis-slave
的健康檢查,consul在解析redis-master.service.consul和redis-slave.service.consul時(shí)分別指向
了redis2222的主機(jī)和redis3333的地址。
此時(shí): ping redis-master.service.consul 》192.168.1.131
ping redis-slave.service.consul 》192.168.1.104
APP可以通過(guò)redis-master.service.consul:2222對(duì)redis進(jìn)行寫(xiě)入,
通過(guò)redis-master.service.consul:3333對(duì)redis進(jìn)行分散讀請(qǐng)求
consul web頁(yè)面如圖
情況2:redis2222節(jié)點(diǎn)故障,sentinel自動(dòng)提升redis3333節(jié)點(diǎn)為主節(jié)點(diǎn),2222重新上線后,被
sentinel集群配置為指向3333的從節(jié)點(diǎn)。
此時(shí): ping redis-master.service.consul 》192.168.1.104
ping redis-slave.service.consul 》192.168.1.131
APP可以通過(guò)redis-master.service.consul:3333對(duì)redis進(jìn)行寫(xiě)入,
通過(guò)redis-master.service.consul:2222對(duì)redis進(jìn)行分散讀請(qǐng)求
consul web頁(yè)面如圖
后記:
1.本文中為了顯著區(qū)分兩個(gè)redis實(shí)例,對(duì)端口進(jìn)行了區(qū)分,實(shí)際應(yīng)用推薦使用相同端口(如2222)
這樣每次訪問(wèn)redis-master.service.consul:2222都能訪問(wèn)到主實(shí)例
每次訪問(wèn)redis-master.service.consul:2222都能訪問(wèn)到從實(shí)例
2. consul定期執(zhí)行健康檢測(cè)腳本并接收返回值0作為服務(wù)處于正常的標(biāo)志,返回值1作為服務(wù)處于警告
狀態(tài),除此之外任何其他返回值都被認(rèn)為服務(wù)處于故障狀態(tài)。實(shí)際使用時(shí)根據(jù)自身情況設(shè)置健康檢測(cè)腳本
執(zhí)行的頻率
3.這種切換架構(gòu)的便利性建立在數(shù)據(jù)庫(kù)端可以自洽的完成主從選舉與切換的特性上,同理,這種思路還
可以用在consul+MongoDB副本集,consul+PXC集群上。
4.官方文檔地址:`https://www.consul.io/docs/index.html`
相關(guān)配置文件已放置在GitHub:`https://github.com/naughtyGitCat/HA_DB/tree/master/Consul`