redis主從備份
主從複製介紹
redis主從複製原理:
- 從伺服器向主伺服器傳送 SYNC 命令。
- 接到 SYNC 命令的主伺服器會呼叫BGSAVE 命令,建立一個 RDB 檔案,並使用緩衝區記錄接下來執行的所有寫命令。
- 當主伺服器執行完 BGSAVE 命令時,它會向從伺服器傳送 RDB 檔案,而從伺服器則會接收並載入這個檔案。
- 主伺服器將緩衝區儲存的所有寫命令傳送給從伺服器執行。
主從複製手動執行
一般情況,我們有兩種方式執行主從複製:
- 透過寫入配置檔案透過配置檔案啟動的方式
- 透過執行salveof host port的方式進行啟動(在互動式redis客戶端當中)
# 我們設定完成主從同步之後,可以透過命令來看庫的主從情況
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的監控目標會隨之調換
哨兵的啟動和檢查
# 設定哨兵的配置檔案如: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
重點檢查
附加:
接下來可以手動將主庫kill掉檢查從庫身份是否發生改變。這裡不做演示(展示身份變化之後從庫6381和26380哨兵的配置情況如下)