Redis 管理

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

Redis 设置提示

Linux

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

  • 将Linux内核的overcommit内存设置设置为1。将vm.overcommit_memory = 1添加到/etc/sysctl.conf中。然后,重新启动或运行命令sysctl vm.overcommit_memory=1以激活设置。详情请参见FAQ: Background saving fails with a fork() error on Linux?

  • 为了确保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可能会使用多达正常内存的两倍。额外使用的内存与保存过程中被写入修改的内存页数成正比,因此通常与在此期间接触的键(或聚合类型项)的数量成正比。请确保相应地调整内存大小。

  • 请参阅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 命令修改许多配置选项而无需重启。您还可以在不重启 Redis 的情况下从 AOF 切换到 RDB 快照持久化,或者反之。查看 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 Cluster,升级到新版本的最简单方法是逐个升级副本。然后您可以执行手动故障转移,将其中一个升级后的副本提升为主节点,最后提升最后一个副本。


注意

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


RATE THIS PAGE
Back to top ↑