redis主從備份

longsihua2003發表於2024-09-09

redis主從備份

主從複製介紹

redis主從複製原理:

  1. 從伺服器向主伺服器傳送 SYNC 命令。
  2. 接到 SYNC 命令的主伺服器會呼叫BGSAVE 命令,建立一個 RDB 檔案,並使用緩衝區記錄接下來執行的所有寫命令。
  3. 當主伺服器執行完 BGSAVE 命令時,它會向從伺服器傳送 RDB 檔案,而從伺服器則會接收並載入這個檔案。
  4. 主伺服器將緩衝區儲存的所有寫命令傳送給從伺服器執行。

img

主從複製手動執行

一般情況,我們有兩種方式執行主從複製:

  1. 透過寫入配置檔案透過配置檔案啟動的方式
    img
  2. 透過執行salveof host port的方式進行啟動(在互動式redis客戶端當中)
    img
    # 我們設定完成主從同步之後,可以透過命令來看庫的主從情況
    redis-cli -p 6380 info replication
    # 主庫6380輸出如下
    root@long:/opt/test_redis# redis-cli -p 6380 info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=127.0.0.1,port=6381,state=online,offset=70,lag=0
    slave1:ip=127.0.0.1,port=6382,state=online,offset=70,lag=1
    master_replid:a9346280d6d445a1cde9f7a2cc5921f747126165
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:70
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:70

    # 某一從庫輸入如下
    root@long:/opt/test_redis# redis-cli -p 6382 info replication
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6380
    master_link_status:up
    master_last_io_seconds_ago:5
    master_sync_in_progress:0
    slave_repl_offset:56
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:a9346280d6d445a1cde9f7a2cc5921f747126165
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:56
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:56

主庫故障處理

如果在主從複製當中,我們的主庫掛了,可以切換從庫為主庫

    # 進入需要切換的主庫的從庫執行
    127.0.0.1:6381> slaveof no one
    OK
    # 可以看到它的配置當中已變成主庫
    127.0.0.1:6381> info replication
    # Replication
    role:master
    connected_slaves:0
    master_replid:a5d9427d968c91b406054f45de51295689d9644e
    master_replid2:a9346280d6d445a1cde9f7a2cc5921f747126165
    master_repl_offset:662
    second_repl_offset:663
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:662
    # 接下來將另一個從庫轉換為以它為主
    127.0.0.1:6382> slaveof 127.0.0.1 6381
    OK
    127.0.0.1:6382> info replication
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6381
    master_link_status:up
    master_last_io_seconds_ago:2
    master_sync_in_progress:0
    slave_repl_offset:662
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:a5d9427d968c91b406054f45de51295689d9644e
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:662
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:663
    repl_backlog_histlen:0

透過哨兵模式使其自動主從備份

以上主從切換的功能都需要手動完成。而哨兵就是在時刻監測是不是一個redis節點掛了,如果一個主庫掛了,哨兵就會選出一個從庫來代替主庫。從而保證服務正常執行。

綜上,哨兵主要功能有:

  • 不時的監控redis是否良好執行,如果節點不可達就會對節點進行下線標識(檢查一般是透過定時ping主節點的方式)
  • 如果被標識的是主節點,sentinel就會和其他的sentinel節點“協商”,如果其他節點也人為主節點不可達,就會選舉一個sentinel節點來完成自動故障轉義
  • 在master-slave進行切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
    img

哨兵的啟動和檢查

    # 設定哨兵的配置檔案如:26380.conf
    # 啟動於26380埠
    port 26380  
    dir "/opt/test_redis/sentinel"
    logfile "26380.log"
    # 後臺啟動
    daemonize yes

    # 當前Sentinel節點監控 127.0.0.1:6379 這個主節點
    # 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意
    # mymaster是主節點的別名
    sentinel monitor mymaster 127.0.0.1 6379 2

    # 每個Sentinel節點都要定期PING命令來判斷Redis資料節點和其餘Sentinel節點是否可達,如果超過30000毫秒30s且沒有回覆,則判定不可達
    sentinel down-after-milliseconds mymaster 30000

    # 當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做故障轉移操作,選出新的主節點,
    # 原來的從節點會向新的主節點發起復制操作,限制每次向新的主節點發起復制操作的從節點個數為1
    sentinel parallel-syncs mymaster 1

    # 故障轉移超時時間為180000毫秒
    sentinel failover-timeout mymaster 180000

如此配置之後便可透過命令啟動哨兵(注意啟動哨兵時要確保主從庫已啟動)

    # 啟動哨兵
    redis-sentinel 26380.conf
    # 確認啟動成功看哨兵的配置檔案,會有很多改變
    root@long:/opt/test_redis/sentinel# cat 26380.conf 

    port 26380
    dir "/opt/test_redis/sentinel"
    logfile "26380.log"

    sentinel myid 5f9c80321fe544208459df14b5aa5069259f37ab

    sentinel monitor mymaster 127.0.0.1 6380 1

    sentinel down-after-milliseconds mymaster 10000

    sentinel config-epoch mymaster 0

    daemonize yes
    # Generated by CONFIG REWRITE
    sentinel leader-epoch mymaster 0
    sentinel known-slave mymaster 127.0.0.1 6381
    sentinel known-slave mymaster 127.0.0.1 6382
    sentinel known-sentinel mymaster 127.0.0.1 26382 f44680655e286f25504ad3a1b0c9cf1e86d8dba9
    sentinel known-sentinel mymaster 127.0.0.1 26381 3bf65b4fc567789e59f7969815cf58cd788742c0
    sentinel current-epoch 0

重點檢查
img

附加:

接下來可以手動將主庫kill掉檢查從庫身份是否發生改變。這裡不做演示(展示身份變化之後從庫6381和26380哨兵的配置情況如下)
img
img

相關文章