主从复制
分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满足故障恢复和负载均衡等需求。
Redis 也提供了复制的功能,实现了相同数据的多个 Redis 副本。复制功能是高可用 Redis 的基础,哨兵和集群都是在复制的基础上构建的。
1. 建立复制
Redis 复制机制允许将数据从一个 Redis 实例(主节点/master)同步到一个或多个 Redis 实例(从节点/slave)。复制具有以下特点:
- 复制关系是单向的:数据只能从主节点流向从节点
- 每个从节点只能有一个主节点
- 一个主节点可以拥有多个从节点
有三种方式可以建立 Redis 复制关系:
- 配置文件方式:在配置文件中添加
slaveof {masterHost} {masterPort}
指令,随 Redis 启动生效 - 启动命令方式:在
redis-server
启动时加入--slaveof {masterHost} {masterPort}
参数 - 运行时命令方式:在 Redis 运行后使用
slaveof {masterHost} {masterPort}
命令
2. 配置从节点实例
以下是在 Linux 系统上配置 Redis 从节点的步骤:
复制主配置文件:
cp /etc/redis/redis.conf /etc/redis/redis-slave.conf
修改从节点配置文件:
# 启用守护进程模式 sed -i "s/daemonize no/daemonize yes/" /etc/redis/redis-slave.conf
启动从节点实例:
# Ubuntu 系统 redis-server /etc/redis/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379 # CentOS 系统 redis-server /etc/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
注意:主节点配置通常保持不变,主要修改从节点的配置。
3. 验证复制状态
检查 Redis 实例是否正常运行:
netstat -nlpt
预期输出应显示两个 Redis 实例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 49264/redis-server tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 272418/redis-server
测试数据同步:
连接到主节点(6379端口):
redis-cli
执行命令:
127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello "world"
连接到从节点(6380端口):
redis-cli -p 6380
验证数据同步:
127.0.0.1:6380> get hello "world"
4. 复制流程说明
当复制关系建立后,主节点的所有写操作都会自动同步到从节点。从节点会持续接收并应用主节点发送的数据更新,保持与主节点的数据一致性。
使用 info replication
命令可以查看 Redis 实例的复制状态信息,这对于监控和维护复制关系非常重要。
主节点 (6379) 复制状态示例:
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=100,lag=0
master_replid:2fbd35a8b8401b22eb92ff49ad5e42250b3e7a06
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:100
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:100
关键字段说明:
role:master
:标识当前节点为主节点connected_slaves
:显示已连接的从节点数量slave0
:详细显示第一个从节点的连接信息master_repl_offset
:主节点的复制偏移量
从节点 (6380) 复制状态示例:
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:170
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2fbd35a8b8401b22eb92ff49ad5e42250b3e7a06
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:170
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:170
关键字段说明:
role:slave
:标识当前节点为从节点master_link_status
:显示与主节点的连接状态slave_read_only
:从节点默认处于只读模式slave_repl_offset
:从节点已复制的数据偏移量
5. 断开复制关系
在从节点上执行 slaveof no one
命令可以断开与主节点的复制关系:
127.0.0.1:6380> slaveof no one
OK
断开复制的流程:
- 终止与主节点的复制连接
- 从节点晋升为独立的主节点
- 保留断开时的所有数据,但不再接收原主节点的更新
注意:断开复制后,从节点将成为独立节点,原有数据不会被清除,但不再与原主节点保持同步。
6. 切换主节点
从节点可以通过 slaveof
命令切换到新的主节点:
127.0.0.1:6380> slaveof 127.0.0.1 6479
OK
切换主节点的流程:
- 断开与当前主节点的复制关系
- 建立与新主节点的连接
- 清空当前所有数据(危险操作)
- 开始从新主节点进行完整同步
重要注意事项:
- 切换主节点会导致从节点现有数据被完全清除
- 在生产环境中执行此操作前应充分评估影响
- 建议在低峰期执行主节点切换操作
- 切换后应密切监控复制状态和数据一致性
7. 安全配置
主从认证机制:
对于存储重要数据的 Redis 节点,必须配置访问密码以确保数据安全:
主节点配置:
在redis.conf
中设置:requirepass strong_password
从节点配置:
在从节点的redis.conf
中添加:masterauth strong_password
操作说明:
- 所有客户端访问主节点必须使用
AUTH
命令认证 - 从节点通过特殊客户端连接主节点,必须配置匹配的
masterauth
才能建立复制 - 建议使用强密码(长度≥16位,包含大小写字母、数字和特殊字符)
安全建议:定期更换密码,并在配置文件中设置严格的文件权限(如 600)
8. 只读模式配置
从节点写保护:
Redis 从节点默认配置为只读模式:
slave-read-only yes
关键注意事项:
- 任何对从节点的写操作都会导致主从数据不一致
- 生产环境严禁修改此配置,避免以下风险:
- 数据不一致导致业务逻辑错误
- 从节点数据在故障转移时丢失
- 复制中断风险
特殊场景处理:
若必须临时启用从节点写入,应:
- 断开复制关系 (
slaveof no one
) - 明确告知所有客户端此节点状态变化
- 记录操作日志备查
9. 网络传输优化
- 延迟与带宽权衡:
通过 repl-disable-tcp-nodelay
参数控制网络传输行为:
repl-disable-tcp-nodelay no # 默认值
- 配置策略对比:
配置值 | 网络行为 | 延迟影响 | 带宽消耗 | 适用场景 |
---|---|---|---|---|
no (默认) |
立即发送小数据包 | 延迟低 | 带宽高 | 同机房/优质网络 |
yes |
合并数据包(约40ms间隔) | 延迟增加 | 带宽优化 | 跨机房/复杂网络 |
部署建议:
- 同机房部署:保持默认
no
配置repl-disable-tcp-nodelay no
- 跨地域部署:建议启用优化
repl-disable-tcp-nodelay yes
- 监控指标:
- 通过
info replication
观察lag
值 - 网络延迟应稳定在可接受范围内(通常<100ms)
- 通过