日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis系列(四)-低成本高可用方案设计

發布時間:2025/3/20 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis系列(四)-低成本高可用方案设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于Redis高可用方案,看到較多的是keepalived、zookeeper方案。 keepalived是主備模式,意味著總有一臺浪費著。zookeeper工作量成本偏高。 本文主要介紹下使用官方sentinel做redis高可用方案的設計。

閱讀目錄:

  • Redis Sentinel
  • 故障轉移消息接收的3種方式
  • 整體流程圖
  • 總結
  • Redis Sentinel

    Sentinel介紹

    Sentinel是Redis官方為集群提供的高可用解決方案。 在實際項目中可以使用sentinel去做redis自動故障轉移,減少人工介入的工作量。另外sentinel也給客戶端提供了監控消息的通知,這樣客戶端就可根據消息類型去判斷服務器的狀態,去做對應的適配操作。

    下面是Sentinel主要功能列表:

    • Monitoring:Sentinel持續檢查集群中的master、slave狀態,判斷是否存活。
    • Notification:在發現某個redis實例死的情況下,Sentinel能通過API通知系統管理員或其他程序腳本。
    • Automatic failover:如果一個master掛掉后,sentinel立馬啟動故障轉移,把某個slave提升為master。其他的slave重新配置指向新master。
    • Configuration provider:對于客戶端來說sentinel通知是有效可信賴的。客戶端會連接sentinel去請求當前master的地址,一旦發生故障sentinel會提供新地址給客戶端。

    Sentinel配置

    Sentinel本質上只是一個運行在特殊模式下的redis服務器,通過不同配置來區分提供服務。 sentinel.conf配置:

    // [監控名稱] [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會:

    • 以10秒一次的頻率,向被監視的master發送info命令,根據回復獲取master當前信息。
    • 以1秒一次的頻率,向所有redis服務器、包含sentinel在內發送PING命令,通過回復判斷服務器是否在線。
    • 以2秒一次的頻率,通過向所有被監視的master,slave服務器發送包含當前sentinel,master信息的消息。

    另外建議sentinel至少起3個實例以上,并配置2個實例同意即可發生轉移。 5個實例,配置3個實例同意以此類推。

    故障轉移消息接收的3種方式

    Redis服務器一旦發送故障后,sentinel通過raft算法投票選舉新master。 故障轉移過程可以通過sentinel的API獲取/訂閱接收事件消息。

    腳本接收

    //當故障轉移期間,可以指定一個“通知”腳本用來告知系統管理員,當前集群的情況。
    //腳本被允許執行的最大時間為60秒,如果超時,腳本將會被終止(KILL)

    sentinel notification-script mymaster /var/redis/notify.sh

    //故障轉移期之后,配置通知客戶端的腳本.

    sentinel client-reconfig-script mymaster /var/redis/notifyReconfig.sh

    客戶端直接接收

    Sentinel的故障轉移消息通知使用的是redis發布訂閱(詳解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供這個服務回調通知。 這樣做的好處在于:

    • 減少應用端監聽失敗出錯的可能性。
    • 應用端由主動方變成被動方,降低耦合。
    • 性能提高,輪詢變回調。
    • 獨立成服務可擴展性更高。

    比如:

    1:以后換掉sentinel,我們只需要動服務即可,應用端無需更改。

    2:可以在服務內多增加一層守護線程去主動拉取redis狀態,這樣可確保即使sentinel不生效,也能及時察覺redis狀態,并通知到應用端。 當然這種情況很極端,因為sentinel配的也是多節點,同時掛的幾率非常小。
    示例:
    應用端提供回調API,在這個API邏輯下去刷新內存中的Redis連接。

    http://127.0.0.1/redis/notify.api

    獨立服務監控到狀況后,調用API通知應用端:

    httprequest.post("http://127.0.0/redis/notify.api");

    整體設計

    推薦使用第三種,其整體流程圖如下:

    總結

    各種sentinel通知消息類型見官方文檔,項目中使用的redis客戶端在github上[HRedis]。本文分享了樓主在項目中做Redis高可用的經驗,希望對大家有所幫助。 在人力物力滿足的情況下還是推薦使用zookeeper方案的。 只有三五桿槍的情況下也就退而求其次,利用最小成本滿足需求并保留可擴展性。 ?

    相信沒有最好的架構,只有更合適的架構。

    [1] Redis Sentinel Documentation

    總結

    以上是生活随笔為你收集整理的Redis系列(四)-低成本高可用方案设计的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。