redis高可用之sentinel哨兵

一,單實例模式linux

當系統中只有一臺redis運行時,一旦該redis掛了,會致使整個系統沒法運行。c++

二,主從模式redis

因爲單臺redis出現單點故障,就會致使整個系統不可用,因此想到的辦法天然就是備份。當一臺redis出現問題了,另外一臺redis能夠繼續提供服務。vim

 

三,自動故障轉移機制安全

  • 雖然上面redis作了備份,看上去很完美。但因爲redis目前只支持主從複製備份(不支持主主複製),當主redis掛了,從redis只能提供讀服務,沒法提供寫服務。因此,還得想辦法,當主redis掛了,讓從redis升級成爲主redis。
  • 這就須要自動故障轉移,redis sentinel帶有這個功能,當一個主redis不能提供服務時,redis sentinel能夠將一個從redis升級爲主redis,並對其餘從redis進行配置,讓他們使用新的主redis進行復製備份。
  • Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis作Master-slave的高可用方案時,假如master宕機了,Redis自己(包括它的不少客戶端)都沒有實現自動進行主備切換,而Redis-sentinel自己也是一個獨立運行的進程,它能監控多個master-slave集羣,發現master宕機後能進行自動切換。它的主要功能有如下幾點
  • 實時地監控redis是否按照預期良好地運行;
  • 若是發現某個redis節點運行出現情況,可以通知另一個進程(例如它的客戶端);
  • 可以進行自動切換。當一個master節點不可用時,可以選舉出master的多個slave(若是有超過一個slave的話)中的一個來做爲新的master,其餘的slave節點會將它所追隨的master的地址改成被提高爲master的slave的新地址。

四,redis的主從複製部署bash

4.1 環境描述服務器

這裏使用三臺服務器,每臺服務器上開啓一個redis-server和redis-sentinel服務,redis-server端口爲8000,redis-sentinel的端口爲6800,修改默認端口是安全的第一步。併發

 

redis-server測試

說明spa

redis-sentinel

10.1.1.153:8000

redis-master

 10.1.1.153: 6800

10.1.1.154:8000

redis-slaveA

 10.1.1.154: 6800

10.1.1.155:8000

redis-slaveB

 10.1.1.155: 6800

部署環境,關閉防火牆和selinux

4.2 redis-server端的部署

 三臺服務器上都進行以下編譯安裝

[root@redis-master ~]# yum -y install gcc gcc-c++ make automake autoconf
[root@redis-master ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
[root@redis-master ~]# cd /usr/src/redis-4.0.11/
[root@redis-master redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install

[root@redis-master redis-4.0.11]# mkdir -p /usr/local/redis/conf
[root@redis-master redis-4.0.11]# cp redis.conf /usr/local/redis/conf/
[root@redis-master redis-4.0.11]# cp sentinel.conf /usr/local/redis/conf/ 

[root@redis-master conf]# ln -s /usr/local/redis/bin/* /usr/local/bin/

4.3 redis.conf配置文件修改

redis-master配置文件修改:(修改前可備份配置文件)

[root@redis-master ~]# cd /usr/local/redis/conf/

[root@redis-master conf]# ls
redis.conf  sentinel.conf
[root@redis-master conf]# cp redis.conf{,.bak}

修改一下配置文件內容:

  1. port 8000
  2. daemonize yes
  3. bind 0.0.0.0
  4. pidfile /var/run/redis-8000.pid
  5. logfile "/var/log/redis-8000.log"

redis-slave配置文件修改:

  1. port 8000
  2. daemonize yes
  3. bind 0.0.0.0
  4. pidfile /var/run/redis-8000.pid
  5. logfile "/var/log/redis-8000.log"
  6. slaveof 10.1.1.153 8000    #比redis主多這行

4.4 redis-server的啓動

先啓動redis-master再啓動兩個從(都放後臺啓動,爲的是在前臺能直接看到日誌輸出信息)

[root@redis-master ~]# redis-server /usr/local/redis/conf/redis.conf &

經過命令查看主從複製狀況

[root@redis-master ~]# redis-cli -p 8000 info replication

五,redis的高可用部署(redis-sentinel)

1)修改sentinel.conf配置文件

 修改配置文件如下幾行

修改爲以下內容

 [root@redis-master conf]# cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'

注意:如今這個sentinel.conf是能夠scp的(沒啓動sentinel以前),可是當啓動了sentinel後就不能夠再scp了,啓動了sentinel,它會在配置文件里加不少東西,它會往裏面寫許多數據,行號就和以前的行號不同了,其中就會有sentinel的myid號,啓動以後再複製,會致使全部sentinel的myid號都同樣,它們之間都會認爲是本身,就找不着對方了。

配置文件說明:

  • sentinel monitor master8000 10.1.1.153 8000 2 
    • master8000:監控的主節點名字(隨便寫)
    • 10.1.1.153 8000 :主節點的IP和端口
    • 2:將這個主實例判斷爲失效至少須要2個 sentinel進程的贊成,只要贊成sentinel的數量不達標,自動failover就不會執行
  • sentinel down-after-milliseconds master8000 5000(5秒) 
    • 當master8000節點宕機後多久進行檢查
  • sentinel parallel-syncs master8000 1 
    • 設定sentinel併發仍是串行,1表明每次只能複製一個,能夠減輕master壓力
  • sentinel failover-timeout master8000 15000(15秒) 
    • 表示故障轉移的超時時間

再在sentinel.conf的最後追加如下四句話

  1. daemonize yes   #守護進程模式
  2. logfile "/var/log/sentinel.log"
  3. pidfile "/var/run/sentinel.pid"
  4. protected-mode no  

2)啓動redis-sentinel(先啓動master)

[root@redis-master ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &(後臺啓動)

雖然用redis客戶端鏈接sentinel 6800端口能夠鏈接,可是往裏面輸入命令是沒用的,sentinel是看info的

6800端口是sentinel之間互相訪問的,sentinel的使用是主從忽然發生切換,能夠經過訪問任何一臺機器的sentinel,就會知道把誰切換成主了(沒實現VIP漂移以前就是這麼查看)

啓動之後,查看sentinel信息

啓動完sentinel以後,查看它的配置文件多了哪些東西

再啓動redis-slaveA的sentinel

[root@redis-slaveA ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &

啓動之後,查看sentinel信息

再啓動redis-slaveB的sentinel

[root@redis-slaveB~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &

啓動之後,查看sentinel信息

3)進行redis-master的宕機測試

咱們宕掉redis-master的redis-server服務,而後查看sentinel信息

 [root@redis-master conf]# redis-cli -p 8000 shutdown

查看redis-sentinel日誌

 [root@redis-master conf]# cat /var/log/sentinel.log
日誌信息略,能看懂就行,看不懂百度翻譯

再把主的服務啓動,而後查看主的info信息

[root@redis-master conf]# redis-server /usr/local/redis/conf/redis.conf &

連續切換,試一下

[root@redis-slaveB conf]# redis-server /usr/local/redis/conf/redis.conf &

六,redis-sentinel的VIP漂移

假如在redis上,咱們也創建一個VIP機制,一旦redis-master宕機,那麼原本在master上的VIP就會漂移到新的master上。 
如此一來開發在鏈接redis的時候,即使redis-master發生切換,那麼開發也不須要修改代碼了。 
這裏咱們可使用redis sentinel的一個參數client-reconfig-script,這個參數配置執行腳本,sentinel在作failover的時候會執行這個腳本,而且傳遞7個參數<master-name>,<role>,<state>,<from-ip>,<from-port>,<to-ip>,<to-port>,其中<to-ip>是新主redis的IP地址,能夠在這個腳本里作VIP漂移操做

在sentinel.conf裏增長一句話

sentinel client-reconfig-script master8000 /usr/local/redis/notify_master6800.sh  增長漂移腳本路徑

寫一個漂移腳本

 [root@redis-master redis]# pwd
/usr/local/redis
[root@redis-master redis]# vim notify_master6800.sh
[root@redis-master redis]# cat notify_master6800.sh
#!/bin/bash

MASTER_IP=$6     #第六個參數就是sentinel傳入進行來的新master的IP

LOCAL_IP="10.1.1.153"     #腳本所在服務器的本地IP(每一個服務器都不一樣)

VIP="10.1.1.244"

NETMASK="24"

INTERFACE="ens32"

if [[ "${MASTER_IP}" == "${LOCAL_IP}" ]];then
    /usr/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
    /usr/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else
    /usr/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
    exit 0
fi
exit 1

改一下服務器的IP

給腳本加x權限

 [root@redis-master redis]# chmod +x notify_master6800.sh

 從新啓動全部的redis-sentinel進程

[root@redis-master redis]# pkill redis-sentinel
[root@redis-master redis]# redis-sentinel /usr/local/redis/conf/sentinel.conf

 第一次時手動給master添加VIP

 [root@redis-master redis]# ip addr add 10.1.1.244/24 dev ens32

讓ip地址即刻生效

[root@redis-master redis]# arping -q -c 3 -A 10.1.1.244 -I ens32

接下來進行ip漂移測試

查看VIP所在服務器

查看redis-master所屬服務器

中止153服務器的redis-server服務

[root@redis-master ~]# redis-cli -p 8000 shutdown
查看redis-master的所屬服務器

在154服務器上查看VIP及主從複製狀況

再開啓153的redis-server服務

[root@redis-master ~]# redis-server /usr/local/redis/conf/redis.conf &

查看主從複製狀況

關掉154的服務,並查看154所屬服務器

[root@redis-slaveA conf]# redis-cli -p 8000 shutdown

在主服務器153上查看VIP及主從複製狀況

將154服務開啓,再看主從複製狀況

至此redis-sentinel的VIP漂移測試成功。redis-sentinel能夠持續高可用,能夠繼續測試。

相關文章
相關標籤/搜索