# Redis administration
在生产环境中配置和管理 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 内核特性透明大页面不会影响 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 最多可以使用通常使用的内存的 2 倍。使用的额外内存与保存过程中写入修改的内存页数成正比,因此它通常与在此期间触摸的键(或聚合类型项)的数量成正比。确保相应地调整内存大小。
- 请参阅
LATENCY DOCTOR
和MEMORY DOCTOR
命令以帮助进行故障排除。
# 成像
- 在 daemontools 下运行时,使用
daemonize no
.
# 复制
- 根据 Redis 使用的内存量设置一个重要的复制积压。积压允许副本更容易地与主(主)实例同步。
- 如果使用复制,即使禁用持久性,Redis 也会执行 RDB 保存。(这不适用于无盘复制。)如果您在主服务器上没有使用磁盘,请启用无盘复制。
- 如果您正在使用复制,请确保您的 master 启用了持久性,或者它不会在崩溃时自动重新启动。副本将尝试维护主副本的精确副本,因此如果主副本以空数据集重新启动,副本也将被擦除。
# 安全
- 默认情况下,Redis 不需要任何身份验证并侦听所有网络接口。如果您将 Redis 暴露在 Internet 或其他攻击者可以到达的地方,这是一个很大的安全问题。例如看
这个攻击](http://antirez.com/news/96),看看它有多危险。请查看我们的[安全页面
和快速入门
,了解有关如何保护 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。
# 反馈
如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。