Redis 主从复制设置指南。

本专家指南提供关于配置 Redis 主从复制的全面、循序渐进的教程,以实现高可用性和读取可扩展性。了解 Redis 如何管理完整同步和部分同步,通过配置文件或动态方式实现关键的 `replicaof` 指令,并使用 `INFO replication` 命令有效监控同步健康状况。我们详细介绍了生产环境的最佳实践,包括安全配置和针对大型数据集的优化技巧。

36 浏览量

Redis 主-副本复制设置指南

Redis 复制是实现高可用性、数据冗余和读取可伸缩性的基本模式。通过设置一个主节点(以前称为 master)和一个或多个副本节点(以前称为 slave),您可以确保写入主节点的数据会自动复制到所有连接的副本。

本指南提供了配置 Redis 主-副本复制的全面分步教程。我们将涵盖构建健壮可靠的 Redis 部署所需的基本配置指令、动态配置方法以及关键的监控步骤。


1. 理解 Redis 复制基础知识

Redis 复制是异步的(这意味着主节点不等待副本确认写入),从而实现了高吞吐量。它主要通过两个阶段运行:初始同步和持续同步。

全量同步 (SYNC)

当副本首次连接到主节点,或者在导致部分重新同步失败的网络中断后,会发生全量同步:

  1. 副本向主节点发送 PSYNC 命令。
  2. 主节点启动后台保存进程以生成 RDB 快照文件(.rdb)。
  3. 在创建 RDB 文件期间,主节点会缓冲所有新的写入命令。
  4. RDB 文件完成后,主节点将其发送给副本。
  5. 副本将 RDB 文件加载到内存中。
  6. 最后,主节点将所有缓冲的写入命令发送给副本以进行追赶。

部分重新同步 (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)(如果主节点本身需要)。

关键主节点设置:

  1. 绑定: 确保主节点绑定到公共 IP 地址或 0.0.0.0(如果跨多台机器运行)。如果使用防火墙,请确保为副本 IP 打开 6379 端口。
  2. 持久性: 虽然复制本身不严格要求,但强烈建议启用 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 指令。这告诉实例它应该与哪个主节点同步数据。

关键副本设置:

  1. 端口: 如果在同一台机器上运行,请使用不同的端口。
  2. 复制指令: 使用 replicaofslaveof(旧名称)。
# 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

  1. 连接到您想转换为副本的实例(在本例中运行在 6380 端口):

    bash redis-cli -p 6380

  2. 执行复制命令:

    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 过程可能会很慢。考虑以下因素:

  1. 网络带宽: 确保主节点和副本之间有足够的带宽用于 RDB 传输。
  2. RDB 生成: 主节点需要 CPU 和磁盘 I/O 来生成 RDB 文件。确保服务器在同步期间有可用资源。
  3. 在副本上禁用磁盘持久性(可选): 如果主节点处理所有持久性,而副本仅用于读取扩展,则在副本上设置 save "" 可以避免写入 RDB 文件的 I/O 开销,从而加快重启速度。

5.3 安全和网络配置

至关重要的是,主节点不得将其复制端口(6379 或其他)公开面向互联网。配置防火墙规则,仅允许来自指定副本服务器 IP 地址的复制流量。

5.4 使用副本进行读取扩展

复制的主要好处是分发读取负载。将主要执行读取操作的应用程序定向到副本实例,将主节点保留用于写入操作,从而提高整体系统吞吐量。

结论

设置 Redis 主-副本复制对于构建有弹性、高性能的应用程序至关重要。通过正确配置 replicaof 指令和使用 INFO replication 定期监控链接状态,您可以为高可用性和有效的读取扩展奠定基础。

虽然本指南侧重于基本设置,但生产环境通常会集成更高级别的自动化,例如用于自动主节点提升和故障检测的 Redis Sentinel,或用于在多个节点之间自动分区和分发数据的 Redis Cluster