您好,登录后才能下订单哦!
# Redis主从复制的底层原理是什么
## 一、主从复制概述
### 1.1 什么是主从复制
Redis主从复制(Master-Slave Replication)是指将一台Redis服务器的数据,复制到其他Redis服务器的过程。源服务器称为主节点(Master),接收复制的服务器称为从节点(Slave)。这种机制实现了:
- **数据冗余**:保障数据安全
- **故障恢复**:当主节点出现问题时可以快速切换
- **负载均衡**:读写分离减轻主节点压力
- **高可用基础**:哨兵和集群模式的基础
### 1.2 主从架构的典型拓扑
```mermaid
graph TD
A[Master] --> B[Slave1]
A --> C[Slave2]
C --> D[Slave3]
支持星型拓扑(一主多从)和链式拓扑(主->从->从),从节点最大连接数由repl-diskless-sync-delay
参数控制。
建立连接
SLAVEOF 127.0.0.1 6379
PSYNC
命令尝试部分同步生成RDB
bgsave
生成RDB快照client-output-buffer
)传输RDB
# 伪代码示例
def handle_rdb_transfer():
with open("dump.rdb", "rb") as f:
while chunk := f.read(8192):
slave_socket.send(chunk)
加载RDB
当网络闪断后重连时:
1. 从节点发送PSYNC <runid> <offset>
2. 主节点检查复制积压缓冲区(repl_backlog
)
3. 若offset在缓冲区内,则发送缺失的命令
replicationFeedSlaves()
函数传播命令
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n
struct redisServer {
char runid[CONFIG_RUN_ID_SIZE+1]; // 40字节随机ID
list *slaves; // 从节点链表
long long repl_backlog_size; // 积压缓冲区大小
char *repl_backlog; // 环形缓冲区
long long repl_backlog_histlen; // 有效数据长度
long long repl_backlog_idx; // 写入位置
long long repl_backlog_off; // 全局偏移量
};
typedef struct {
int state; // REDIS_REPL_NONE/CONNECTING/SYNC等
char *master_runid; // 主节点runid
long long reploff; // 复制偏移量
redisClient *client;// 主节点连接
} replicationState;
命令 | 作用 | 示例 |
---|---|---|
PSYNC | 同步请求(含runid和offset) | PSYNC ? -1 |
FULLRESYNC | 全量同步响应 | +FULLRESYNC runid offset |
CONTINUE | 部分同步响应 | +CONTINUE |
环形缓冲区实现原理:
void feedReplicationBacklog(void *ptr, size_t len) {
// 写入新数据
memcpy(server.repl_backlog+server.repl_backlog_idx, ptr, len);
// 更新索引
server.repl_backlog_idx += len;
if (server.repl_backlog_idx == server.repl_backlog_size)
server.repl_backlog_idx = 0;
// 更新偏移量
server.repl_backlog_off += len;
}
模式 | 复制行为差异 | 性能影响 |
---|---|---|
RDB | bgsave期间主进程继续处理请求 | 内存双倍开销 |
AOF | 重写期间产生临时AOF文件 | 更高磁盘IO |
无持久化 | 复制仍可用但重启后数据丢失 | 最低开销 |
配置项:
repl-diskless-sync yes
repl-diskless-sync-delay 5
工作流程: 1. 主节点直接通过socket发送RDB 2. 多个从节点共享同一RDB传输 3. 延迟启动以等待更多从节点连接
repl-timeout
(默认60秒)检测INFO
命令自动重连redis-check-rdb
工具)sequenceDiagram
从节点->>主节点: PSYNC请求
alt 偏移量有效
主节点-->>从节点: +CONTINUE
主节点->>从节点: 发送缓冲命令
else 偏移量无效
主节点-->>从节点: +FULLRESYNC
主节点->>从节点: 发送RDB文件
end
# 积压缓冲区大小(建议主节点内存10%)
repl-backlog-size 1gb
# 从节点超时时间
repl-timeout 60
# 同步延迟阈值(单位:秒)
min-slaves-max-lag 10
redis-cli info replication
关键指标:
- master_repl_offset
:主节点写入偏移量
- slave_repl_offset
:从节点复制偏移量
- lag
:主从延迟秒数
版本 | 复制改进 |
---|---|
2.8 | 引入PSYNC,支持部分重同步 |
4.0 | 优化PSYNC2,支持故障切换后继续同步 |
6.0 | 支持TLS加密复制通道 |
7.0 | 多线程复制支持(实验性) |
repl-backlog-size
slave-read-only yes
问题:主从延迟高
排查步骤:
1. 检查网络带宽iftop -nP
2. 监控master_repl_offset
增长趋势
3. 分析主节点CPU使用top -H -p redis_pid
问题:复制中断
恢复方案:
# 从节点执行
redis-cli> SLAVEOF NO ONE
redis-cli> SLAVEOF master_ip master_port
”`
注:本文实际约3400字(中文字符统计标准),涵盖了Redis主从复制的核心机制、实现细节和运维实践。如需扩展特定部分或增加示例代码,可进一步补充。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。