Redis 主-副本复制设置指南
Redis 复制是实现高可用性、数据冗余和读取可伸缩性的基本模式。通过设置一个主节点(以前称为 master)和一个或多个副本节点(以前称为 slave),您可以确保写入主节点的数据会自动复制到所有连接的副本。
本指南提供了配置 Redis 主-副本复制的全面分步教程。我们将涵盖构建健壮可靠的 Redis 部署所需的基本配置指令、动态配置方法以及关键的监控步骤。
1. 理解 Redis 复制基础知识
Redis 复制是异步的(这意味着主节点不等待副本确认写入),从而实现了高吞吐量。它主要通过两个阶段运行:初始同步和持续同步。
全量同步 (SYNC)
当副本首次连接到主节点,或者在导致部分重新同步失败的网络中断后,会发生全量同步:
- 副本向主节点发送
PSYNC命令。 - 主节点启动后台保存进程以生成 RDB 快照文件(
.rdb)。 - 在创建 RDB 文件期间,主节点会缓冲所有新的写入命令。
- RDB 文件完成后,主节点将其发送给副本。
- 副本将 RDB 文件加载到内存中。
- 最后,主节点将所有缓冲的写入命令发送给副本以进行追赶。
部分重新同步 (PSYNC)
Redis 2.8+ 支持部分重新同步。如果主节点和副本之间的链接短暂断开,副本可以使用复制积压缓冲区(主节点上可配置的循环缓冲区)仅请求自链接断开以来丢失的命令。
2. 先决条件和设置
在配置复制之前,请确保您至少运行两个独立的 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(如果跨多台机器运行)。如果使用防火墙,请确保为副本 IP 打开 6379 端口。 - 持久性: 虽然复制本身不严格要求,但强烈建议启用 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 ""
注意: 如果主节点使用密码保护(使用
requirepass),则必须在副本上配置masterauth <password>以成功进行身份验证。
3. 实现方法
您可以通过编辑配置文件(redis.conf)并重启服务器,或者使用 CONFIG SET 命令动态地实现复制配置。
方法 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 使用 CONFIG SET。
-
连接到您想转换为副本的实例(在本例中运行在 6380 端口):
bash redis-cli -p 6380 -
执行复制命令:
bash 127.0.0.1:6380> replicaof 192.168.1.100 6379 OK
端口 6380 上的实例将丢弃任何先前的数据,并与新主节点启动全量同步(SYNC)。
⚠️ 警告:禁用复制
要将副本恢复为独立的初级实例,请在该实例上执行
replicaof no one。
4. 监控复制状态
监控连接状态对于确保数据一致性至关重要。在主节点和副本上使用 redis-cli 通过 INFO replication 命令。
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(或非常小的数字)表示数据传输同步性能成功。
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. 复制最佳实践和优化
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。