一、redis sentinel部署
1、主從複製存在的問題
(1)主節點出現故障時,整個故障的遷移過程需要人工干預
(2)主節點寫能力受到單機限制
(3)主節點存儲能力受到單機限制
2、redis sentinel概述
Redis sentinel是redis2.8版本推出的監控redis主從複製的一套分佈式架構,redis sentinel中包含若干個sentinel節點和redis數據節點,每個sentinel節點會對數據節點和其餘的sentinel節點進行監控,當發現節點不可達時,會對節點做下線標識。如果標識的是主節點時會和其他的sentinel節點進行協商,當大多數sentinel都認爲主節點不可達時,會選舉一個sentinel節點來完成自動故障轉移工作。
3、redis sentinel的作用
(1)監控
(2)主節點故障轉移
(3)將故障轉移結果通知給應用方
(4)配置提供者
4、redis 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工作原理
1、sentinel對redis的定時監控任務
1)每隔10秒,每隔sentinel節點會想主節點和從節點發送info命令獲取最新的拓撲結構,從節點的信息是通過主節點獲取的(命令”info replication”執行結果中顯示的信息)。
2)每隔2秒每個sentinel節點會向redis數據節點的”_sentinel_:hello”頻道發送該sentinel節點對主節點的判斷以及當前sentinel節點的信息。每個sentinel節點也會訂閱該頻道來了解其他sentinel節點對主節點的判斷。
3)每隔一秒,每個sentinel節點會向主節點、從節點及其他sentinel節點發送一條ping命令做一次心跳檢測,確認節點是否可達。
2、redis主管下線
當sentinel發送ping命令超過”down-after-milliseconds”時沒有進行回覆,sentinel節點就會對該節點做失敗判定。
3、客觀下線
當sentinel主觀下線的是主節點時,該sentinel節點會通過”sentinel is-master-down-by-addr”命令向其他sentinel節點詢問對主節點的判斷,當超過”quorum”個數時,sentinel節點認爲主節點有問題,這時sentinel節點會做出客觀下線的決定。
4、redis 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的管理與維護
1、redis 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節點即可。