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 DOCTOR
和MEMORY 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 Sentinel 或 Redis Cluster,升级到新版本最简单的方法是逐个升级副本。然后您可以执行手动故障转移,将其中一个已升级的副本提升为主节点,最后再提升最后一个副本。
注意
Redis Cluster 4.0 在集群总线协议级别与 Redis Cluster 3.2 不兼容,因此在这种情况下需要进行大规模重启。然而,Redis 5 的集群总线与 Redis 4 向后兼容。