# Redis主從復制怎么實現
## 1. 主從復制概述
Redis主從復制(Master-Slave Replication)是指將一個Redis服務器(主節點)的數據復制到一個或多個Redis服務器(從節點)的過程。這種機制是Redis實現高可用性和讀寫分離的基礎架構。
### 1.1 核心價值
- **數據冗余**:實現數據熱備份
- **故障恢復**:主節點故障時從節點可升級
- **負載均衡**:讀寫分離減輕主節點壓力
- **高可用基石**:哨兵和集群的基礎
### 1.2 典型拓撲
```mermaid
graph TD
A[Master] --> B[Slave1]
A --> C[Slave2]
C --> D[Slave3] # 級聯結構
建立連接階段
SLAVEOF 127.0.0.1 6379
masterhost/masterport
同步準備階段
PING
命令檢測連通性PONG
后開始認證(如果配置了requirepass
)數據同步階段
# 偽代碼示例
def sync():
slave.send("PSYNC ? -1") # 初次同步使用全量復制
master.bgsave() # 后臺生成RDB
master.repl_buffer = [] # 開啟復制緩沖區
master.send_rdb(slave) # 傳輸RDB文件
slave.load_rdb() # 清空數據后加載
master.send(repl_buffer) # 發送緩沖區的寫命令
命令傳播階段
Redis 4.0+ 引入的優化機制: - 復制偏移量:主從各自維護offset - 復制積壓緩沖區:主節點的環形緩沖區(默認1MB) - Run ID:主節點唯一標識
sequenceDiagram
Slave->>Master: PSYNC <runid> <offset>
alt 偏移量在緩沖區內
Master-->>Slave: +CONTINUE
Master->>Slave: 發送缺失命令
else 需要全量同步
Master-->>Slave: +FULLRESYNC
Master->>Slave: 發送RDB
end
主節點配置(redis.conf):
# 必須配置項
requirepass yourpassword
masterauth yourpassword # 從節點訪問主節點的密碼
# 優化參數
repl-backlog-size 64mb # 增大復制緩沖區
repl-backlog-ttl 3600 # 斷開后保留時長
client-output-buffer-limit slave 512mb 128mb 60 # 調大客戶端緩沖區
從節點配置:
# 命令行方式
redis-cli -a yourpassword SLAVEOF 127.0.0.1 6379
# 配置文件方式
slaveof 127.0.0.1 6379
masterauth yourpassword
slave-read-only yes # 推薦開啟只讀
# 主節點執行
redis-cli> INFO replication
# 輸出示例
connected_slaves:2
slave0:ip=192.168.1.2,port=6380,state=online,offset=123456,lag=0
slave1:ip=192.168.1.3,port=6381,state=online,offset=123456,lag=1
# 從節點驗證
redis-cli> ROLE
問題現象 | 可能原因 | 解決方案 |
---|---|---|
從節點無法連接 | 網絡問題/認證失敗 | 檢查masterauth 配置 |
復制中斷 | 超時(repl-timeout默認60s) | 增大repl-timeout |
全量復制頻繁 | 緩沖區不足 | 增大repl-backlog-size |
主從數據不一致 | 從節點過期鍵處理問題 | 配置slave-read-only yes |
網絡優化:
參數調優:
repl-diskless-sync yes # 無盤復制(適用于SSD)
repl-ping-slave-period 10 # 心跳檢測間隔
監控指標:
master_repl_offset
增長是否正常slaveX_lag
延遲秒數拓撲結構:
Master -> Slave1 -> Slave2
優勢: - 減輕主節點壓力 - 適合多機房部署
風險: - 級聯層次不宜超過3層 - 延遲會逐級放大
Spring Boot配置示例:
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration master = new RedisStandaloneConfiguration("master", 6379);
RedisStandaloneConfiguration slave = new RedisStandaloneConfiguration("slave", 6380);
LettuceClientConfiguration config = LettuceClientConfiguration.builder()
.readFrom(ReadFrom.REPLICA_PREFERRED)
.build();
return new LettuceConnectionFactory(master, slave, config);
}
特性 | 主從復制 | 集群模式 |
---|---|---|
數據一致性 | 最終一致 | 分區一致 |
擴展性 | 垂直擴展 | 水平擴展 |
故障轉移 | 需配合哨兵 | 內置自動轉移 |
適用場景 | 中小規模數據 | 海量數據 |
注:本文基于Redis 6.2版本編寫,部分參數在不同版本可能存在差異。實際部署時應參考對應版本的官方文檔。 “`
該文檔共計約1750字,采用Markdown格式編寫,包含技術原理、配置示例、問題排查和最佳實踐等內容,符合技術文檔規范。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。