【Redis】Redis Sentinel

IP:192.168.225.12八、192.168.225.129
環境:centos7
版本:redis-3.2.10html

1、Redis sentinel

Redis 的 Sentinel 系統用於管理多個 Redis 服務器(instance), 該系統執行如下三個任務:
監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運做正常。
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 能夠經過 API 向管理員或者其餘應用程序發送通知。
自動故障遷移(Automatic failover): 當一個主服務器不能正常工做時, Sentinel 會開始一次自動故障遷移操做, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其餘從服務器改成複製新的主服務器; 當客戶端試圖鏈接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可使用新主服務器代替失效服務器。redis

Redis Sentinel 是一個分佈式系統, 你能夠在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主服務器是否下線的信息, 並使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪一個從服務器做爲新的主服務器。
雖然 Redis Sentinel 釋出爲一個單獨的可執行文件 redis-sentinel , 但實際上它只是一個運行在特殊模式下的 Redis 服務器, 你能夠在啓動一個普通 Redis 服務器時經過給定 –sentinel 選項來啓動 Redis Sentinel 。vim

2、配置redis主從

詳細配置見文章redis主從配置
128/129上面安裝路徑:/usr/local/redis
數據路徑:/data/redis637九、/data/redis6380centos

配置環境:api

Master:192.168.225.128:6379
Slave1:192.168.225.129:6380
Slave2:192.168.225.129:6381

確認redis節點是否啓動服務器

[root@vm-test1 redis]# redis-cli -h 192.168.225.128 -p 6379 ping
PONG

主redis的info replication信息架構

# Replication
role:master
connected_slaves:2
slave0:ip=192.168.225.129,port=6380,state=online,offset=44477,lag=1
slave1:ip=192.168.225.129,port=6381,state=online,offset=44477,lag=1
master_repl_offset:44477
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:44476

3、配置啓動sentinel

步驟 一、修改配置文件

# cd /usr/local/redis
# cp sentinel.conf sentinel-1.conf
# vim sentinel-1.conf 修改成
sentinel monitor mymaster 192.168.225.128 6379 2

說明:mymaster不須要是主機名,可本身定義,只須要先後保持一致
Sentinel-1節點須要監控192.168.225.128:6379這個主節點,2表明判斷主節點失敗至少須要2個sentinel節點贊成,mymaster是主節點別名。
2這個值定義爲幾的標準:通常建議將其設置爲sentinel節點的一半加1運維

步驟 二、啓動

方法1:
# cd /usr/local/redis/
# bin/redis-server sentinel-1.conf --sentinel
方法2:
# cd /usr/local/redis/
# bin/redis-sentinel sentinel-1.conf

兩種方式原則上同樣分佈式

[root@bogon redis]# bin/redis-sentinel sentinel-1.conf &
[1] 7187
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.10 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 7187
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

7187:X 28 Aug 12:21:29.456 # Sentinel ID is 589d622f9a149e71a49d04431988bc1d726fc87a
7187:X 28 Aug 12:21:29.456 # +monitor master mymaster 192.168.225.128 6379 quorum 2
7187:X 28 Aug 12:21:29.457 * +slave slave 192.168.225.129:6380 192.168.225.129 6380 @ mymaster 192.168.225.128 6379
7187:X 28 Aug 12:21:29.461 * +slave slave 192.168.225.129:6381 192.168.225.129 6381 @ mymaster 192.168.225.128 6379
[root@bogon redis]# ps -ef |grep sentinel
root       7187   3100  0 12:21 pts/0    00:00:00 bin/redis-sentinel *:26379 [sentinel]
root       7222   3100  0 12:21 pts/0    00:00:00 grep --color sentinel

步驟 三、Sentinel-2和sentinel-3的啓動方式同上一致

步驟 四、確認

啓動一個sentinel後(啓動3個sentinel後sentinels=3)測試

[root@vm-test1 redis]# 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=mymaster,status=ok,address=192.168.225.128:6379,slaves=2,sentinels=1

步驟 五、說明:

3個sentinel啓動後,查看sentinel-1.conf,發生了變化,體如今:
1.sentinel節點自動發現了從節點、其他sentinel節點
2.去掉了默認配置,例如:parallel-syncs、failover-timeout參數
3.添加了配置紀元相關參數

port 26379
dir "/data/sentinel-1"
sentinel myid 79d2238ec1b78bbc87c63c831628bd075b874c06
sentinel monitor mymaster 192.168.225.128 6379 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
#發現2個slave節點
sentinel known-slave mymaster 192.168.225.129 6380
sentinel known-slave mymaster 192.168.225.129 6381
# 發現2個sentinel節點
sentinel known-sentinel mymaster 192.168.225.128 26381 92e43ffca6742b68f8937b8ae69abdfd3390b56d
sentinel known-sentinel mymaster 192.168.225.128 26380 4c9cf1849b1bd7c6d4f5a5b30f986dbac2cc3f99
sentinel current-epoch 0

步驟 六、測試是否可實現故障轉移

1.將主reids 129:6379關閉(主129:6379,從128:6380)
2.查看sentinel日誌以下:

clipboard.png

步驟 七、日誌中常見的命令

<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>
+reset-master :主服務器已被重置。
+slave :一個新的從服務器已經被 Sentinel 識別並關聯。
+failover-state-reconf-slaves :故障轉移狀態切換到了 reconf-slaves 狀態。
+failover-detected :另外一個 Sentinel 開始了一次故障轉移操做,或者一個從服務器轉換成了主服務器。
+slave-reconf-sent :領頭(leader)的 Sentinel 向實例發送了 [SLAVEOF](/commands/slaveof.html) 命令,爲實例設置新的主服務器。
+slave-reconf-inprog :實例正在將本身設置爲指定主服務器的從服務器,但相應的同步過程仍未完成。
+slave-reconf-done :從服務器已經成功完成對新主服務器的同步。
-dup-sentinel :對給定主服務器進行監視的一個或多個 Sentinel 已經由於重複出現而被移除 —— 當 Sentinel 實例重啓的時候,就會出現這種狀況。
+sentinel :一個監視給定主服務器的新 Sentinel 已經被識別並添加。
+sdown :給定的實例如今處於主觀下線狀態。
-sdown :給定的實例已經再也不處於主觀下線狀態。
+odown :給定的實例如今處於客觀下線狀態。
-odown :給定的實例已經再也不處於客觀下線狀態。
+new-epoch :當前的紀元(epoch)已經被更新。
+try-failover :一個新的故障遷移操做正在執行中,等待被大多數 Sentinel 選中(waiting to be elected by the majority)。
+elected-leader :贏得指定紀元的選舉,能夠進行故障遷移操做了。
+failover-state-select-slave :故障轉移操做如今處於 select-slave 狀態 —— Sentinel 正在尋找能夠升級爲主服務器的從服務器。
no-good-slave :Sentinel 操做未能找到適合進行升級的從服務器。Sentinel 會在一段時間以後再次嘗試尋找合適的從服務器來進行升級,又或者直接放棄執行故障轉移操做。
selected-slave :Sentinel 順利找到適合進行升級的從服務器。
failover-state-send-slaveof-noone :Sentinel 正在將指定的從服務器升級爲主服務器,等待升級功能完成。
failover-end-for-timeout :故障轉移由於超時而停止,不過最終全部從服務器都會開始複製新的主服務器(slaves will eventually be configured to replicate with the new master anyway)。
failover-end :故障轉移操做順利完成。全部從服務器都開始複製新的主服務器了。
+switch-master :配置變動,主服務器的 IP 和地址已經改變。 這是絕大多數外部用戶都關心的信息。
+tilt :進入 tilt 模式。
-tilt :退出 tilt 模式。

4、配置優化

port 26379
dir "/data/sentinel-1"
sentinel monitor mymaster 192.168.225.128 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
# sentinel auth-pass <master-name> <password>
# sentinel notification-script <master-name> <script-path>
# sentinel client-reconfig-script <master-name> <script-path>

一、Port和dir

Port和dir分別表明sentinel節點的端口和工做目錄

二、Sentinel monitor

Sentinel monitor <master-name> <ip><port> <quorum>
sentinel節點會按期監控主節點,
<master-name> sentinel要監控的主節點的名稱
IP地址和端口爲<ip><port>的主節點
<quorum>表明要斷定主節點最終不可達所須要的票數

三、sentinel down-after-milliseconds

每一個sentinel節點都要經過按期發送ping命令來判斷redis數據節點和其他sentinel節點是否可達,若是超過了該時間,則斷定節點不可達。單位:毫秒

四、sentinel parallel-syncs <master-name> <numslaves>

Sentinel領導者節點作故障轉移操做,選出新的主節點,原來的從節點會向新的主節點發起復制操做,parallel-syncs就是用來限制在一次故障轉移以後,每次向新的主節點發起復制操做的從節點的個數。
parallel-syncs=3 3個從節點同時發起複製
parallel-syncs=1 一次只有一個從節點複製,從節點會輪詢發起複製

五、Sentinel failover-timeout

故障轉移超時時間,做用於各個階段。
A) 選出合適從節點
B) 晉升選出的從節點爲主節點
C) 命令其他從節點複製新的主節點
D) 等待原主節點恢復後命令它去複製新的主節點

六、Sentinel auth-pass <master-name> <password>

若是sentinel監控的主節點設置了密碼,sentinel經過以上命令添加主節點的密碼

5、API

Sentinel節點是一個特殊的redis,有本身專屬的api

1. redis-cli -p 26379

進入api客戶端

2. sentinel masters

展現全部被監控的主節點狀態以及相關統計信息
127.0.0.1:26379> sentinel masters

3. sentinel master <master name>

展現指定<master name>的主節點的狀態以及相關統計信息

4. sentinel slaves <master name>

展現指定<master name>的從節點的狀態以及相關統計信息

5. sentinel sentinels <master name>

展現指定<master name>的sentinel節點集合(不包含當前sentinel節點)

6. sentinel get-master-addr-by-name <master name>

返回指定<master name>主節點的ip和端口
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.225.128"
2) "6379"

7. sentinel reset <pattern>

當前sentinel對符合pattern(通配符風格)主節點進行重置,包含清除主節點的相關狀態(例如故障轉移),從新發現重節點和sentinel節點
eg:sentinel reset mymaster # sentinel-1節點對mymaster節點重置狀態

8. sentinel failover <master name>

對指定<master name>主節點進行強制故障轉移(沒有和其餘sentinel節點協商)故障轉移完成後,其餘的sentinel節點按照故障轉移的結果更新自身配置(該命令在平常運維中很是有用)

clipboard.png

9. sentinel ckquorum <master name>

檢測當前可達的sentinel節點總數是否達到quorum的個數

10. sentinel remove <master name>

取消當前sentinel節點對於指定master name主節點的監控

11. sentinel monitor <master name> <ip> <port> <quorum>

如:sentinel monitor mymaster-1 192.168.225.128 6379 2
和配置文件中該行命令的做用相同

12. sentinel set <master name>

可動態調整一些參數

quorum
down-after-nilliseconds
failover-timeout
parallel-syncs
notification-script
client-reconfig-script
auth-pass

13. Sentinel is-master-down-by-addr

Sentinel節點之間用來交換對主節點是否下線的判斷

相關文章
相關標籤/搜索