1. 程式人生 > 其它 >Redis6.x高可用之Cluster叢集和分片

Redis6.x高可用之Cluster叢集和分片

目錄

1.Cluster叢集介紹

  • 背景

    • Sentinel解決了主從架構故障自動遷移的問題
    • 但是Master主節點的寫能力和儲存能力依舊受限
    • 使用redis的叢集cluster就是為了解決單機redis容量有限的問題,將資料按一定的規則分配到多臺機器
  • 什麼是叢集Cluster

    • 是一組相互獨立的、通過高速網路互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理
    • 容易和分散式弄混,分散式系統簡單的可以認為是一個龐大的系統,進行拆分多個小系統
  • redis叢集模式介紹

    • Cluster模式是redis3.0開始推出
    • 採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線
    • 官方要求:至少6個節點才可以保證高可用,即3主3從;擴充套件性強、更好做到高可用
    • 各個節點會互相通訊,採用gossip協議交換節點元資料資訊
    • 資料分散儲存到各個節點上

2.Cluster資料分片和虛擬雜湊槽介紹

  • 背景

    • 主節點的寫能力和儲存能力受限
    • 單臺機器無法滿足需求,因此把資料分散儲存到多個機器
    • 類似案例:mysql分庫分表
  • 常見的資料分割槽演算法

    • 雜湊取模:對選擇的partitioning key計算其雜湊值,得到的雜湊值就是對應的分割槽
    • 範圍分片:通過確定分割槽鍵是否在某個範圍內來選擇分割槽
    • 一致性Hash分割槽
    • redis cluster叢集沒有采用一致性雜湊方案,而是採用【資料分片】中的雜湊槽來進行資料儲存與讀取的
  • 什麼是redis的雜湊槽slot

    • redis叢集預分好16384個槽,當需要在redis叢集中放置一個key-value時,根據CRC16(key) mod 16384的值,決定將一個key放到哪個桶中
  • 大體流程

    • 假設主節點的數量為3,將16384個槽位按照【使用者自己的規則】去分配這3個節點,每個節點複製一部分槽位

      • 節點1的槽位區間範圍為0-5460
      • 節點2的槽位區間範圍為5461-10922
      • 節點3的槽位區間範圍為10923-16383
      • 注意:從節點是沒有槽位的,只有主節點才有
    • 儲存查詢

      • 對要儲存查詢的鍵進行CRC16雜湊運算,得到一個值,並取模16384,判斷這個值在哪個節點的範圍區間
      • 假設CRC16("test_key")%16384=3000,就是節點一
      • CRC16演算法不是簡單的hash演算法,是一種校驗演算法
  • 使用雜湊槽的好處就在於可以方便的新增或移除節點

    • 當需要增加節點時,只需要把其他節點的某些雜湊槽挪到新節點就可以了
    • 當需要移除節點時,只需要把移除節點上的雜湊槽挪到其他節點就行了

3.Cluster叢集環境搭建

  • 說明

    • 舊版本的需要使用ruby語言進行構建,新版5之後直接用redis-cli即可
    • 6個節點,三主三從,主從節點會自動分配,不是人工指定
    • 主節點故障後從節點會替換主節點
  • 注意點:把之前的RDB、AOF檔案刪除

  • 配置

    bind 0.0.0.0
    port 6381
    daemonize yes
    requirepass "123456"
    logfile "/usr/local/redis/temp/redis6381.log"
    dbfilename "redis6381.rdb"
    dir "/usr/local/redis/temp"
    appendonly yes
    appendfilename "appendonly6381.aof"
    masterauth "123456"
    
    # 是否開啟叢集
    cluster-enabled yes
    # 生成的node檔案,記錄叢集節點資訊,預設為nodes.conf
    cluster-config-file nodes-6381.conf
    # 節點連線超時時間
    cluster-node-timeout 20000
    # 叢集節點的ip,當前節點的ip
    cluster-announce-ip 123.57.94.239
    # 叢集節點對映埠
    cluster-announce-port 6381
    # 叢集節點匯流排埠,節點之間互相通訊,常規埠+1萬
    cluster-announce-bus-port 16381
    
  • 啟動6個節點

    ./bin/redis-server ./temp/redis6381.conf 
    ./bin/redis-server ./temp/redis6382.conf 
    ./bin/redis-server ./temp/redis6383.conf 
    ./bin/redis-server ./temp/redis6384.conf 
    ./bin/redis-server ./temp/redis6385.conf 
    ./bin/redis-server ./temp/redis6386.conf 
    
  • 加入叢集(其中一個節點執行即可)

    • --cluster:構建叢集全部節點資訊
    • --cluster-replicas 1:主從節點的比例,1表示一主一從的方式
    ./bin/redis-cli -a 123456 --cluster create 123.57.94.239:6381 123.57.94.239:6382 123.57.94.239:6383 123.57.94.239:6384 123.57.94.239:6385 123.57.94.239:6386 --cluster-replicas 1
    
  • 檢查狀態資訊(其中一個節點執行即可)

    ./bin/redis-cli -a 123456 --cluster check 123.57.94.239:6381
    

4.Cluster叢集讀寫命令

  • 叢集狀態

    ./bin/redis-cli -c -a 123456 -p 6381
    # 叢集資訊
    cluster info
    # 節點資訊
    cluster nodes
    
  • 測試叢集讀寫命令set/get

    • key雜湊運算計算槽位置
    • 槽在當前節點的話直接插入/讀取,否則自動轉向到對應的節點
  • 操作都是主節點操作,從節點只是備份

  • 流程解析

    • 啟動應用
    • 加入叢集
    • 從節點請求複製主節點(主從複製)
      • 先全量
      • 再增量

5.Cluster叢集整合SpringBoot

  • 配置檔案

    spring:
      redis:
        cluster:
          # 最大轉發次數
          max-redirects: 3
          nodes: 123.57.94.239:6381,123.57.94.239:6382,123.57.94.239:6383,123.57.94.239:6384,123.57.94.239:6385,123.57.94.239:6386
        cache:
        # 指定快取型別
        type: redis
        password: 123456
    
  • 高可用架構總結

    • 主從模式:讀寫分離、備份,一個master可以有多個slaves
    • 哨兵sentinel:監控,自動轉移,哨兵發現主伺服器掛了後,就會從slave中重新選舉一個主伺服器
    • 叢集:為了解決單機redis容量有限的問題,將資料按一定的規則分配到多臺機器,記憶體/QPS不受限於單機,提高併發量