Redis 管理

有关在生产环境中配置和管理 Redis 的建议

Redis 设置提示

Linux

  • 使用 Linux 操作系统部署 Redis。Redis 也在 OS X 上经过测试,并且偶尔在 FreeBSD 和 OpenBSD 系统上测试。但是,Linux 是大多数压力测试执行的地方,也是大多数生产部署运行的地方。

  • 将 Linux 内核的 overcommit 内存设置设置为 1。在 `/etc/sysctl.conf` 中添加 `vm.overcommit_memory = 1`。然后,重启系统或运行命令 `sysctl vm.overcommit_memory=1` 来激活此设置。有关详细信息,请参阅 FAQ:Linux 上的背景保存操作因 fork() 错误而失败?

  • 为了确保 Linux 内核功能透明大页 (Transparent Huge Pages) 不影响 Redis 的内存使用和延迟,请运行命令:`echo never > /sys/kernel/mm/transparent_hugepage/enabled` 来禁用它。有关更多上下文,请参阅 延迟诊断 - 由透明大页引起的延迟

内存

  • 确保已启用交换分区,并且交换分区大小等于系统内存大小。如果 Linux 未设置交换分区,并且 Redis 实例意外地消耗了过多的内存,则 Redis 可能会在内存不足时崩溃,或者 Linux 内核 OOM 杀手可能会终止 Redis 进程。启用交换分区后,您可以检测延迟峰值并采取措施。

  • 在您的实例中设置一个明确的 `maxmemory` 选项限制,以确保在系统内存限制接近达到时,Redis 会报告错误而不是失败。请注意,`maxmemory` 应该通过计算 Redis 的开销(数据以外)和碎片开销来设置。因此,如果您认为有 10 GB 的可用内存,请将其设置为 8 或 9。

  • 如果您在写入密集型应用程序中使用 Redis,在将 RDB 文件保存到磁盘或重写 AOF 日志时,Redis 可能使用高达正常使用量的 2 倍内存。使用的额外内存与保存过程中写入修改的内存页数成正比,因此通常与这段时间内访问的键数(或聚合类型项数)成正比。请确保根据您的内存需求进行调整。

  • 请参阅 LATENCY DOCTORMEMORY DOCTOR 命令以帮助进行故障排除。

镜像

  • 在 daemontools 下运行时,使用 `daemonize no`。

复制

  • 根据 Redis 使用的内存量设置一个非平凡的复制延迟。延迟允许副本更容易地与主实例同步。

  • 如果您使用复制,Redis 会执行 RDB 保存,即使持久化被禁用。(这并不适用于无磁盘复制。)如果您在主实例上没有磁盘使用情况,请启用无磁盘复制。

  • 如果您使用复制,请确保您的主实例已启用持久化,或者它不会在崩溃时自动重启。副本将尝试保持与主实例完全一致的副本,因此如果主实例在空数据集的情况下重启,副本也将被清空。

安全性

  • 默认情况下,Redis 不需要任何身份验证,并监听所有网络接口。如果您将 Redis 暴露在互联网或其他攻击者可以访问的地方,这是一个巨大的安全问题。例如,请参阅 此攻击,以了解它可能有多危险。请查看我们的 安全页面,以了解如何保护 Redis。

在 EC2 上运行 Redis

  • 使用基于 HVM 的实例,而不是基于 PV 的实例。
  • 不要使用旧的实例系列。例如,使用带有 HVM 的 m3.medium 而不是使用 PV 的 m1.medium。
  • 将 Redis 持久化与 EC2 EBS 卷一起使用需要谨慎处理,因为 EBS 卷有时具有高延迟特性。
  • 如果您在副本与主实例同步时遇到问题,您可能需要尝试新的无磁盘复制。

升级或重启 Redis 实例,避免停机

Redis 被设计为在您的服务器上长时间运行的进程。您可以使用 CONFIG SET 命令在不重启的情况下修改许多配置选项。您还可以从 AOF 持久化切换到 RDB 快照持久化,反之亦然,而无需重启 Redis。查看 `CONFIG GET *` 命令的输出以获取更多信息。

有时需要重启,例如,将 Redis 进程升级到新版本,或者当您需要修改当前不受 CONFIG 命令支持的配置参数时。

请按照以下步骤操作,以避免停机。

  • 将您的新 Redis 实例设置为当前 Redis 实例的副本。为此,您需要一个不同的服务器,或者一个具有足够 RAM 来同时运行两个 Redis 实例的服务器。

  • 如果您使用单个服务器,请确保副本在与主实例不同的端口上启动,否则副本无法启动。

  • 等待复制初始同步完成。检查副本的日志文件。

  • 使用 INFO,确保主实例和副本具有相同的键数。使用 `redis-cli` 检查副本是否按预期工作,并响应您的命令。

  • 使用 `CONFIG SET slave-read-only no` 允许副本写入。

  • 配置所有客户端使用新实例(副本)。请注意,您可能需要使用 CLIENT PAUSE 命令来确保在切换期间没有客户端可以写入旧的主实例。

  • 一旦您确认主实例不再接收任何查询(您可以使用 MONITOR 命令进行检查),使用 `REPLICAOF NO ONE` 命令将副本选举为主实例,然后关闭您的主实例。

如果您使用的是 Redis SentinelRedis 集群,升级到新版本的简便方法是逐个升级副本。然后,您可以执行手动故障转移,将一个升级后的副本提升为主实例,最后提升最后一个副本。


注意

Redis 集群 4.0 与 Redis 集群 3.2 在集群总线协议级别不兼容,因此在这种情况下需要进行大规模重启。但是,Redis 5 集群总线向后兼容 Redis 4。


RATE THIS PAGE
Back to top ↑