Redis基礎系列-主從復制
文章目錄
- Redis基礎系列-主從復制
- 1. 什么是 Redis 主從復制?
- 2. 主從復制有什么好處?
- 3. 如何配置 Redis 主從復制?
- 4. 主從復制的驗證
- 4.1 如何查看主從搭建成功
- 4.2 主從常見疑問
- 4.3 主從常見命令
- 5. 主從復制的原理和工作流程
- 6. 特殊的主從復制(薪火相傳)
- 7. 總結
- 8. 參考和感謝
1. 什么是 Redis 主從復制?
Redis 主從復制是一種數據復制機制,通過該機制,我們可以將 Redis 數據庫的數據從一個主 Redis 實例復制到多個從 Redis 實例,從而實現數據的備份和讀寫分離。主 Redis 實例負責寫入操作,而從 Redis 實例則負責讀取操作,從而提供更好的性能和可擴展性。
下面是經典的主從架構(一主二仆)
2. 主從復制有什么好處?
- 讀寫分離
- 容災恢復
- 數據備份
- 水平擴容支撐高并發
3. 如何配置 Redis 主從復制?
- 配置主 Redis 實例(示例:redis6379.conf)
# 1. 開啟后臺模式
daemonize yes
# 2.注釋掉回環地址限制
#bind 127.0.0.1@
# 3.關閉保護模式
protected-mode no
# 4.指定端口
port 6379
# 5.指定當前工作目錄(配置文件和快照文件路徑)
dir /myredis
# 6.pid進程文件名字
pidfile /var/run/redis_6379.pid
# 7.log文件名字
logfile "/myredis/6379.log"
# 8.redis密碼
requirepass 123456
# 9.快照文件路徑
dbfilename dump6379.rdb
- 配置第一個從 Redis 實例(示例:redis6380.conf)
按照上述redis6379.conf
進行配置,需要調整以下配置
# 4.指定端口
port 6380
# 6.pid進程文件名字
pidfile /var/run/redis_6380.pid
# 7.log文件名字
logfile "/myredis/6380.log"
新增加以下配置(這才是主從復制的關鍵配置)
# 1.設置主 Redis 實例的信息
replicaof 192.168.10.110 6379
# 2.設置主 Redis 認證信息
masterauth "123456"
- 配置第二個從 Redis 實例(示例:redis6381.conf)
按照上述redis6379.conf
進行配置,需要調整以下配置
# 4.指定端口
port 6381
# 6.pid進程文件名字
pidfile /var/run/redis_6381.pid
# 7.log文件名字
logfile "/myredis/6381.log"
新增加以下配置(這才是主從復制的關鍵配置)
# 1.設置主 Redis 實例的信息
replicaof 192.168.10.110 6379
# 2.設置主 Redis 認證信息
masterauth "123456"
從上述配置來看,我們可以清晰的了解到,主從配置的關鍵信息配置在slave上
4. 主從復制的驗證
按照上述步驟配置配置好主從rdis,要求三臺服務器兩兩能互相訪問,先啟動主機,然后啟動兩臺從機
4.1 如何查看主從搭建成功
- 使用命令查看
info replication
主機
從機1
從機2
- 日志查看
主機日志
從機1日志
從機2日志
4.2 主從常見疑問
-
從機可以執行寫命令嗎?
嚴格的讀寫分離,主機負責寫數據(也可以讀數據),從機負責讀數據
-
從機切入點問題
從機首次啟動,主機的數據覆蓋掉從機的數據,后續主機寫,從機跟著同步寫入
-
主機shutdown后,從機會上位嗎?
從機不動,原地待命,從機數據可以正常使用;等待主機重啟
-
主機shutdown后,重啟后主從關系還在嗎?從機還能否順利復制?
存在,能順利復制(青山依舊在)
-
某臺從機down后,master繼續,從機重啟后它能跟上大部隊嗎?
可以
4.3 主從常見命令
可以查看復制節點的主從關系和配置信息
info replication
從機在運行的狀況下,通過命令設置主機(改換門庭)
slaveof 主機ip 主機port
從機在運行的狀況下,通過命令斷掉與主機的關系(自立為王)
slaveof no one
5. 主從復制的原理和工作流程
- slave啟動,同步初請(發送同步的初始化請求)
slave啟動成功連接到master后會發送一個sync命令
slave首次全新連接master,一次完全同步 (全量復制)將被自動執行,slave自身原有數據會被master數據覆蓋清除
- 首次連接,全量復制
master節點收到sync命令后會開始在后臺保存快照(即RDB持久化,主從復制時會觸發RDB),同時收集所有接收到的用于修改數據集的命令緩存起來,master節點執行RDB持久化完后,master將rdb快照文件和所有緩存的命令發送到所有slave,以完成一次完全同步
而slave服務在接收到數據庫文件數據后,將其存盤并加載到內存中,從而完成復制初始化
- 心跳持續,保持通信
# 10s發送一次心跳
repl-ping-replica-period 10
- 進入平穩,增量復制
Master繼續將新的所有收集到的修改命令自動依次傳給slave,完成同步
- 從機下線,重連續傳
master會檢查backlog里面的offset,master和slave都會保存一個復制的offset還有一個masterId,offset是保存在backlog中的。Master只會把已經復制的offset后面的數據復制給Slave,類似斷點續傳
在 Redis 主從復制中,backlog(復制積壓緩沖區)是一個用于存儲主節點未能及時傳遞給從節點的寫命令的緩沖區。當主節點生成 RDB 快照或 AOF 日志文件時,或者主從節點之間的網絡連接出現故障時,主節點上新接收到的寫命令將會存儲在 backlog 中,等待后續的傳輸。backlog 的作用是確保在主節點和從節點之間的復制過程中數據的準確性和一致性。當連接恢復時,從節點會獲取 backlog 中的命令,執行它們以補充在復制過程中可能丟失的數據。backlog 的大小是通過 `repl-backlog-size` 參數來配置的,默認情況下是 1MB。如果 backlog 中緩存的命令數量超過了配置的大小,最早的命令將被丟棄。值得注意的是,backlog 只用于短暫的數據流失或網絡中斷情況下的數據恢復,而不是用于持久化的數據備份。因此,當出現較長時間的故障或大量數據丟失時,可能需要使用其他策略或手段進行數據恢復和同步。
6. 特殊的主從復制(薪火相傳)
- 上一個slave可以是下一個slave的master,slave同樣可以接收其他slaves的連接和同步請求,那么該slave作為了鏈條中下一個的master.可以有效減輕主master的寫壓力
- 中途變更轉向:會清除之前的數據,重新建立拷貝最新的
7. 總結
主從復制雖然可以實現讀寫分離,很大程度上提高redis的使用性能,但是它的缺點也是顯而易見的:
- 由于所有的寫操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機器有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量的增加也會使這個問題更加嚴重。
- master宕機了,從機不會競選master,此時只能讀,不能寫
8. 參考和感謝
尚硅谷Redis零基礎到進階,最強redis7教程,陽哥親自帶練