使用redis sentinel構建redis高可用

一、redis sentinel部署

1、主從複製存在的問題

(1)主節點出現故障時,整個故障的遷移過程需要人工干預

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

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

2redis sentinel概述

      Redis sentinel是redis2.8版本推出的監控redis主從複製的一套分佈式架構,redis sentinel中包含若干個sentinel節點和redis數據節點,每個sentinel節點會對數據節點和其餘的sentinel節點進行監控,當發現節點不可達時,會對節點做下線標識。如果標識的是主節點時會和其他的sentinel節點進行協商,當大多數sentinel都認爲主節點不可達時,會選舉一個sentinel節點來完成自動故障轉移工作。

3redis sentinel的作用

(1)監控

(2)主節點故障轉移

(3)將故障轉移結果通知給應用方

(4)配置提供者

4redis sentinel安裝部署

(1)部署規劃

角色

IP地址

端口

主機內存大小

主機cpu

Redis master

192.168.16.128

6379

16g

4v

Redis slave1

192.168.16.129

6379

16g

4v

Redis master

192.168.16.130

6379

16g

4v

Redis master

192.168.16.128

26379

16g

4v

Redis master

192.168.16.129

26379

16g

4v

Redis master

192.168.16.130

26379

16g

4v

(2)redis節點的安裝配置

    Redis節點的安裝配置啓動同正常單節點的redis安裝配置啓動一致,具體的配置可根據自己需求配置。但是需要在redis從節點執行命令”slaveof 192.168.16.128 6379”或將此命令加入redis配置文件中,以建立主從同步。

    使用yum安裝的redis3.6版本在主從複製時需要通過認證或者關閉保護模式(在配置文件中添加” protected-mode no”),否則主從同步會出現問題。

(3)sentinel節點的安裝配置

    安裝完redis後,redis sentinel默認會安裝,使用yum安裝的redis默認會在”/etc/redis”目錄下生成配置文件,編譯安裝的redis需要手動創建配置文件。

    Redis sentinel的主要配置文件內容如下:

#sentinel監聽的端口,默認爲6379
port 26379
#啓動後在後臺運行
daemonize yes
#工作目錄
dir /tmp
# 監控的主節點,判斷主節點失敗至少需要兩個sentinel節點同意
sentinel monitor mymaster 192.168.16.129 6379 2
# 多久(單位毫秒)收不到master迴應則認爲master不可用
sentinel down-after-milliseconds mymaster 30000
# 發生主備切換時,最多有多少個slave對新的master同步
sentinel parallel-syncs mymaster 1
# 故障轉移的超時時間
sentinel failover-timeout mymaster 180000
# 日誌存放目錄
logfile /var/log/redis/sentinel.log
# 如果redis主節點添加了密碼,監控主節點時需要認證(默認是註釋掉的)
sentinel auth-pass <master-name> <password>
# 故障轉移時調用腳本路徑(默認是註釋掉的)
sentinel notification-script mymaster /var/redis/notify.sh
# 故障轉移後,調用腳本的路徑(默認註釋掉的,可支持redis定義好的參數)
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

    redis sentinel也可支持通過動態的設置參數配置,需要登錄redis sentinel api進行設置。設置的命令爲:sentintl set <master name> <param> <value>

(4)啓動redis sentinel

    Redis sentinel配置完成後分別啓動三個Redis sentinel節點,有兩種方法進行啓動,啓動方法如下:

    啓動方法一:redis-sentinel redis-sentinel.conf

    啓動方法二:redis-server redis-sentinel.conf --sentinel

# 分別啓動三個redis sentinel節點
]# redis-sentinel /etc/redis-sentinel.conf
# 查看啓動後監聽端口是否成功
]# lsof -i :26379
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-sen 52852 root    4u  IPv6  95541      0t0  TCP *:26379 (LISTEN)
redis-sen 52852 root    5u  IPv4  95542      0t0  TCP *:26379 (LISTEN)

(5)查看狀態

]# redis-cli -h 127.0.0.1 -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=mymaster,status=ok,address=192.168.16.128:6379,slaves=2,sentinels=3

(6)監控多套redis主節點

    如果部署了多套redis主從節點,使用redis sentinel監控redis 主節點時不需要同時部署多套redis sentinel,在同一套sentinel中通過制定多個mastername來區分不同的節點即可完成多套redis主從節點的監控。

二、redis sentinel工作原理

1sentinelredis的定時監控任務

    1)每隔10秒,每隔sentinel節點會想主節點和從節點發送info命令獲取最新的拓撲結構,從節點的信息是通過主節點獲取的(命令”info replication”執行結果中顯示的信息)。

    2)每隔2秒每個sentinel節點會向redis數據節點的”_sentinel_:hello”頻道發送該sentinel節點對主節點的判斷以及當前sentinel節點的信息。每個sentinel節點也會訂閱該頻道來了解其他sentinel節點對主節點的判斷。

    3)每隔一秒,每個sentinel節點會向主節點、從節點及其他sentinel節點發送一條ping命令做一次心跳檢測,確認節點是否可達。

2redis主管下線

    當sentinel發送ping命令超過”down-after-milliseconds”時沒有進行回覆,sentinel節點就會對該節點做失敗判定。

3、客觀下線

    當sentinel主觀下線的是主節點時,該sentinel節點會通過”sentinel is-master-down-by-addr”命令向其他sentinel節點詢問對主節點的判斷,當超過”quorum”個數時,sentinel節點認爲主節點有問題,這時sentinel節點會做出客觀下線的決定。

4redis sentinel leader節點的選舉

    Sentinel對redis主節點客觀下線後,需要在sentinel節點中選舉出一個leader完成故障的轉移。選舉流程如下:

    1)確認主節點主觀下線時,向其他sentinel節點發送”sentinel is-master-down-by-addr”命令,要求將自己設置爲主節點。

    2)收到命令的sentinel節點,如果沒有同意其他節點的”sentinel is-master-down-by-addr”命令,將同意該請求。

    3)如果該sentinel節點發現自己票數大於max(quorum,num(sentinels)/2+1),該節點將成爲leader。

    4)如果此次沒有選舉出leader,將進入下一輪選舉。

5、故障轉移

選舉出leader節點後,leader節點負責故障轉移,故障轉移的過程如下:

    1)在從節點列表中選舉出一個節點作爲新的主節點

    2)對選出來的從節點執行”slaveof no one”命令,讓選出的從節點成爲主節點

    3)讓其他的從節點從新的主節點複製,複製規則和”parallel-syncs”參數有關

    4)將原來的主節點更新爲從節點,等待恢復後讓他從新的主節點複製。

 

三、redis sentinel的管理與維護

1redis sentinel 常用操作命令

(1)查看監控的主節點的狀態信息

    Redis sentinel有自己專屬的API,查看相關信息時需要登錄sentinel API(登錄本地API命令” redis-cli -h 127.0.0.1 -p 26379”),或者直接在登錄命令後加操作命令操作。登錄操作時,命令沒有不全功能。

    命令:sentinel master

127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.16.128"

(2)展示指定主節點的狀態信息

    命令:sentinel master <master name>

127.0.0.1:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.16.128"

(3)查看指定主節點的從節點的狀態信息

    命令:sentinel slaves <master name>

#會將所有的從節點依次列出來
127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "192.168.16.133:6379"
    3) "ip"
    4) "192.168.16.133"

(4)展示指定的mastername的sentinel節點集合

    命令:sentinel sentinels <master name>

# 不會顯示當前sentinel節點的集合,並將其他的sentinel節點依次列出
127.0.0.1:26379> sentinel sentinels mymaster
1)  1) "name"
    2) "bf1a96e79aaf8be19cf7be613ab9363e961e2221"
    3) "ip"
    4) "192.168.16.128"

(5)返回指定mastername主節點的IP地址和端口

    命令:sentinel get-master-addr-by-name <master name>

127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.16.128"
2) "6379"

(6)對主節點的配置進行重置

    命令:sentinel reset <pattern>

    當前sentinel節點對符合通配符風格主節點的配置進行重置,包括清除主節點的相關狀態,重新發現從節點和sentinel節點。

(7)對指定的主節點進行強制的故障轉移

    命令:sentinel failover <master name>

# 對主節點mymaster進行強制故障轉移
127.0.0.1:26379> sentinel failover mymaster
OK
# 查看轉移後的主節點已經變爲192.168.16.133
127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.16.133"

(8)檢測當前可達的sentinel節點總數是否達到<quorum>的個數

    命令:sentinel ckquorum <master name>

(9)將sentinel節點的配置強制刷到磁盤

    命令:sentinel flushconfig

(10)取消當前sentinel節點對指定mastername主節點的監控

    命令:sentinel remove <master name>

127.0.0.1:26379> sentinel remove mymaster
OK
# 取消後查看當前節點監控的主節點
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:0
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0

(11)通過命令方式完成sentinel對master主節點的監控

    命令:sentinel monitor <master name> <ip> <port> <quorum>

# 重新監控主節點192.168.17.133
127.0.0.1:26379> sentinel monitor mymaster 192.168.16.133 6379 2
OK
# 再次查看時有監控到了主節點192.168.17.133
127.0.0.1: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=mymaster,status=ok,address=192.168.16.133:6379,slaves=2,sentinels=3

2、節點的下線

    Redis使用的過程中,有些時候,由於節點所在的機器原因或者節點自身的原因,需要對節點下線,節點的下線也分爲永久下線和臨時下線。

(1)對主節點下線

    通過任意一個sentinel的api執行命令”sentinel failover”將從節點晉升爲主節點,在將原來的主節點下線。

    如果要將指定的從節點晉升爲主節點,先將其他的從節點的”slave-priority”配置爲0,在執行”sentinel failover”命令,晉升完成後再講”slave-priority”該回原值。

(2)對從節點及sentinel節點下線

    可直接對其進行下線。但是下線後redis依然會對這些下線節點進行監控。這是由redis設計思路決定的。

3、節點的上線

(1)添加從節點

    添加從節點只需在配置文件中添加”slaveof masterip masterport”啓動從節點即可,或從節點啓動後執行命令”slaveof masterip masterport”即可。

(2)添加sentinel節點

    在sentinel節點配置文件彙總添加相關的配置,直接啓動sentinel節點即可。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章