Redis主从复制搭建指南
使用replicaof、身份验证、监控和生产安全检查搭建Redis主从复制。
Redis主从复制搭建指南
Redis复制是实现高可用性、数据冗余和读取可扩展性的基本模式。通过设置一个主节点(原称master)和一个或多个从节点(原称slave),可以确保写入主节点的数据自动复制到所有连接的从节点。
本指南将介绍如何配置Redis主从复制、验证同步是否正常工作,并避免常见的错误,这些错误可能会暴露Redis或导致从节点静默滞后。
理解Redis复制基础
Redis复制是异步的(意味着主节点不等待从节点确认写入),从而实现了高性能。它主要通过两个阶段运行:初始同步和持续同步。
全量同步(SYNC)
当从节点首次连接到主节点,或在网络中断导致无法进行部分重新同步时,会发生全量同步:
- 从节点向主节点发送
PSYNC命令。 - 主节点启动后台保存进程以生成RDB快照文件(
.rdb)。 - 主节点缓冲在创建RDB期间收到的所有新写入命令。
- RDB文件完成后,主节点将其发送给从节点。
- 从节点将RDB文件加载到内存中。
- 最后,主节点发送所有缓冲的写入命令给从节点以追赶进度。
部分重新同步(PSYNC)
Redis 2.8+支持部分重新同步。如果主节点和从节点之间的连接短暂断开,从节点可以仅请求自连接断开以来缺失的命令,使用复制积压缓冲区(主节点上的可配置循环缓冲区)。
前提条件和设置
在配置复制之前,请确保至少有两个独立的Redis实例在运行(或在同一服务器上不同端口上运行的不同配置用于测试)。
本指南假设以下设置:
| 实例 | 角色 | IP地址 | 端口 | 配置文件 |
|---|---|---|---|---|
| 主节点 | 主节点 | 192.168.1.100 | 6379 | redis-primary.conf |
| 从节点1 | 从节点 | 192.168.1.101 | 6380 | redis-replica-1.conf |
步骤2.1:配置主节点实例
确保主节点实例准备好接受来自从节点的连接,并配置了持久化(RDB或AOF),以保证主节点自身的稳定性。
关键主节点设置:
- 绑定: 确保主节点绑定到公共IP地址或
0.0.0.0(如果在多台机器上运行)。如果使用防火墙,请确保端口6379对从节点IP开放。 - 持久化: 虽然复制本身不严格要求,但强烈建议启用RDB/AOF以实现主节点数据持久化。
# redis-primary.conf
port 6379
bind 0.0.0.0 # 绑定到所有接口(外部从节点需要)
# 启用RDB持久化
save 900 1
save 300 10
save 60 10000
步骤2.2:配置从节点实例
设置从节点的核心在于replicaof指令。这告诉实例它应该与哪个主节点同步数据。
关键从节点设置:
- 端口: 如果在同一台机器上运行,请使用不同的端口。
- 复制指令: 使用
replicaof或slaveof(旧名称)。
# redis-replica-1.conf
port 6380
# *** 基本复制配置 ***
replicaof 192.168.1.100 6379
# 确保从节点只读(自Redis 5起默认)
replica-read-only yes
# 如果由Sentinel/Cluster处理高可用性,建议在从节点上禁用持久化
# 如果需要快速重启,请保持持久化启用。
save ""
注意: 如果主节点需要密码,请使用
masterauth <password>配置从节点。在Redis 6及更高版本的ACL设置中,当复制用户不是默认用户时,还要配置masteruser。
实现方法
您可以通过编辑配置文件并重启服务器来实现复制,或者通过从redis-cli动态运行REPLICAOF命令来实现。
方法3.1:配置文件(推荐用于生产环境)
按上述更新redis-replica-1.conf后,启动两个实例:
# 启动主节点
redis-server redis-primary.conf
# 启动从节点1
redis-server redis-replica-1.conf
启动后,从节点1将立即尝试连接到主节点192.168.1.100:6379并开始同步过程。
方法3.2:动态配置
如果Redis实例已在运行,并且您希望将其转换为从节点而无需重启,请通过redis-cli运行REPLICAOF。
连接到要转换为从节点的实例(在我们的示例中运行在端口6380上):
redis-cli -p 6380执行复制命令:
127.0.0.1:6380> replicaof 192.168.1.100 6379 OK
端口6380上的实例将丢弃所有先前数据并启动与新主节点的全量同步(SYNC)。
⚠️ 警告:禁用复制
要将从节点恢复为独立主节点实例,请在该实例上执行
replicaof no one。
4. 监控复制状态
监控连接状态对于确保数据一致性至关重要。在主节点和从节点上使用INFO replication命令通过redis-cli进行检查。
4.1 检查主节点状态
连接到主节点(6379)并检查有多少从节点已连接及其状态:
redis-cli -p 6379 INFO replication
预期输出片段(主节点):
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.101,port=6380,state=online,offset=2048,lag=0
master_replid:a9b1c2...
master_replid2:000000...
master_repl_offset:2048
role:master确认其角色。connected_slaves:1确认从节点可见。state=online是期望的稳定状态。lag=0或低值表示从节点响应及时。Redis复制仍然是异步的,因此这不是零数据丢失的保证。
4.2 检查从节点状态
连接到从节点(6380)并检查主节点链接状态:
redis-cli -p 6380 INFO replication
预期输出片段(从节点):
# Replication
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:up
master_sync_in_progress:0
slave_priority:100
slave_read_only:1
role:slave确认其角色。master_link_status:up确认连接活跃且健康。master_sync_in_progress:0表示初始同步已完成。
复制最佳实践和优化
5.1 复制只读模式
默认情况下,从节点是只读的(replica-read-only yes)。这是一个关键的安全机制。尝试写入从节点将导致错误,从而确保集群中的数据一致性。
如果您禁用只读模式,对从节点的任何写入都将是本地的,并且如果复制链接断开并发生全量同步,这些写入将被覆盖。
5.2 优化同步时间
如果您的数据集非常大,初始SYNC过程可能会很慢。考虑以下因素:
- 网络带宽: 确保主节点和从节点之间有足够的带宽用于RDB传输。
- RDB生成: 主节点需要CPU和磁盘I/O来生成RDB文件。确保服务器在同步期间有可用资源。
- 在从节点上禁用磁盘持久化(可选): 如果主节点处理所有持久化,并且从节点仅用于读取扩展,则在从节点上设置
save ""可以避免写入RDB文件的I/O开销,从而加快重启速度。
5.3 安全和网络配置
至关重要的是,主节点不应将其复制端口(6379或其他)公开暴露到互联网。配置防火墙规则,仅允许来自指定从节点服务器IP地址的复制流量。
5.4 使用从节点进行读取扩展
复制的主要好处是分配读取负载。将主要执行读取操作的应用程序直接指向从节点实例,保留主节点用于写入操作,从而提高整体系统吞吐量。
后续步骤
设置Redis主从复制对于构建弹性、高性能的应用程序至关重要。通过正确配置replicaof指令并定期使用INFO replication监控链接状态,您可以为高可用性和有效的读取扩展奠定基础。
虽然本指南侧重于基本设置,但生产环境通常集成进一步的自动化层,例如用于自动主节点提升和故障检测的Redis Sentinel,或用于跨多个节点自动分区和分布数据的Redis Cluster。