Part_five:Redis哨兵高可用

redis哨兵高可用

1.redis-sentinel

Redis-Sentinel是redis官方推薦的高可用性解決方案,
當用redis做master-slave的高可用時,若是master自己宕機,redis自己或者客戶端都沒有實現主從切換的功能。

而redis-sentinel就是一個獨立運行的進程,用於監控多個master-slave集羣,
自動發現master宕機,進行自動切換slave > master。

2.redis-sentinel功能

1.不時的監控redis是否良好運行,若是節點不可達就會對節點進行下線標識
2.若是被標識的是主節點,sentinel就會和其餘的sentinel節點「協商」,若是其餘節點也人爲主節點不可達,就會選舉一個sentinel節點來完成自動故障轉義
3.在master-slave進行切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換

3.sentinel的工做方式

每一個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其餘 Sentinel 實例發送一個 PING 命令
 

若是一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記爲主觀下線。

若是一個Master被標記爲主觀下線,則正在監視這個Master的全部 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。

當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記爲客觀下線

在通常狀況下, 每一個 Sentinel 會以每 10 秒一次的頻率向它已知的全部Master,Slave發送 INFO 命令

當Master被 Sentinel 標記爲客觀下線時,Sentinel 向下線的 Master 的全部 Slave 發送 INFO 命令的頻率會從 10 秒一次改成每秒一次

若沒有足夠數量的 Sentinel 贊成 Master 已經下線, Master 的客觀下線狀態就會被移除。

若 Master 從新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。

主觀下線和客觀下線

主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 實例對某個redis服務器作出的下線判斷。
客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 實例在對Master Server作出 SDOWN 判斷,而且經過 SENTINEL is-master-down-by-addr 命令互相交流以後,得出的Master Server下線判斷,而後開啓failover.

SDOWN適合於Master和Slave,只要一個 Sentinel 發現Master進入了ODOWN, 這個 Sentinel 就可能會被其餘 Sentinel 推選出, 並對下線的主服務器執行自動故障遷移操做。

ODOWN只適用於Master,對於Slave的 Redis 實例,Sentinel 在將它們判斷爲下線前不須要進行協商, 因此Slave的 Sentinel 永遠不會達到ODOWN。

4.redis主從複製背景

Redis主從複製可將主節點數據同步給從節點,從節點此時有兩個做用:

1.一旦主節點宕機,從節點做爲主節點的備份能夠隨時頂上來。
2.擴展主節點的讀能力,分擔主節點讀壓力。
可是問題是:

    一旦主節點宕機,從節點上位,那麼須要人爲修改全部應用方的主節點地址(改成新的master地址),還須要命令全部從節點複製新的主節點
那麼這個問題,redis-sentinel就能夠解決了

5.主從複製架構

6.redis Sentinel架構

7.代碼實現

1.環境準備

#三個redis數據實例,配置好 1主2從

#建立文件夾
[root@xujunk data]#mkdir sbredis
[root@xujunk data]#cd sbredis
#建立3個redis配置
[root@xujunk sbredis]#vim 6379.conf
[root@xujunk sbredis]#sed "s/6379/6380/g" 6379.conf > 6380.conf
[root@xujunk sbredis]#sed "s/6379/6381/g" 6379.conf > 6381.conf

"""
    6379.conf
        port 6379
        daemonize yes
        logfile "6379.log"
        dbfilename "dump-6379.rdb"
        dir "/var/redis/data/"

    6380.conf 
        port 6380
        daemonize yes
        logfile "6380.log"
        dbfilename "dump-6380.rdb"
        dir "/var/redis/data/"
        slaveof 127.0.0.1 6379

    6381.conf 
        port 6381
        daemonize yes
        logfile "6381.log"
        dbfilename "dump-6381.rdb"
        dir "/var/redis/data/"
        slaveof 127.0.0.1 6379
"""
#配置從屬關係
[root@xujunk sbredis]#echo "slaveof 127.0.0.1 6379" >> 6380.conf
[root@xujunk sbredis]#echo "slaveof 127.0.0.1 6379" >> 6381.conf

#建立文件用於存儲數據和日誌
[root@xujunk sbredis]#mkdir -p /var/redis/data/

#啓動redis
[root@xujunk sbredis]#redis-server 6379.conf 
[root@xujunk sbredis]#redis-server 6380.conf 
[root@xujunk sbredis]#redis-server 6381.conf 
[root@xujunk sbredis]#!ps
"""
ps -ef |grep redis
root      33158      1  0 21:15 ?        00:00:00 redis-server *:6379
root      33167      1  0 21:15 ?        00:00:00 redis-server *:6380
root      33175      1  1 21:15 ?        00:00:00 redis-server *:6381
root      33186  26372  0 21:15 pts/1    00:00:00 grep --color=auto redis
"""

#三個redis哨兵進程,指定好,檢測着誰
#也是準備3個配置文件
sentinel-26379.conf
sentinel-26380.conf
sentinel-26381.conf

[root@xujunk sbredis]#touch sentinel-26379.conf
[root@xujunk sbredis]#vim sentinel-26379.conf 
"""
port 26379  
dir /var/redis/data/
logfile "26379.log"
sentinel monitor s21ms  127.0.0.1  6379 2
sentinel down-after-milliseconds s21ms  20000
sentinel parallel-syncs s21ms 1
sentinel failover-timeout s21ms 180000
daemonize yes 
"""
#分別生成 sentinel-26380.conf        sentinel-26381.conf
[root@xujunk sbredis]#sed "s/26379/26380/g" sentinel-26379.conf > sentinel-26380.conf
[root@xujunk sbredis]#sed "s/26379/26381/g" sentinel-26379.conf > sentinel-26381.conf

2.代碼驗證

#分別啓動 三個redis數據庫,  以及三個 哨兵進程 ,注意 ,哨兵第一次啓動後,會修改配置文件,若是錯了,得刪除配置文件,從新寫
1.啓動哨兵
[root@xujunk sbredis]#redis-sentinel sentinel-26379.conf 
[root@xujunk sbredis]#redis-sentinel sentinel-26380.conf 
[root@xujunk sbredis]#redis-sentinel sentinel-26381.conf 
2.查看後臺哨兵,redis運行狀態:
[root@xujunk sbredis]#!ps
"""
ps -ef |grep redis
root      33158      1  0 21:15 ?        00:00:00 redis-server *:6379
root      33167      1  0 21:15 ?        00:00:00 redis-server *:6380
root      33175      1  0 21:15 ?        00:00:00 redis-server *:6381
root      33853      1  0 21:24 ?        00:00:00 redis-sentinel *:26379 [sentinel]
root      33870      1  0 21:24 ?        00:00:00 redis-sentinel *:26380 [sentinel]
root      33877      1  1 21:24 ?        00:00:00 redis-sentinel *:26381 [sentinel]
"""
#運行狀態正常
3.驗證哨兵是否正常:
[root@xujunk sbredis]#redis-cli -p 26379 info sentinel
"""
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=s21ms,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

"""
#name=s21ms,主節點address=127.0.0.1:6379  從節點2個 哨兵3個

3.幹掉主庫(主節點) ,檢查主從切換狀態 
[root@xujunk sbredis]#kill -9 33158
4.查看從庫(從節點)6380,6381  :
[root@xujunk sbredis]#redis-cli -p 6380 info replication
"""
# Replication
role:master         #主節點
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=85816,lag=0
master_replid:9450087193f724b8538d25eef9336803ce96e71b
master_replid2:d43267907dd90579d5c9ef10af38464e49f23ba2
master_repl_offset:85816
second_repl_offset:84624
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:85816
"""
[root@xujunk sbredis]#redis-cli -p 6381 info replication
"""
# Replication
role:slave          #從節點
master_host:127.0.0.1
master_port:6380    #歸屬6380端口
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:87130
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9450087193f724b8538d25eef9336803ce96e71b
master_replid2:d43267907dd90579d5c9ef10af38464e49f23ba2
master_repl_offset:87130
second_repl_offset:84624
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:87130
"""
#能夠看出6380端口切換成主庫(主節點),6381端口切換成6380端口的從節點

3.哨兵配置內容介紹:

port 26379  
    dir /var/redis/data/
    logfile "26379.log"

    // 當前Sentinel節點監控 192.168.182.130:6379 這個主節點
    // 2表明判斷主節點失敗至少須要2個Sentinel節點節點贊成
    // mymaster是主節點的別名
    sentinel monitor s21ms  0.0.0.0 6379 2

    //每一個Sentinel節點都要按期PING命令來判斷Redis數據節點和其他Sentinel節點是否可達,若是超過30000毫秒30s且沒有回覆,則斷定不可達
    sentinel down-after-milliseconds s21ms  20000

    //當Sentinel節點集合對主節點故障斷定達成一致時,Sentinel領導者節點會作故障轉移操做,選出新的主節點,
    原來的從節點會向新的主節點發起復制操做,限制每次向新的主節點發起復制操做的從節點個數爲1
    sentinel parallel-syncs mymaster 1

    //故障轉移超時時間爲180000毫秒
    sentinel failover-timeout mymaster 180000
相關文章
相關標籤/搜索