首頁 > 軟體

淺談Redis哨兵模式高可用解決方案

2022-03-01 13:04:58

一、序言

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

1、目標與收穫

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

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

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

  • 使用者端整合與讀寫分離

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

2、埠規劃

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

二、單機模擬

單機模擬是指在單臺物理機或者虛擬機器器上模擬操作,最大化還原本方案中間過程,適用於學習或者開發階段使用。

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

(一)服務規劃

1、Redis範例

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

節點主機角色額外設定
node01127.0.0.16380第一次啟動時作為master服務 
node02127.0.0.16381第一次啟動時作為slave服務replicaof 127.0.0.1 6380
node03127.0.0.16382第一次啟動時作為slave服務replicaof 127.0.0.1 6380

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

2、哨兵服務

哨兵服務節點之間沒有主從的區別,所有節點處於平等地位。當主服務異常時,哨兵服務之間會喚醒投票策略,從Redis範例從節點選擇主服務的候選人。

節點主機額外設定
node01127.0.0.126380sentinel monitor mymaster 127.0.0.1 6380 2
node02127.0.0.126381sentinel monitor mymaster 127.0.0.1 6380 2
node03127.0.0.126382sentinel 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哨兵模式高可用解決方案的文章就介紹到這了,更多相關Redis哨兵模式高可用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com