標籤:

Redis Sentinel手動failover失效問題分析

今天對Redis Sentinel環境進行手動failover測試的時候發現不work:

127.0.0.1:26379> sentinel failover mymaster(error) NOGOODSLAVE No suitable slave to promote

錯誤信息很清晰,沒有合適的slave。分別進入master和slave的cli用info命令查看,狀態一切正常,查看log主從同步也正常,說明slave是活的。

# Replicationrole:slavemaster_host:127.0.0.1master_port:6379

簡單嘗試了幾次後依然未果。百思不得騎姐。遂棄之。晚上回來自己搭建了一個簡單的sentinel環境(master:6379,slave:6380,sentinel:26379/26380/26381),重現了此問題,具體步驟如下:

  1. 5台實例全部啟動成功後,shutdown掉master,查看sentinel log發現auto failover成功了,master被主觀下線,slave選舉成為master;
  2. 重新啟動6379,成功被加入成為slave;
  3. 再次下線6379,手動failover,報錯;
  4. 6380重新slaveof 6379,此時2太實例的info都顯示是slave;而sentinel任然認為6380是master,出現了短暫的不同步問題。

解決的方法也很簡單,通過slaveof no one重新設置master,保持和最初一致。sentinel在timeout後進行下一次failover check時會自動刷新這個狀態:

2980:X 03 Apr 22:29:41.905 # Next failover delay: I will not start a failover before Tue Apr 3 22:35:42 20182980:X 03 Apr 22:29:43.012 # +config-update-from sentinel 9a7ba4d0c8bd2e0df952ebd8331b5bc2af339c63 127.0.0.1 26381 @ mymaster 127.0.0.1 63802980:X 03 Apr 22:29:43.013 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 63792980:X 03 Apr 22:29:43.013 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379

問題解決。之前懷疑的config等問題都是瞎猜,了解清楚工作原理才能發現問題的本質。

推薦閱讀:

Redis存儲文章點擊量,string類型和hash類型用哪種比較好?
如何讓網站不下線而從 Redis 2 遷移到 Redis 3
圖解Redis之對象篇
redis相對於mysql有什麼劣勢,是不是能用redis盡量用?

TAG:Redis |