<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Redis 低成本、高可用設(shè)計,牛逼!

          共 3860字,需瀏覽 8分鐘

           ·

          2021-03-05 14:44

          點擊關(guān)注公眾號,Java干貨及時送達(dá)

          作者:蘑菇先生
          出處:http://mushroom.cnblogs.com/

          關(guān)于Redis高可用方案,看到較多的是keepalived、zookeeper方案。

          keepalived是主備模式,意味著總有一臺浪費著。

          zookeeper工作量成本偏高。

          本文主要介紹下使用官方sentinel做redis高可用方案的設(shè)計。

          Redis Sentinel

          Sentinel介紹

          Sentinel是Redis官方為集群提供的高可用解決方案。在實際項目中可以使用sentinel去做redis自動故障轉(zhuǎn)移,減少人工介入的工作量。

          另外sentinel也給客戶端提供了監(jiān)控消息的通知,這樣客戶端就可根據(jù)消息類型去判斷服務(wù)器的狀態(tài),去做對應(yīng)的適配操作。

          下面是Sentinel主要功能列表:

          Sentinel配置

          Sentinel本質(zhì)上只是一個運行在特殊模式下的redis服務(wù)器,通過不同配置來區(qū)分提供服務(wù)。

          推薦閱讀:阿里開源的限流神器 Sentinel

          sentinel.conf配置:

          // [監(jiān)控名稱] [ip] [port] [多少sentinel同意才發(fā)生故障轉(zhuǎn)移]
          sentinel monitor mymaster 127.0.0.1 6379 2
          // [監(jiān)控名稱] [Master多少毫秒后不回應(yīng)ping命令,就認(rèn)為master是主觀下線狀態(tài)]
          sentinel down-after-milliseconds mymaster 60000
          // [故障轉(zhuǎn)移超時時間]
          sentinel failover-timeout mymaster 180000
          //[在執(zhí)行故障轉(zhuǎn)移時,最多可以有多少個從服務(wù)器同時對新的主服務(wù)器進行同步]
          sentinel parallel-syncs mymaster 1

          sentinel需要使用redis2.8版本以上,啟動如下:

          redis-sentinel sentinel.conf

          啟動后Sentinel會:

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

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

          故障轉(zhuǎn)移消息接收的3種方式

          Redis服務(wù)器一旦發(fā)送故障后,sentinel通過raft算法投票選舉新master。故障轉(zhuǎn)移過程可以通過sentinel的API獲取/訂閱接收事件消息。Redis 系列面試題和答案我都整理完了,關(guān)注公眾號Java技術(shù)棧回復(fù):面試,可以免費獲取哦。

          腳本接收

          //當(dāng)故障轉(zhuǎn)移期間,可以指定一個“通知”腳本用來告知系統(tǒng)管理員,當(dāng)前集群的情況。

          //腳本被允許執(zhí)行的最大時間為60秒,如果超時,腳本將會被終止(KILL)

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

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

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

          客戶端直接接收

          Sentinel的故障轉(zhuǎn)移消息通知使用的是redis發(fā)布訂閱,就是說在故障轉(zhuǎn)移期間所有產(chǎn)生的事件信息,都通過頻道(channel)發(fā)布出去。

          比如我們加臺slave服務(wù)器,sentinel監(jiān)聽到后會發(fā)布加slave的消息到"+slave"頻道上,客戶端只需要訂閱"+slave"頻道即可接收到對應(yīng)消息。

          其消息格式如下:[實例類型] [事件服務(wù)器名稱] [服務(wù)器ip] [服務(wù)器端口] @[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("*");
          }

          服務(wù)間接接收

          這種方式在第二種基礎(chǔ)上擴展了一層,即應(yīng)用端不直接訂閱sentinel。單獨做服務(wù)去干這件事情,然后應(yīng)用端提供API供這個服務(wù)回調(diào)通知。

          這樣做的好處在于:

          • 減少應(yīng)用端監(jiān)聽失敗出錯的可能性。
          • 應(yīng)用端由主動方變成被動方,降低耦合。
          • 性能提高,輪詢變回調(diào)。
          • 獨立成服務(wù)可擴展性更高。

          比如:

          1:以后換掉sentinel,我們只需要動服務(wù)即可,應(yīng)用端無需更改。

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

          http://127.0.0.1/redis/notify.api

          獨立服務(wù)監(jiān)控到狀況后,調(diào)用API通知應(yīng)用端:

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

          整體設(shè)計

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

          總結(jié)

          各種sentinel通知消息類型見官方文檔,項目中使用的redis客戶端在github上。本文分享了樓主在項目中做Redis高可用的經(jīng)驗,希望對大家有所幫助。

          在人力物力滿足的情況下還是推薦使用zookeeper方案的。只有三五桿槍的情況下也就退而求其次,利用最小成本滿足需求并保留可擴展性。

          相信沒有最好的架構(gòu),只有更合適的架構(gòu)。

          參考:http://redis.io/topics/sentinel






          關(guān)注Java技術(shù)棧看更多干貨



          戳原文,獲取精選面試題!
          瀏覽 53
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产毛片AV | 色鬼综合网 | 无码无卡 | www.国产高清 | 国产色婷婷在线 |