關於Redis高可用方案,看到較多的是keepalived、zookeeper方案。keepalived是主備模式,意味着總有一臺浪費着。zookeeper工做量成本偏高。html
本文主要介紹下使用官方sentinel作redis高可用方案的設計。node
Sentinel是Redis官方爲集羣提供的高可用解決方案。在實際項目中可使用sentinel去作redis自動故障轉移,減小人工介入的工做量。另外sentinel也給客戶端提供了監控消息的通知,這樣客戶端就可根據消息類型去判斷服務器的狀態,去作對應的適配操做。git
下面是Sentinel主要功能列表:github
Sentinel本質上只是一個運行在特殊模式下的redis服務器,經過不一樣配置來區分提供服務。sentinel.conf配置:redis
// [監控名稱] [ip] [port] [多少sentinel贊成才發生故障轉移] sentinel monitor mymaster 127.0.0.1 6379 2 // [監控名稱] [Master多少毫秒後不迴應ping命令,就認爲master是主觀下線狀態] sentinel down-after-milliseconds mymaster 60000 // [故障轉移超時時間] sentinel failover-timeout mymaster 180000 //[在執行故障轉移時,最多能夠有多少個從服務器同時對新的主服務器進行同步] sentinel parallel-syncs mymaster 1
sentinel須要使用redis2.8版本以上,啓動以下:算法
redis-sentinel sentinel.conf
啓動後Sentinel會:數據庫
Redis服務器一旦發送故障後,sentinel經過raft算法投票選舉新master。故障轉移過程能夠經過sentinel的API獲取/訂閱接收事件消息。api
腳本接收服務器
sentinel notification-script mymaster /var/redis/notify.sh
sentinel client-reconfig-script mymaster /var/redis/notifyReconfig.sh
Sentinel的故障轉移消息通知使用的是redis發佈訂閱。就是說在故障轉移期間全部產生的事件信息,都經過頻道(channel)發佈出去。好比咱們加臺slave服務器,sentinel監聽到後會發佈加slave的消息到"+slave"頻道上,客戶端只須要訂閱"+slave"頻道便可接收到對應消息。架構
其消息格式以下:
[實例類型] [事件服務器名稱] [服務器ip] [服務器端口] @[master名稱] [ip] [端口] <instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>
通知消息格式示例:
* //訂閱類型, *即訂閱全部事件消息。 -sdown //消息類型 slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
訂閱消息示例:
using (RedisSentinel rs = new RedisSentinel(CurrentNode.Host, CurrentNode.Port)) { var redisPubSub = new RedisPubSub(node.Host, node.Port); redisPubSub.OnMessage += OnMessage; redisPubSub.OnSuccess += (msg) =>{}; redisPubSub.OnUnSubscribe += (obj) =>{}; redisPubSub.OnError = (exception) =>{ }; redisPubSub.PSubscribe("*"); }
這種方式在第二種基礎上擴展了一層,即應用端不直接訂閱sentinel。單獨作服務去幹這件事情,而後應用端提供API供這個服務回調通知。這樣作的好處在於:
好比:
示例:
應用端提供回調API,在這個API邏輯下去刷新內存中的Redis鏈接。
http://127.0.0.1/redis/notify.api
獨立服務監控到情況後,調用API通知應用端:
httprequest.post("http://127.0.0/redis/notify.api");
推薦使用第三種,其總體流程圖以下:
各類sentinel通知消息類型見官方文檔,項目中使用的redis客戶端在github上
https://github.com/mushroomsi...
本文分享了樓主在項目中作Redis高可用的經驗,但願對你們有所幫助。在人力物力知足的狀況下仍是推薦使用zookeeper方案的。只有三五杆槍的狀況下也就退而求其次,利用最小成本知足需求並保留可擴展性。
相信沒有最好的架構,只有更合適的架構。http://redis.io/topics/sentinel
做者:蘑菇先生
來源:https://www.cnblogs.com/mushr...