Redis 管理
有关在生产环境中配置和管理 Redis 的建议
Redis 设置提示
Linux
-
使用 Linux 操作系统部署 Redis。Redis 也在 OS X 上进行了测试,并且时不时在 FreeBSD 和 OpenBSD 系统上进行测试。然而,Linux 是进行大部分压力测试以及运行大部分生产部署的地方。
-
将 Linux 内核超额提交内存设置设为 1。将
vm.overcommit_memory = 1
添加到/etc/sysctl.conf
。然后,重新启动或运行命令sysctl vm.overcommit_memory=1
以激活该设置。有关详细信息,请参阅 常见问题解答:后台保存因 Linux 上的 fork() 错误而失败?。 -
为了确保 Linux 内核功能透明大页面不会影响 Redis 内存使用和延迟,请运行命令:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
以禁用它。有关其他背景信息,请参阅 延迟诊断 - 由透明大页面引起的延迟。
内存
-
确保启用交换,并且交换文件大小等于系统上的内存量。如果 Linux 未设置交换,并且 Redis 实例意外消耗了太多内存,则 Redis 可能会在内存不足时崩溃,或者 Linux 内核 OOM 杀手可能会终止 Redis 进程。启用交换后,你可以检测到延迟峰值并采取相应措施。
-
在你的实例中设置一个明确的
maxmemory
选项限制,以确保在系统内存限制接近达到时它会报告错误,而不是失败。请注意,maxmemory
应该通过计算 Redis 的开销(而不是数据)和碎片开销来设置。因此,如果你认为你有 10 GB 的可用内存,请将其设置为 8 或 9。 -
如果你在写入密集型应用程序中使用 Redis,则在磁盘上保存 RDB 文件或重写 AOF 日志时,Redis 可以使用高达正常使用内存的两倍。使用的附加内存与保存过程中写入修改的内存页数成正比,因此通常与在此期间触及的键(或聚合类型项)的数量成正比。确保相应地调整你的内存大小。
-
查看
LATENCY DOCTOR
和MEMORY DOCTOR
命令以帮助进行故障排除。
影像
- 在 daemontools 下运行时,使用
daemonize no
。
复制
-
根据 Redis 使用的内存量设置一个非平凡的复制积压。积压允许副本更容易地与主(主控)实例同步。
-
如果你使用复制,则即使禁用了持久性,Redis 也会执行 RDB 保存。(这不适用于无盘复制。)如果你在主控上没有磁盘使用,请启用无盘复制。
-
如果你正在使用复制,请确保你的主控启用了持久性,或者它不会在崩溃时自动重新启动。副本将尝试维护主控的确切副本,因此如果主控使用空数据集重新启动,副本也将被清除。
安全
- 默认情况下,Redis 不需要任何身份验证,并且侦听所有网络接口。如果你将 Redis 暴露在互联网或攻击者可以访问的其他地方,这是一个重大的安全问题。例如,请参阅 此攻击 以了解它可能有多么危险。请查看我们的 安全页面 和 快速入门,了解有关如何保护 Redis 的信息。
在 EC2 上运行 Redis
- 使用基于 HVM 的实例,而不是基于 PV 的实例。
- 不要使用旧的实例系列。例如,使用带 HVM 的 m3.medium,而不是带 PV 的 m1.medium。
- 使用 EC2 EBS 卷的 Redis 持久性需要小心处理,因为有时 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 Sentinel 或 Redis Cluster,升级到较新版本的最快捷方法是依次升级副本。然后,您可以执行手动故障转移,将一个升级的副本提升为主服务器,最后提升最后一个副本。
注意
Redis Cluster 4.0 与群集总线协议级别的 Redis Cluster 3.2 不兼容,因此在这种情况下需要进行大规模重启。但是,Redis 5 群集总线与 Redis 4 向后兼容。