Sentinel原理簡介
sentinel是Redis高可用Ha的重要組成部分,在Redis master/slave架構下,擔任對主從復制的狀態監控,並在主節點異常后自動將從節點提升為主節點對外提供服務。
下圖展示了一個在哨兵sentinel集群中監控redis主從復制的一個例子,其中:
1. Sentinel集群包括三個sentinel節點sentinel1、sentinel2、seninel3,sentinel集群各節點之間互相監控哨兵運行狀態。
2.Sentinel集群各節點分別與Redis主節點進行ping命令,以檢查Redis主節點的運行狀態。
3.假設Sentinel集群檢測到Redis主節點Master宕機,在指定時間內未恢復,則Sentinel集群就會對Redis做故障轉移操作。
3.1 首先,Sentinel集群從各slave節點中挑選一台優先級最高的slave節點提升為Master節點。
3.2,其次,新的Master節點向原Master的所有從節點發送slaveof命令,讓它們作為新Master的slave節點,並將新的Master節點數據復制數據各個slave節點上,故障轉移完成。
3.3 最后,Sentinel集群會繼續監視老的Master節點,老的Master恢復上線后,Sentinel會將它設置為新Master的slave節點。
3.4 故障轉移后的拓撲圖如下所示,在圖中,slave節點slave-1被選舉成為新的Master的節點。
一 .Sentinel節點初始化過程
一個Sentinel節點對Redis主從節點、sentinel節點獲得運行數據后,最終在內存生成如下所示的內存結構,我們根據此圖進行sentinel初始化過程原理介紹。
一個Sentinel節點啟動后,依次執行以下步驟:
1. 載入sentinel專用的代碼塊
Sentinel服務器本質上是一個無持久化特性和部分功能限制的普通Redis服務器
- 無持久化:Sentinel沒有Redis的RDB和AOF特性,不需要將運行的內存數據記錄到數據庫中
- 功能限制:Sentinel啟動時會使用Sentinel專用代碼,比如,默認配置屬性和命令列表,在源碼文件src/sentinel.c文件中可以看到載入Sentinel專用代碼
載入的默認配置屬性
/* A Sentinel Redis Instance object is monitoring. */ #define SRI_MASTER (1<<0) #define SRI_SLAVE (1<<1) #define SRI_SENTINEL (1<<2) #define SRI_S_DOWN (1<<3) /* Subjectively down (no quorum). */ #define SRI_O_DOWN (1<<4) /* Objectively down (confirmed by others). */ #define SRI_MASTER_DOWN (1<<5) /* A Sentinel with this flag set thinks that its master is down. */ #define SRI_FAILOVER_IN_PROGRESS (1<<6) /* Failover is in progress for this master. */ #define SRI_PROMOTED (1<<7) /* Slave selected for promotion. */ #define SRI_RECONF_SENT (1<<8) /* SLAVEOF <newmaster> sent. */ #define SRI_RECONF_INPROG (1<<9) /* Slave synchronization in progress. */ #define SRI_RECONF_DONE (1<<10) /* Slave synchronized with new master. */ #define SRI_FORCE_FAILOVER (1<<11) /* Force failover with master up. */ #define SRI_SCRIPT_KILL_SENT (1<<12) /* SCRIPT KILL already sent on -BUSY */ /* Note: times are in milliseconds. */ #define SENTINEL_INFO_PERIOD 10000 #define SENTINEL_PING_PERIOD 1000 #define SENTINEL_ASK_PERIOD 1000 #define SENTINEL_PUBLISH_PERIOD 2000 #define SENTINEL_DEFAULT_DOWN_AFTER 30000 #define SENTINEL_HELLO_CHANNEL "__sentinel__:hello" #define SENTINEL_TILT_TRIGGER 2000 #define SENTINEL_TILT_PERIOD (SENTINEL_PING_PERIOD*30) #define SENTINEL_DEFAULT_SLAVE_PRIORITY 100 #define SENTINEL_SLAVE_RECONF_TIMEOUT 10000 #define SENTINEL_DEFAULT_PARALLEL_SYNCS 1 #define SENTINEL_MIN_LINK_RECONNECT_PERIOD 15000 #define SENTINEL_DEFAULT_FAILOVER_TIMEOUT (60*3*1000) #define SENTINEL_MAX_PENDING_COMMANDS 100 #define SENTINEL_ELECTION_TIMEOUT 10000 #define SENTINEL_MAX_DESYNC 1000
載入的默認命令列表
struct redisCommand sentinelcmds[] = { {"ping",pingCommand,1,"",0,NULL,0,0,0,0,0}, {"sentinel",sentinelCommand,-2,"",0,NULL,0,0,0,0,0}, {"subscribe",subscribeCommand,-2,"",0,NULL,0,0,0,0,0}, {"unsubscribe",unsubscribeCommand,-1,"",0,NULL,0,0,0,0,0}, {"psubscribe",psubscribeCommand,-2,"",0,NULL,0,0,0,0,0}, {"punsubscribe",punsubscribeCommand,-1,"",0,NULL,0,0,0,0,0}, {"publish",sentinelPublishCommand,3,"",0,NULL,0,0,0,0,0}, {"info",sentinelInfoCommand,-1,"",0,NULL,0,0,0,0,0}, {"role",sentinelRoleCommand,1,"l",0,NULL,0,0,0,0,0}, {"client",clientCommand,-2,"rs",0,NULL,0,0,0,0,0}, {"shutdown",shutdownCommand,-1,"",0,NULL,0,0,0,0,0} };
2. 初始化Sentinel結構sentinelState
該sentinelState結構保存了服務器中所有和sentinel有關的狀態信息
struct sentinelState { char myid[CONFIG_RUN_ID_SIZE+1]; /* This sentinel ID. */ uint64_t current_epoch; /* Current epoch. */ dict *masters; /* Dictionary of master sentinelRedisInstances. Key is the instance name, value is the sentinelRedisInstance structure pointer. */ int tilt; /* Are we in TILT mode? */ int running_scripts; /* Number of scripts in execution right now. */ mstime_t tilt_start_time; /* When TITL started. */ mstime_t previous_time; /* Last time we ran the time handler. */ list *scripts_queue; /* Queue of user scripts to execute. */ char *announce_ip; /* IP addr that is gossiped to other sentinels if not NULL. */ int announce_port; /* Port that is gossiped to other sentinels if non zero. */ unsigned long simfailure_flags; /* Failures simulation. */ } sentinel;
其中masters屬性為一個字典結構,字典的鍵為被監控的master服務器的標識符,字典的值為一個sentinelRedisInstance結構的數據結構,根據節點類型不同,字典值的數據結構也不一樣。
typedef struct sentinelRedisInstance { int flags; /* See SRI_... defines */ char *name; /* Master name from the point of view of this sentinel. */ char *runid; /* Run ID of this instance, or unique ID if is a Sentinel.*/ uint64_t config_epoch; /* Configuration epoch. */ sentinelAddr *addr; /* Master host. */ instanceLink *link; /* Link to the instance, may be shared for Sentinels. */ mstime_t last_pub_time; /* Last time we sent hello via Pub/Sub. */ mstime_t last_hello_time; /* Only used if SRI_SENTINEL is set. Last time we received a hello from this Sentinel via Pub/Sub. */ mstime_t last_master_down_reply_time; /* Time of last reply to SENTINEL is-master-down command. */ mstime_t s_down_since_time; /* Subjectively down since time. */ mstime_t o_down_since_time; /* Objectively down since time. */ mstime_t down_after_period; /* Consider it down after that period. */ mstime_t info_refresh; /* Time at which we received INFO output from it. */ /* Role and the first time we observed it. * This is useful in order to delay replacing what the instance reports * with our own configuration. We need to always wait some time in order * to give a chance to the leader to report the new configuration before * we do silly things. */ int role_reported; mstime_t role_reported_time; mstime_t slave_conf_change_time; /* Last time slave master addr changed. */ /* Master specific. */ dict *sentinels; /* Other sentinels monitoring the same master. */ dict *slaves; /* Slaves for this master instance. */ unsigned int quorum;/* Number of sentinels that need to agree on failure. */ int parallel_syncs; /* How many slaves to reconfigure at same time. */ char *auth_pass; /* Password to use for AUTH against master & slaves. */ /* Slave specific. */ mstime_t master_link_down_time; /* Slave replication link down time. */ int slave_priority; /* Slave priority according to its INFO output. */ mstime_t slave_reconf_sent_time; /* Time at which we sent SLAVE OF <new> */ struct sentinelRedisInstance *master; /* Master instance if it's slave. */ char *slave_master_host; /* Master host as reported by INFO */ int slave_master_port; /* Master port as reported by INFO */ int slave_master_link_status; /* Master link status as reported by INFO */ unsigned long long slave_repl_offset; /* Slave replication offset. */ /* Failover */ char *leader; /* If this is a master instance, this is the runid of the Sentinel that should perform the failover. If this is a Sentinel, this is the runid of the Sentinel that this Sentinel voted as leader. */ uint64_t leader_epoch; /* Epoch of the 'leader' field. */ uint64_t failover_epoch; /* Epoch of the currently started failover. */ int failover_state; /* See SENTINEL_FAILOVER_STATE_* defines. */ mstime_t failover_state_change_time; mstime_t failover_start_time; /* Last failover attempt start time. */ mstime_t failover_timeout; /* Max time to refresh failover state. */ mstime_t failover_delay_logged; /* For what failover_start_time value we logged the failover delay. */ struct sentinelRedisInstance *promoted_slave; /* Promoted slave instance. */ /* Scripts executed to notify admin or reconfigure clients: when they * are set to NULL no script is executed. */ char *notification_script; char *client_reconfig_script; sds info; /* cached INFO output */ } sentinelRedisInstance;
其中結構sentinelRedisInstance的*add屬性指向的是一個sentinelAddr結構的指針
/* Address object, used to describe an ip:port pair. */ typedef struct sentinelAddr { char *ip; int port; } sentinelAddr;
比如,我們在Sentinel配置文件中定義如下參數
sentinel monitor mymaster 172.16.101.58 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000
那么Sentinel master字典初始化結構為
sentinelRedisInstance |
flags SRI_MASTER |
name mymaster |
runid 1462343b52cd8bb8e10f2786ee14438f35907b88 |
config_epoch |
add ---> sentinelAddr ip 172.16.101.58 port 6379 |
down_after_period 5000 |
failover_timeout 60000 |
........................... |
3.創建連向Master節點的網絡連接
Sentinel實例初始化完成之后會創建兩個連接master節點的網絡連接,一個為訂閱連接,一個為命令連接
訂閱連接:專門用於訂閱Master節點的__sentinel__:hello頻道。
命令連接:專門用戶處理與Master節點的命令發送與回復。
在master節點查看客戶端連接時候可以看到有兩個sentinel節點的的連接
127.0.0.1:6379> client list id=16 addr=172.16.101.58:61106 fd=10 name=sentinel-50523f14-cmd age=67041 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=17 addr=172.16.101.58:61108 fd=11 name=sentinel-50523f14-pubsub age=67041 idle=1 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe
二. 獲取Master節點和Slave節點信息
1.獲取master節點信息
Sentinel節點啟動之后,默認以間隔10s的頻率,向被監控的master節點發送info命令,來獲取master節點的當前運行信息,獲取的關鍵數據如下
run_id:1462343b52cd8bb8e10f2786ee14438f35907b88 role:master slave0:ip=172.16.101.59,port=6379,state=online,offset=14496948,lag=0 slave1:ip=172.16.101.60,port=6379,state=online,offset=14496934,lag=1
從以上信息也可以看到,Sentinel並不需要連接slave服務器,便可以獲取到slave節點的信息
Sentinel通過info命令獲取到master節點信息,然后根據master節點的run-id、role等信息,對實例結構中的master節點信息的run-id(master節點重啟后會重新生成)等進行更新。
2. 獲取Slave節點信息
Sentinel根據從master節點獲得的slave信息,為這個slave在內存中創建相應的slave實例結構,還會創建連接到slave節點的命令連接和訂閱連接,在命令連接創建之后,Sentinel默認以10s/次的間隔連接slave節點執行info命令,獲得slave節點如下關鍵信息,然后對Sentinel的slave實例結構進行運行數據更新。
run_id:64b742b55c58a99d2f4acab86dcadb9de5ee6a3b # Replication role:slave master_host:172.16.101.58 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:16146680 slave_priority:100 slave_read_only:1 connected_slaves:0 min_slaves_good_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
3. Sentinel向Master和Slave節點頻道__sentinel__:hello Pub和Sub消息,並實時更新自己實例結構
在默認情況下,Sentinel會以間隔1s/次的頻率,通過命令連接向被監視的master/slave節點的__sentinel__:hello頻道發送以下格式的消息
PUBLISH __sentinel__:hello "<sentinel_ip>, <sentinel_port>, <sentinel_run_id>, <sentinel_epoch>, <master_name>, <master_ip> <master_port>,<master_epoch>"
與此同時,sentinel也會向每個master/slave節點訂閱頻道__sentinel__:hello,這種訂閱會一直持續,訂閱頻道收到的消息如下所示:
1) "message" 2) "__sentinel__:hello" 3) "172.16.101.59,26379,7d120b6abd66f89f3ea7ed01e4d6371913831fda,85,mymaster,172.16.101.58,6379,85" 1) "message" 2) "__sentinel__:hello" 3) "172.16.101.58,26379,50523f147d20b661896d13a4d51637736c475ef1,85,mymaster,172.16.101.58,6379,85" 1) "message" 2) "__sentinel__:hello" 3) "172.16.101.58,26379,50523f147d20b661896d13a4d51637736c475ef1,85,mymaster,172.16.101.58,6379,85" 1) "message" 2) "__sentinel__:hello" 3) "172.16.101.59,26379,7d120b6abd66f89f3ea7ed01e4d6371913831fda,85,mymaster,172.16.101.58,6379,85" 1) "message" 2) "__sentinel__:hello" 3) "172.16.101.60,26379,bfecd21a116f8b8d79607d0d58acd3f2008196fd,85,mymaster,172.16.101.58,6379,85" 1) "message" 2) "__sentinel__:hello" 3) "172.16.101.60,26379,bfecd21a116f8b8d79607d0d58acd3f2008196fd,85,mymaster,172.16.101.58,6379,85"
如果Sentinel通過對比sentinel_run_id,發現該條消息的sentinel_run_id的自己的相同,說明該條消息為自己Pub的訂閱消息,並選擇忽略,否則就根據該消息的字段,去更新SentinelRedisInstance實例結構中的sentinels字典。
4.Sentinel根據實例結構sentinel字典屬性,去創建到其他sentinel節點的命令連接
當Sentinel通過頻道信息發現新的Sentinel節點更新到內存后,同時創建一個連向新Sentinel節點的命令連接,當一個發現周期結束后,每個監控master節點的Sentinel節點都會發現對方,最終形成了一個Sentinel相互連通的網絡環境。
三.主觀下線、客觀下線、選舉和故障轉移
1. 主觀下線(Subjectively Down)
在默認情況下,Sentinel以1s/次的頻率向所有連接的實例(master、slave、Sentinel節點)發送ping命令,如果在指定的時間內沒有返回有效回復,那么該Sentinel節點就認為目標節點主觀下線。
指定的有效時間由參數down-after-milliseconds“”控制,默認為30s,即30s內目標節點沒有返回有效的ping回復,那么Sentinel節點就認為目標節點主觀下線,所謂主觀下線,就是當前的Sentinel節點認為,並不代表其他節點的也認為,因為這也有可能是當前的Sentinel節點到目標節點的網絡延遲抖動等,對其他Sentinel並沒有影響。
所謂的有效回復指以下三種其一:
- PING replied with +PONG.
- PING replied with -LOADING error.
- PING replied with -MASTERDOWN error.
當接收到目標節點返回的除以上類型外其他的返回值時,該Sentinel節點就認為目標節點主觀下線,隨后向Sentinel日志記錄以下log
16889:X 04 Apr 22:48:57.193 # +sdown master mymaster 172.16.101.58 6379
2.客觀下線(Subjectively Down)
當主觀下線發生后,Sentinel節點就將sentinelRedisInstance實例結構中的flag屬性值修改為SRI_S_DOWN,同時會向其他Sentinel節點發送“sentinel is-master-down-by-addr <master_ip> <master_port> <current_epoch> <run-id>”命令來詢問目標節點是否進入下線狀態,
如在當前A節點認為目標節點主觀下線后,會發送如下命令詢問其他sentinel節點目標節點是否已經下線
sentinel is-master-down-by-addr 172.16.101.60 6379 85 *
如果run-id為*,代表該命令只是為了向其他節點詢問目標節點是否已經下線。
當其他B、C等sentinel節點接收到上述消息后,會提取master信息並檢查目標節點是否已下線,如果下線。則會向A節點回復包含3個參數的命令回復。
1) 1 #down_state,0為未下線,1為已下線 2) * #leader_runid,*為僅僅用於檢測是否客觀下線 3) 0 #leader_epoch,用於檢測客觀下線時,該值永遠為0
A節點接收到命令回復后,統計B、C節點中認為目標節點客觀下線的數量,如果數量超過配置文件中指定的判斷客觀下線時指定的最小所需數量時,Sentinel節點就將sentinelRedisInstance實例結構中的flag屬性值修改為SRI_O_DOWN。同時向Sentinel日志文件中記錄一下log信息。
5494:X 04 Apr 22:48:57.305 # +odown master mymaster 172.16.101.58 6379 #quorum 3/2
判斷客觀下線的最小所需數量為Sentinel配置參數中的quorum指定。
sentinel monitor mymaster master_ip master_port quorum
3.選舉出Sentinel領導者
客觀下線發生后,各個Sentinel節點開始向其他所有Sentinel節點發送“sentinel is-master-down-by-addr <master_ip> <master_port> <current_epoch> <run-id>”命令。
sentinel is-master-down-by-addr 172.16.101.60 6379 86 50523f147d20b661896d13a4d51637736c475ef1
如果Sentinel的節點數為3個,分別是A、B、C
此時A發送選舉的run-id為發送該命令的A的run-id,Sentinel遵從先到先得的原則,如果Sentinel A是第一個發送給Sentinel B的,那么Sentinel B就認為A是Sentinel的領導者,節點C發送過來的選舉請求命令會被Sentinel B節點拒絕,並且將B認為的Sentinel領導者A的run-id返回給C,C也認為A是Sentinel的領導者,此時3節點中認為A是領導者的數量為n/2+1等於2,超過sentinel節點半數,那么A就成為Sentinel節點中的領導者
A節點的投票選舉,A投給了run-id為7d120b6abd66f89f3ea7ed01e4d6371913831fda的節點
16889:X 04 Apr 22:48:57.418 # +vote-for-leader 7d120b6abd66f89f3ea7ed01e4d6371913831fda 86
B節點的投票選舉,B投給了run-id為7d120b6abd66f89f3ea7ed01e4d6371913831fda的節點
5494:X 04 Apr 22:48:57.327 # +vote-for-leader 7d120b6abd66f89f3ea7ed01e4d6371913831fda 86
C節點的投票選舉,C投給了run-id為bfecd21a116f8b8d79607d0d58acd3f2008196fd的節點
16523:X 04 Apr 22:48:57.359 # +vote-for-leader bfecd21a116f8b8d79607d0d58acd3f2008196fd 86
查看三個節點對應的run-id信息
sentinel known-sentinel mymaster 172.16.101.58 26379 50523f147d20b661896d13a4d51637736c475ef1 sentinel known-sentinel mymaster 172.16.101.59 26379 7d120b6abd66f89f3ea7ed01e4d6371913831fda sentinel known-sentinel mymaster 172.16.101.60 26379 bfecd21a116f8b8d79607d0d58acd3f2008196fd
說明run-id為7d120b6abd66f89f3ea7ed01e4d6371913831fda的Sentinel節點172.16.101.59贏得了3個節點中的2票,成為Sentinel中的領導者.
5494:X 04 Apr 22:48:57.450 # +elected-leader master mymaster 172.16.101.58 6379
4. 故障轉移
當選舉出Sentinel中的領導者后,Sentinel領導者開始執行故障轉移
5494:X 04 Apr 22:48:57.450 # +failover-state-select-slave master mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:57.541 # +selected-slave slave 172.16.101.60:6379 172.16.101.60 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:57.541 * +failover-state-send-slaveof-noone slave 172.16.101.60:6379 172.16.101.60 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:57.631 * +failover-state-wait-promotion slave 172.16.101.60:6379 172.16.101.60 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:58.415 # +promoted-slave slave 172.16.101.60:6379 172.16.101.60 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:58.420 # +failover-state-reconf-slaves master mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:58.465 * +slave-reconf-sent slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:59.461 * +slave-reconf-inprog slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:59.461 * +slave-reconf-done slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:59.517 # +failover-end master mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:59.517 # +switch-master mymaster 172.16.101.58 6379 172.16.101.60 6379 5494:X 04 Apr 22:48:59.517 * +slave slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.60 6379 5494:X 04 Apr 22:48:59.517 * +slave slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379 5494:X 04 Apr 22:49:04.562 # +sdown slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379
1.Sentinel領導者首先選擇一個slave節點,將其轉換為master節點
5494:X 04 Apr 22:48:57.541 # +selected-slave slave 172.16.101.60:6379 172.16.101.60 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:57.541 * +failover-state-send-slaveof-noone slave 172.16.101.60:6379 172.16.101.60 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:57.631 * +failover-state-wait-promotion slave 172.16.101.60:6379 172.16.101.60 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:58.415 # +promoted-slave slave 172.16.101.60:6379 172.16.101.60 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:58.420 # +failover-state-reconf-slaves master mymaster 172.16.101.58 6379
2. Sentinel領導者將原所有slave節點改為復制新的master
5494:X 04 Apr 22:48:58.465 * +slave-reconf-sent slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:59.461 * +slave-reconf-inprog slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:59.461 * +slave-reconf-done slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:59.517 # +failover-end master mymaster 172.16.101.58 6379 5494:X 04 Apr 22:48:59.517 # +switch-master mymaster 172.16.101.58 6379 172.16.101.60 6379 5494:X 04 Apr 22:48:59.517 * +slave slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.60 6379
3. Sentinel領導者將原master節點改為新master的slave,因為原master已經下線,所以新master會將原master標記為客觀下線狀態
5494:X 04 Apr 22:48:59.517 * +slave slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379 5494:X 04 Apr 22:49:04.562 # +sdown slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379
4. Sentinel領導者繼續監控原master節點,等到原master重新上線后,將它變為新master的slave節點
16523:X 04 Apr 23:23:59.346 # -sdown slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379 16523:X 04 Apr 23:24:09.322 * +convert-to-slave slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379
以上就是關於哨兵Sentinel的簡單介紹。