Redis 生产实战 7×24:容量规划、性能调优、故障演练与成本治理 40 条军规

(一)写在前面:为什么需要"军规"

Redis 在测试环境跑得飞快,一到线上就"莫名其妙"抖动;大促前扩容 3 倍,成本却翻 5 倍;一次主从切换,缓存雪崩导致下游 DB 被打挂;开发说"Redis 是缓存,丢点数据无所谓",结果用户下单重复扣款。

这些问题背后,是缺乏体系化的方法论。本文以"军规"形式,总结 40 条血泪经验,覆盖容量、性能、高可用、成本、监控、演练、治理七大主题。

(二)容量规划 6 条军规

军规 1:不要用"峰值 QPS × 平均 value 大小"估算内存。

真实公式:

memory = (key 总数 × (key 长度 + value 长度 + 56B 元数据)) × 1.3(碎片因子) + 复制 backlog + client 缓冲区 + AOF 重写缓冲区。

军规 2:提前 6 个月规划 TTL。

业务方往往拍脑袋写 86400s,结果 90% key 3 小时后就无访问。TTL 减半,内存立省一半,但需评估击穿风险。

军规 3:冷热分级。

把 30 天未访问的 key 迁移到 SSD Redis 或 OSS,接口延迟从 1 ms 涨到 5 ms,但内存成本降 70%。

军规 4:预分配集群槽位。

不要等 1000 个节点再扩容,提前按业务域分池,避免跨槽事务。

军规 5:预留 20% 内存给复制与 AOF。

主从全量同步时,子进程瞬时内存翻倍,云主机 OOM Killer 会无情降临。

军规 6:定期跑 redis-cli --bigkeys。

10 KB 的 value 用 hash 拆分,>1 MB 的直接打回业务方。

(三)性能调优 8 条军规

军规 7:slowlog 阈值不要设 10 ms,请设 1 ms。

一次 Lua 脚本 50 ms,会拖慢整个事件循环。

军规 8:避免 keys *、flushdb。

用 SCAN + pipeline,或者把命令改写成 Lua。

军规 9:监控 used_cpu_sys 与 used_cpu_user 比例。

比例 > 3 说明系统调用开销大,检查是否频繁 fork、swap。

军规 10:开启 io-threads 前,先用 redis-benchmark 压测。

单核 QPS 已 > 8 万且 value > 4 KB 时才生效。

军规 11:TLS 不是洪水猛兽。

在 AWS Nitro Enclaves 上,TLS 握手延迟 < 0.2 ms,CPU 消耗 < 5%,安全合规收益远高于性能损耗。

军规 12:关闭 THP。

Transparent Huge Page 会导致 30 ms 级延迟毛刺。

军规 13:NUMA 绑核。

在多 socket 服务器上,把 Redis 绑到同一个 NUMA node,避免跨 node 访存。

军规 14:避免 swap。

vm.overcommit_memory=1,关闭 swap,或把 swapiness 调到 1。

(四)高可用与故障演练 10 条军规

军规 15:哨兵至少 3 节点,且跨机架。

两节点"脑裂"时,业务永远选错主。

军规 16:cluster-require-full-coverage=no。

当 1/16384 槽位异常时,集群仍可服务。

军规 17:每月一次"机房断电"演练。

用 iptables 随机 drop 500 ms 包,模拟网络抖动;用 tc 注入 200 ms 延迟,验证客户端重试策略。

军规 18:故障演练前先跑 redis-check-aof 与 redis-check-rdb。

AOF 尾部写坏时,可用 redis-check-aof --fix 截断到最近合法命令。

军规 19:配置 client-output-buffer-limit replica 256mb 64mb 60。

防止 replica 读取慢导致 master 缓冲区堆积。

军规 20:设置 min-replicas-to-write 1。

极端情况下,拒绝写请求,保护数据。

军规 21:使用 redis-cli --rdb 做异地冷备。

RDB 流式传输,无需停机。

军规 22:Prometheus 采集间隔 5 s,不要 30 s。

故障窗口 30 s 足以让熔断失效。

军规 23:告警分级。

P0:master 宕机;P1:replica 延迟 > 1 s;P2:used_memory > 85%。

军规 24:灰度升级。

先在只读实例升级,跑 24 h 无异常再升级主库。

(五)成本治理 7 条军规

军规 25:开启内存压缩。

listpack + 32 位编码,可省 40% 内存。

军规 26:使用 Spot 实例跑 replica。

Spot 被回收时,自动提升其他 replica。

军规 27:购买云上预留实例,不要按量。

3 年期预留比按量便宜 60%。

军规 28:定期回收僵尸 key。

写脚本扫描 TTL=-1 且 idle > 7 天的 key,发工单给业务 owner。

军规 29:避免跨 AZ 流量费。

同地域多 AZ 部署,用 VPC Endpoint 走内网。

军规 30:把日志压缩后转存 OSS。

AOF 重写后 7 天自动打包 gzip,节省 90% 存储。

军规 31:按业务域拆分集群。

A 业务 20 G、B 业务 200 G,放一起会导致 A 被迫付 10 倍成本。

(六)监控与可观测性 5 条军规

军规 32:用 redis_exporter + Grafana,而不是自己写脚本。

社区已支持 200+ 指标,覆盖 99% 场景。

军规 33:关注 master_last_io_seconds_ago。

replica 延迟不是看 offset,而是看主从最后一次交互时间。

军规 34:记录 executed_commands_total。

突增 10 倍,可能是业务死循环或爬虫。

军规 35:用 keyspace_misses / (hits + misses) 计算命中率。

不要只看 info stats 的 keyspace_hits。

军规 36:开启 latency-monitor-threshold 100。

记录 > 100 μs 的操作栈,方便火焰图定位。

(七)客户端与业务协同 4 条军规

军规 37:禁止 keys、monitor、flushall 命令。

用 ACL 屏蔽,或重命名为随机字符串。

军规 38:连接池大小 = (峰值 QPS × 平均 RTT) / (1 - 连接利用率)。

不要拍脑袋设 200。

军规 39:重试策略必须带 jitter。

固定 1 s 重试会导致 thundering herd。

军规 40:重大活动前 2 周冻结 Redis 配置变更,并做压测。

变更窗口不跨 0 点,方便回滚。

(八)结语

Redis 的门槛不在安装,而在"如何不踩坑"。40 条军规不是教条,而是"踩坑---复盘---固化"的循环产物。愿你在下一次故障来临前,已把它们变成肌肉记忆。

相关推荐
运维行者_3 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev3 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1233 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器3 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天4 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
桌面运维家4 小时前
如何用半缓存云桌面将服务器硬盘容量扩展至本地终端?
运维·服务器·缓存
南墙上的石头5 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画6 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc6 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t7 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb