背景:
傳統redis高可用方案隻加了sentinel,在主庫故障後,雖然可以選主,然後切換隻讀參數,但是,對
應用來說卻需要更改連接配接的IP或者在hosts中更改解析。算得上是半自動。
利用consul系統的服務注冊與服務健康檢查功能可以實作全自動的故障切換與位址解析。
架構:

搭建:
1.建立consul叢集,在redis節點上布置consul agent
2.建立sentinel叢集
3.注冊服務(重點)
首先在redis2222執行個體上建立redis主從檢測腳本
<code>cat &gt;/root/check/redis_role.sh&lt;&lt;EOF<br/>#!/bin/bash<br/>PORT=$1<br/>ROLE=$2<br/>a=$(redis-cli -p $PORT info Replication|grep role:|awk -F ':' '{print $2}'|awk -F '\r' '{print $1}' )<br/>if [ $a = $ROLE ]; then<br/>exit 0<br/>else<br/>exit 2<br/>fi<br/>EOF</code>
注:腳本使用方式:/root/check/redis_role.sh 2222 master
第一個參數2222代表端口
第二個參數master代表主,也可使用slave
原理:摘出info指令中replication段的role屬性,然後和第二個變量相對比,相同,則輸出0
(shell腳本正常運作的傳回值),否則傳回2(shell腳本執行異常的傳回值)
其次:建立consul的redis服務配置檔案
<code>cat &gt;/etc/consu/redis_2222.json&lt;&lt;EOF<br/>{<br/>"services":[<br/>{<br/>"id":"2222master",<br/>"name":"redis-master",<br/>"tags":["master"],<br/>"address":"192.168.1.131",<br/>"port":2222,<br/>"check":[<br/>{<br/>"args":["/root/check/redis_role.sh","2222","master"],<br/>"interval":"3s"<br/>}<br/>]<br/>},<br/>{<br/>"id":"2222slave",<br/>"name":"2222slave"<br/>"tags":["slave"]<br/>"address":"192.168.1.131"<br/>"port":2222<br/>"checks":[<br/>{<br/>"args":["/root/check/redis_role.sh","2222","slave"],<br/>"interval":"3s"<br/>}<br/>]<br/>}<br/>]<br/>}<br/>EOF</code>
在redis3333執行個體所在的主機上同樣操作。
解釋:在2222執行個體上我們注冊兩個服務,一個為redis-master,一個為redis-slave。
在3333執行個體上也注冊了同樣的兩個服務,在consul系統中,将json配置檔案中name屬性相同的
服務視為同一個服務。因為consul本身是具備健康檢查的功能,一個服務中如果兩個節點都OK
服務域名解析是将會輪詢到兩個節點中,但健康檢查失敗後,域名解析時會自動踢出fail節點。
本文轉自 angry_frog 51CTO部落格,原文連結:http://blog.51cto.com/l0vesql/2055893