Redis 管理

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

Redis 开源版

Redis 设置技巧

Linux

  • 使用 Linux 操作系统部署 Redis。Redis 也在 OS X 上进行测试,并且不时在 FreeBSD 和 OpenBSD 系统上进行测试。然而,Linux 是大多数压力测试的执行平台,也是大多数生产部署的运行平台。

  • 将 Linux 内核的内存过度分配设置 (overcommit memory setting) 为 1。将 vm.overcommit_memory = 1 添加到 /etc/sysctl.conf。然后,重启或运行命令 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 killer 会杀死 Redis 进程。启用交换空间后,您可以检测到延迟峰值并对其采取措施。

  • 在您的实例中设置明确的 maxmemory 选项限制,以确保当系统内存限制即将达到时,它会报告错误而不是失败。请注意,设置 maxmemory 时应计算 Redis 的开销(除了数据本身)以及碎片化开销。因此,如果您认为有 10 GB 的可用内存,请将其设置为 8 或 9。

  • 如果您在写操作繁重的应用中使用 Redis,在将 RDB 文件保存到磁盘或重写 AOF 日志时,Redis 的内存使用量可能会高达正常使用量的 2 倍。额外的内存使用量与保存过程中因写入而修改的内存页数成正比,因此通常与此期间接触的键(或聚合类型项)数量成正比。请确保相应地调整您的内存大小。

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

映像

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

复制

  • 根据 Redis 的内存使用量,设置一个非平凡的复制积压量 (replication backlog)。积压量可以让副本 (replica) 更容易与主 (master) 实例同步。

  • 如果您使用复制功能,即使禁用了持久化,Redis 也会执行 RDB 保存。(这不适用于无盘复制 diskless replication。) 如果您在主节点上没有磁盘使用需求,请启用无盘复制。

  • 如果您使用复制功能,请确保您的主节点要么启用了持久化,要么在崩溃时不会自动重启。副本会尝试维护主节点的精确副本,因此如果主节点以空数据集重新启动,副本也会被清除。

安全

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

在 EC2 上运行 Redis

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

不停机升级或重启 Redis 实例

Redis 被设计为服务器中的一个长期运行进程。您可以使用 CONFIG SET 命令在不重启的情况下修改许多配置选项。您也可以在不重启 Redis 的情况下从 AOF 切换到 RDB 快照持久化,或反过来。有关更多信息,请检查 CONFIG GET * 命令的输出。

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

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

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

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

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

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

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

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

  • 确认主节点不再接收任何查询后(您可以使用 MONITOR 命令检查),使用 REPLICAOF NO ONE 命令将副本提升为主节点,然后关闭旧的主节点。

如果您使用 Redis SentinelRedis Cluster,升级到新版本最简单的方法是逐个升级副本。然后您可以执行手动故障转移,将其中一个已升级的副本提升为主节点,最后再提升最后一个副本。


注意

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


评价本页
回到顶部 ↑