Redis 管理
有关在生产环境中配置和管理 Redis 的建议
Redis 堆栈 | Redis 社区版 |
---|
Redis 设置提示
Linux的
-
使用 Linux作系统部署 Redis。Redis 也在 OS X 上进行了测试,有时也在 FreeBSD 和 OpenBSD 系统上进行了测试。但是,Linux 是执行大多数压力测试的地方,也是运行大多数生产部署的地方。
-
将 Linux kernel overcommit memory (Linux 内核过载内存) 设置为 1。加
vm.overcommit_memory = 1
自/etc/sysctl.conf
.然后,重新启动或运行命令sysctl vm.overcommit_memory=1
以激活设置。有关详细信息,请参阅 FAQ: Background saving fails with a fork() error on Linux?。 -
要确保 Linux 内核功能透明大页不会影响 Redis 内存使用和延迟,请执行以下命令:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
以禁用它。有关其他上下文,请参阅延迟诊断 - 透明大页面引起的延迟。
记忆
-
已确保已启用交换空间,并且您的交换文件大小等于系统上的内存量。如果 Linux 没有设置交换,并且您的 Redis 实例意外消耗了太多内存,Redis 可能会在内存不足时崩溃,或者 Linux 内核 OOM 终止程序可能会终止 Redis 进程。启用交换后,您可以检测延迟峰值并对其执行作。
-
将显式
maxmemory
option limit 来确保它在接近达到系统内存限制时报告错误而不是失败。请注意,maxmemory
应该通过计算 Redis 的开销(数据除外)和碎片开销来设置。因此,如果您认为您有 10 GB 的可用内存,请将其设置为 8 或 9。 -
如果您在写入密集型应用程序中使用 Redis,则在将 RDB 文件保存在磁盘上或重写 AOF 日志时,Redis 最多可以使用正常使用的内存的 2 倍。使用的额外内存与保存过程中写入修改的内存页数成正比,因此它通常与在此期间接触的键(或聚合类型项)的数量成正比。确保相应地调整内存大小。
-
请参阅
LATENCY DOCTOR
和MEMORY DOCTOR
命令来帮助进行故障排除。
成像
- 在 daemontools 下运行时,使用
daemonize no
.
复制
-
根据 Redis 使用的内存量设置一个重要的复制积压工作。backlog 允许副本更轻松地与主 (主) 实例同步。
-
如果您使用复制,则即使禁用了持久性,Redis 也会执行 RDB 保存。(这不适用于无盘复制。如果您在主服务器上没有磁盘使用量,请启用无盘复制。
-
如果您使用的是复制,请确保您的主服务器启用了持久性,或者它不会在崩溃时自动重新启动。副本将尝试维护 master 的精确副本,因此如果 master 使用空数据集重新启动,则副本也将被擦除。
安全
- 默认情况下,Redis 不需要任何身份验证并侦听所有网络接口。如果您将 Redis 暴露在 Internet 上或攻击者可以访问的其他地方,这将是一个很大的安全问题。例如,请参阅此攻击以了解它有多危险。请查看我们的安全页面,了解有关如何保护 Redis 的信息。
在 EC2 上运行 Redis
- 使用基于 HVM 的实例,而不是基于 PV 的实例。
- 请勿使用旧的实例规格族。例如,将 m3.medium 与 HVM 一起使用,而不是将 m1.medium 与 PV 一起使用。
- 需要谨慎处理 EC2 EBS 卷的 Redis 持久性,因为有时 EBS 卷具有高延迟特性。
- 如果在副本与主服务器同步时遇到问题,则可能需要尝试新的无盘复制。
在不停机的情况下升级或重新启动 Redis 实例
Redis 设计为服务器中长时间运行的进程。您可以使用CONFIG SET
命令。您还可以从 AOF 切换到 RDB 快照持久性,或者相反,而无需重新启动 Redis。检查CONFIG GET *
命令了解更多信息。
有时需要重新启动,例如,将 Redis 进程升级到较新版本,或者当您需要修改当前不支持的配置参数时CONFIG
命令。
请按照以下步骤作以避免停机。
-
将新的 Redis 实例设置为当前 Redis 实例的副本。为此,您需要不同的服务器,或者具有足够 RAM 以保持两个 Redis 实例同时运行的服务器。
-
如果使用单服务器,请确保副本在与 Master 实例不同的端口上启动,否则副本无法启动。
-
等待复制初始同步完成。检查副本的日志文件。
-
用
INFO
,请确保 master 和 copy 具有相同的 key 数量。用redis-cli
检查副本是否按预期工作并正在回复您的命令。 -
允许写入副本
CONFIG SET slave-read-only no
. -
配置所有客户端以使用新实例 (副本)。请注意,您可能希望使用
CLIENT PAUSE
命令确保切换期间没有客户端可以写入旧的主服务器。 -
确认 master 不再收到任何查询后(您可以使用
MONITOR
命令),使用REPLICAOF NO ONE
命令,然后关闭 Master。
如果您使用的是 Redis Sentinel 或 Redis Cluster,则升级到较新版本的最简单方法是逐个升级副本。然后,您可以执行手动故障转移,将其中一个已升级的副本提升为主副本,最后提升最后一个副本。
注意
Redis Cluster 4.0 在集群总线协议级别与 Redis Cluster 3.2 不兼容,因此在这种情况下需要大规模重启。但是,Redis 5 集群总线向后兼容 Redis 4。