首頁 >資料庫 >Redis >Redis哨兵模式高可用的範例分析

Redis哨兵模式高可用的範例分析

WBOY
WBOY轉載
2023-06-02 22:38:04911瀏覽

    一、序言

    Redis高可用有兩種模式:哨兵模式叢集模式,本文以哨兵模式建構一主兩從三哨兵Redis高可用服務。

    1、目標與收穫

    一主兩從三哨兵Redis服務,基本上能夠滿足中小型專案的高可用要求,使用Supervisor監控並管理Redis實例。透過本文將完成以下目標:

    • 哨兵模式服務規劃與建置

    哨兵模式服務相比於單機版服務更可靠,適合讀寫分離、資料量不是很大、要求可靠穩定性的場景。

    • 客戶端整合與讀寫分離

    #透過Spring框架對哨兵模式進行連接,完成生產環境的常見操作。

    2、連接埠規劃

    連接埠規劃是完成本方案的第一步。

    Redis哨兵模式高可用的範例分析

    二、單機模擬

    單機模擬是在一台實體機或虛擬機器上模擬操作,以盡可能還原本方案中間過程,通常用於學習或開發階段。

    為了簡化操作,Redis服務做如下約定:資料不持久化到磁碟;服務實例以前台進程方式運作;節點的設定檔以預設設定檔為模版;無密碼驗證。

    (一)服務規劃

    1、Redis實例

    服務在第一次啟動時明確知道第幾個節點是master節點,當服務在長期運行並發生主從切換時,無法顯示知道第幾個節點是master節點,需要透過命令列間接查詢。

    節點 主機 連接埠 角色 額外配置
    #node01 127.0.0.1 #6380 第一次啟動時作為master服務  
    node02 127.0.0.1 6381 第一次啟動時作為slave服務 replicaof 127.0.0.1 6380
    node03 127.0.0.1 6382 第一次啟動時作為slave服務 #replicaof 127.0. 0.1 6380

    額外設定指第一次啟動Redis服務實例時,節點設定檔中新增設定。

    2、哨兵服務

    哨兵服務節點之間沒有主從的區別,所有節點處於平等地位。當主服務出現異常時,哨兵服務會觸發投票策略,從Redis實例的從節點中選擇候選人作為新的主服務。

    節點 主機 連接埠 額外設定
    node01 127.0.0.1 26380 sentinel monitor mymaster 127.0.0.1 6380 2
    node02 127.0.0.1 26381 sentinel monitor mymaster 127.0.0.1 6380 2
    node03 127.0.0.1 26382 sentinel monitor mymaster 127.0.0.1 6380 2

    (二)服務配置

    1、Redis實例

    節點的初始設定檔以預設設定檔為模版。

    node01、node02初始化設定檔之後,顯示指明節點間的主從關係,增加以下設定:

    replicaof 127.0.0.1 6380
    2、哨兵服務

    節點的初始設定檔以預設設定檔為模版。

    node01、node02、node03初始化設定檔後,增加以下設定:

    sentinel monitor mymaster 127.0.0.1 6381 2

    (三)服務管理

    測試或學習時,建議採用前台行程管理服務,方便模擬單點故障、查看日誌觀察主從切換。

    生產條件下建議使用Supervisor管理服務,不僅易於管理而且能夠實現服務異常終止後自動重新啟動。高可用場景下使用的是三台實體機。

    1、Redis實例
    /usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis80.conf --port 6380 --save '' --daemonize no 
    /usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis81.conf --port 6381 --save '' --daemonize no
    /usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis82.conf --port 6382 --save '' --daemonize no
    2、哨兵服務
    /usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel280.conf --port 26380 --daemonize no
    /usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel281.conf --port 26381 --daemonize no
    /usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel282.conf --port 26382 --daemonize no

    三、客戶端整合

    客戶端實作是指基於SpringBoot的整合分為兩步驟實現:一是完成作為基礎的整合;二是結合生產需要補充新特性。

    (一)基礎整合

    基礎整合的內容是以Java客戶端連線高可用哨兵模式Redis服務,實作單節點故障服務正常運作的需求。

    1、全域設定檔

    全域設定檔新增的設定資訊有:master參數為哨兵服務名,此處為預設值;nodes參數為哨兵服務清單(不是Redis實例服務清單);database參數為資料庫。

    spring:
      redis:
        database: 0
        sentinel:
          nodes: 192.168.181.171:26380,192.168.181.171:26381,192.168.181.171:26382
          master: mymaster
    2、整合配置

    整合進SpringBoot體系,最核心的是創建LettuceConnectionFactory連接工廠,透過Redis連接工廠,能夠順利繼承進Spring體系下其他框架。

    @Configuration
    public class RedisSentinelConfig {
        @Autowired
        private RedisProperties redisProperties;
        
        @Bean
        public RedisConnectionFactory lettuceConnectionFactory() {
            RedisProperties.Sentinel sentinel = redisProperties.getSentinel();
            HashSet<String> nodes = new HashSet<>(sentinel.getNodes());
            String master = sentinel.getMaster();
            RedisSentinelConfiguration config = new RedisSentinelConfiguration(master, nodes);
            config.setDatabase(redisProperties.getDatabase());
            return new LettuceConnectionFactory(config);
        }
    }

    (二)讀寫分離

    基礎整合只是實現了高可用Redis服務的流程,生產環境下仍需要增加其他配置:修改自訂連接資料庫序號;授權連接;連接池配置;讀寫分離。

    在高可用前提下,衍生出讀寫分離的特性,主庫完成寫入請求;從庫完成讀取請求(從庫不允許寫)。

    @Bean
    public LettuceClientConfigurationBuilderCustomizer lettuceClientCustomizer() {
        // 配置读写分离
        return builder -> builder.readFrom(ReadFrom.REPLICA);
    }

    以上是Redis哨兵模式高可用的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除