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