这篇是我把几套生产环境踩坑与复盘整理成的一份“从 0 到 1 + 长期可维护”的实践文。目标是:明确策略、给出默认可用的配置模板、把常见坑一次讲透
适用场景:新项目选型、老项目稳定性加固、从单机迁移到 HA/Cluster、应对数据安全与故障切换要求。


目录

  1. 核心结论先说在前面

  2. 持久化:RDB vs AOF(以及“二者结合”的推荐范式)

  3. 高可用形态:主从复制基础、Sentinel、Cluster

  4. 典型拓扑与配置模板(可直接改名上线)

  5. 备份/恢复/演练:从脚本到流程

  6. 性能与稳定性调优(内核、Redis 配置、内存与淘汰)

  7. 生产避坑清单(高频问题→定位→对策)

  8. 迁移与升级策略(Standalone→Sentinel、Sentinel→Cluster)

  9. 运维清单与值班自检表


1. 核心结论先说在前面

  • 持久化策略

    • 低延迟场景:首选 RDB + AOF(everysec) 组合。RDB 提供“冷备点”,AOF 控制丢失窗口(通常 ≤1s)。

    • 极端数据安全:AOF(appendfsync always),但写放大大、吞吐下降明显,一般不建议全站开启。

    • 只读/可丢缓存:可以 仅 RDB 或甚至关闭持久化,靠上游重建(但要清楚发生重启的业务影响)。

  • 高可用形态

    • 单实例 HA:主从 + Sentinel(入门首选,维护简单,客户端/驱动支持成熟)。

    • 水平扩展 + HA:Redis Cluster(3 主 3 备起步)。选它是因为容量/吞吐/隔离/自治,也要接受跨槽限制

  • 复制一致性:Redis 复制本质是异步。务必配合:

    • min-replicas-to-write / min-replicas-max-lag(提升写安全,避免主孤岛)

    • 按需使用 WAIT 命令等待复制到 N 个副本再返回(强一致片段,但影响时延)。

  • 默认稳妥配置(可作为起步模板):

    • appendonly yesappendfsync everysecno-appendfsync-on-rewrite yes

    • save 900 1 / save 300 10 / save 60 10000(按业务写入频率调整)

    • stop-writes-on-bgsave-error yes(防止静默数据丢失)

    • repl-backlog-size 256mb(按主写入速率与断链窗口估算)

    • maxmemory + 合理淘汰策略(缓存型业务尤为重要)


2. 持久化:RDB vs AOF(以及“二者结合”的推荐范式)

2.1 RDB(快照)

  • 原理:定期把内存快照写入 .rdb 文件(BGSAVE 子进程)。

  • 优点:文件小、恢复快、对线上写入影响较小(写时复制)。

  • 缺点:两次快照之间的新写入可能丢失

  • 关键配置

    # 触发条件按需调整(示例:90% 读多写少)
    save 900 1
    save 300 10
    save 60 10000rdbcompression yes
    rdbchecksum yes
    stop-writes-on-bgsave-error yes
    

2.2 AOF(追加日志)

  • 原理:把写命令追加到日志;重启时“重放”恢复。Redis 新版本使用 多段 AOF(BASE/INCR),并支持 RDB 作为 AOF 前导以加速恢复。

  • 优点更小的数据丢失窗口everysec 常见);可以手工编辑修复尾部。

  • 缺点:文件膨胀、重写时可能有额外 I/O 压力。

  • 关键配置

    appendonly yes
    appendfsync everysec           # 安全与性能折中(常用)
    no-appendfsync-on-rewrite yes  # 重写期间尽量少阻塞
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    # 新版:AOF 使用 RDB 作为 preamble(通常默认开启,恢复更快)
    # aof-use-rdb-preamble yes
    

2.3 推荐组合:RDB + AOF(everysec)

  • 为什么:RDB 提供“恢复基线”,AOF 提供“小丢失窗口”;重启时优先加载 AOF,若 AOF 不可用仍可回退到 RDB。

  • 通用建议先做对的,再做快的。先把 AOF + 定期 RDB 固住,再谈参数与 I/O 优化。


3. 高可用形态:主从复制基础、Sentinel、Cluster

3.1 主从复制基础

  • 复制机制:初次全量同步 + 之后命令流增量;断联后支持部分重同步(PSYNC)

  • 常用参数

    replica-read-only yes
    repl-diskless-sync yes
    repl-diskless-sync-delay 5
    repl-backlog-size 256mb
    min-replicas-to-write 1         # 至少有1个副本在线主才写
    min-replicas-max-lag 5          # 超过5s延迟则视为不安全
    
  • 只读从库:默认只读,适合做报表与只读流量分流(避免主库压力过大)。

3.2 Sentinel(哨兵)

  • 作用:自动故障检测、投票选主、通知客户端新主地址

  • 部署:至少 3 个哨兵实例(奇数),建议与 Redis 节点分机房/可用区部署。

  • 核心配置sentinel.conf):

    port 26379
    daemonize yes# 监控一个 master:<name> <ip> <port> <quorum>
    sentinel monitor app-master 10.0.0.10 6379 2sentinel down-after-milliseconds app-master 5000
    sentinel failover-timeout app-master 60000
    sentinel parallel-syncs app-master 1# 可选:通知/脚本
    # sentinel notification-script app-master /opt/sentinel/notify.sh
    # sentinel client-reconfig-script app-master /opt/sentinel/reconfig.sh
    
  • 客户端接入

    • 方式一:连接哨兵,按 master name 查询主;

    • 方式二:用支持 Sentinel 的驱动(Java/Lettuce、Go/redis、Node/ioredis 等)自动刷新连接。

3.3 Redis Cluster(分片+高可用)

  • 特性:16384 槽位(hash slot)分布到多主节点,每个主有 ≥1 个副本;主节点故障时由副本升主。

  • 限制:多键操作需在同槽(可用 {tag} 控制);Lua 脚本/事务等有跨槽限制。

  • 常用参数redis.conf):

    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 15000
    cluster-announce-ip 10.0.0.10     # 跨网段/容器时要显式设置
    cluster-announce-port 6379
    cluster-announce-bus-port 16379
    
  • 集群建议规模3 主 3 备起步(6 节点),单 AZ 内至少 3 台物理/虚拟机,尽量跨 AZ。

  • 创建与检查

    # 创建集群(示例6节点,3主3从)
    redis-cli --cluster create \10.0.0.10:6379 10.0.0.11:6379 10.0.0.12:6379 \10.0.0.13:6379 10.0.0.14:6379 10.0.0.15:6379 \--cluster-replicas 1# 查看拓扑
    redis-cli -c -h 10.0.0.10 -p 6379 cluster nodes
    redis-cli -c -h 10.0.0.10 -p 6379 cluster info
    

4. 典型拓扑与配置模板(可直接改名上线)

4.1 单实例高可用(主从 + Sentinel)

  • 拓扑1 主 + 2 从 + 3 Sentinel

  • 适用:中小体量、强一致要求不高、运维成本友好。

  • 主库片段(redis.conf)

    port 6379
    # 持久化
    save 900 1
    save 300 10
    save 60 10000
    appendonly yes
    appendfsync everysec
    no-appendfsync-on-rewrite yes# 复制与安全
    repl-diskless-sync yes
    repl-backlog-size 256mb
    min-replicas-to-write 1
    min-replicas-max-lag 5# 内存
    maxmemory 16gb
    maxmemory-policy allkeys-lru# 安全(按需)
    # requirepass <pass>
    # aclfile /etc/redis/users.acl
    
  • 从库片段

    replicaof 10.0.0.10 6379
    replica-read-only yes
    
  • Sentinel(3 份,仅示例一份):见上 3.2 配置。

4.2 Redis Cluster(3 主 3 从)

  • 每个节点的 redis.conf(变化项:cluster-announce-ip、端口):

    port 6379
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 15000# 持久化
    appendonly yes
    appendfsync everysec
    save 900 1
    save 300 10# 内存淘汰(缓存型很关键)
    maxmemory 16gb
    maxmemory-policy allkeys-lru
    
  • 创建集群:参考 3.3 脚本。

  • 扩容/缩容:使用 redis-cli --cluster reshardadd-nodedel-node,务必在低峰期进行。


5. 备份/恢复/演练:从脚本到流程

5.1 备份策略

  • RDB 冷备:定期复制 .rdb 到异地/对象存储(带版本与校验);

  • AOF:先 BGREWRITEAOF 生成紧凑版,再打包上传(避免巨大日志)。

  • 频率:日常建议 日备 + 周全量,重要业务增加关键时点手动快照。

  • 校验

    redis-check-rdb dump-2025-09-01.rdb
    redis-check-aof appendonly.aof
    

5.2 恢复流程(单实例)

  1. 下线流量、停止 Redis;

  2. 备份当前数据文件到临时目录(防误操作);

  3. 放入目标 dump.rdb(或 appendonly.aof),确保权限与 owner 一致;

  4. 启动 Redis,观察日志与 INFO

  5. 业务侧灰度放量。

5.3 恢复流程(Cluster)

  • 同槽迁移:尽量在集群内重建节点而非整体“外部恢复”;

  • 节点级恢复:按节点维度恢复 RDB/AOF,重入集群(CLUSTER MEET),再做 slot 迁移;

  • 强演练:每季度做一次“节点级数据损坏恢复演练”,记录耗时与回放步骤。


6. 性能与稳定性调优(内核、Redis 配置、内存与淘汰)

6.1 系统内核与文件系统

# 软中断/网络 backlog
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=8192# TIME_WAIT 回收(按需,谨慎)
sysctl -w net.ipv4.tcp_tw_reuse=1# 关闭透明大页(THP)
echo never > /sys/kernel/mm/transparent_hugepage/enabled# 关闭 swap 或保证 swapiness 很低
sysctl -w vm.swappiness=1# 允许内存 overcommit(防止 fork 失败)
sysctl -w vm.overcommit_memory=1

重点vm.overcommit_memory=1,否则 BGSAVE/BGREWRITEAOF 可能因内存不足失败。

6.2 Redis 配置热点

  • 延迟敏感

    • appendfsync everysec + no-appendfsync-on-rewrite yes

    • latency-monitor-threshold 100(打开延迟监控,单位毫秒)

  • 内存与碎片

    • maxmemory <size> + 合理 maxmemory-policy(缓存型推荐 allkeys-lruallkeys-lfu

    • activedefrag yes(生产常开,降低碎片)

  • 数据结构优化

    • 小对象压缩阈值(具体名称随版本有变化,如 listpack 相关阈值);

    • 尽量使用紧凑结构(如 Hash 存多字段,避免大量小 Key)。

6.3 慢查询与可观测性

# 记录慢查询(单位微秒)
CONFIG SET slowlog-log-slower-than 10000   # >10ms
CONFIG SET slowlog-max-len 2048# 查看慢日志
SLOWLOG GET 10# 延迟事件
LATENCY DOCTOR
LATENCY LATEST
  • 打通 Exporter → Prometheus → Grafana,关注内存碎片率、AOF 重写耗时、复制延迟、拒绝写入次数等核心指标。


7. 生产避坑清单(高频问题→定位→对策)

  1. BGSAVE/BGREWRITEAOF 失败

    • 现象:日志提示 fork 失败或 OOM;

    • 排查:vm.overcommit_memory、内存碎片、容器内存限制;

    • 对策:开启 activedefrag、扩内存、调整触发频率。

  2. 主从复制频繁全量

    • 现象:网络抖动后总是从头同步;

    • 排查:repl-backlog-size 太小;

    • 对策:增大到能覆盖网络波动期的写入量(按 QPS 与命令平均大小估)。

  3. 写入被拒(OOM 或不安全写)

    • 现象:OOM command not allowed / 触发 min-replicas-to-write 保护;

    • 对策:设置 maxmemory 与合理淘汰策略,或检查从库延迟/下线。

  4. AOF 膨胀/恢复慢

    • 现象:AOF 文件超大,重放耗时长;

    • 对策:定期 BGREWRITEAOF,启用“RDB 作为 AOF 前导”,老版本升级。

  5. Cluster 跨槽操作失败

    • 现象:CROSSSLOT Keys in request don't hash to the same slot

    • 对策:使用 hash tag(如 user:{42}:profileorder:{42}:list)让相关 Key 落同槽。

  6. Sentinel 频繁误判

    • 现象:网络抖动导致频繁 failover;

    • 对策:增大 down-after-milliseconds、合理 quorum、跨 AZ 部署 Sentinel。

  7. 容器/云环境 IP 上报错误

    • 现象:Cluster 节点互相连不上;

    • 对策:显式设置 cluster-announce-ipcluster-announce-portprotected-mode no(仅在安全网络下)。


8. 迁移与升级策略(Standalone→Sentinel、Sentinel→Cluster)

8.1 单机→Sentinel(无停机/短暂停)

  • 新建两个从库(全量同步完成后),部署 3 哨兵;

  • 切流量前压测读从(确认只读链路 OK);

  • 客户端切到 Sentinel 模式;

  • 小流量灰度 → 全量切换。

8.2 单机/Sentinel→Cluster(平滑迁移)

  • 新建 Cluster(3 主 3 从),业务新写双写(或通过数据管道/订阅复制);

  • 扫描旧库 Key,分批迁移到 Cluster(redis-shake/自研脚本/SCAN + MIGRATE);

  • 验证一致性(抽样校验、核心集合完整性校验);

  • 写流量切换到 Cluster → 读流量切换 → 观测一段时间 → 下线旧库。

若业务允许短暂停机,关闭写入口,做全量迁移 + 增量补偿,会简单很多。

8.3 版本升级

  • 同大版本小修:rolling 重启(从→主),使用 REPLICAOF 切换,缩短中断;

  • 跨大版本:先读 release notes 看持久化格式/配置项兼容性,影子集群演练,再灰度。


9. 运维清单与值班自检表

日常巡检(每日/每班次):

  • INFO replication:复制延迟、master_link_status

  • INFO persistence:AOF 重写状态、最近持久化失败次数;

  • INFO memory:使用量、碎片率(>1.5 长期需关注);

  • SLOWLOG LEN / SLOWLOG GET:慢查询堆积;

  • Cluster:cluster infocluster nodes 异常标记。

周度/关键变更前:

  • 触发 RDB 快照与 AOF 重写,校验备份;

  • Sentinel/Cluster 拓扑一致性检查;

  • 压测核心读写路径,记录基线。

季度演练:

  • 单节点宕机 → 恢复;

  • 主从切换演练(Sentinel/Cluster);

  • 备份恢复全链路复盘(计时 + 步骤卡点)。


附:一键化示例(可改名投入使用)

systemd 单实例服务(/etc/systemd/system/redis-6379.service

[Unit]
Description=Redis 6379
After=network.target[Service]
ExecStart=/usr/bin/redis-server /etc/redis/6379.conf --supervised systemd
ExecStop=/usr/bin/redis-cli -p 6379 shutdown
Type=notify
LimitNOFILE=100000[Install]
WantedBy=multi-user.target

Sentinel systemd(/etc/systemd/system/redis-sentinel.service

[Unit]
Description=Redis Sentinel
After=network.target[Service]
ExecStart=/usr/bin/redis-sentinel /etc/redis/sentinel.conf --supervised systemd
ExecStop=/usr/bin/redis-cli -p 26379 shutdown
Type=notify
LimitNOFILE=100000[Install]
WantedBy=multi-user.target

结语

Redis 的“正确打开方式”不是单点性能跑多快,而是在“可预期的失败”里依然稳定工作

  • RDB + AOF(everysec) 做好数据兜底;

  • 主从 + Sentinel 扛住单点;

  • 需要水平扩展就上 Cluster,在建模时用 {} 控制跨槽;

  • 结合 操作系统与 Redis 参数 做到“高性能但不冒险”;

  • 备份/恢复/演练 变成固定流程,而不是事故现场临时发挥。

如果你愿意,我可以把上述模板整理成 可下载的配置包(包含 redis.conf/sentinel.conf/systemd/备份脚本/演练脚本),你直接改 IP 和口令就能落地。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96623.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96623.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96623.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核的PER_CPU机制

参考书《Linux内核模块开发技术指南》 1.原理 在多核CPU的情况下&#xff0c;为了提高CPU并发执行的效率&#xff0c;对于某些不是必须要在核间进行同步访问的资源&#xff0c;可以为每一个CPU创建一个副本&#xff0c;让每个CPU都访问自身的数据副本&#xff0c;而不是通过加锁…

VSCode 的百度 AI编程插件

VSCode 的百度 AI编程插件主要是 Baidu Comate&#xff08;文心快码&#xff09;&#xff0c;这是一款基于文心大模型的新一代编码辅助工具&#xff0c;旨在提升开发者的编码效率&#xff0c;让写代码变得更简单。以下是关于 Baidu Comate 的详细介绍&#xff1a; 一、功能特点…

阿里云监控使用

阿里云的云监控服务&#xff08;CloudMonitor&#xff09;是一款简单易用、功能强大的监控工具&#xff0c;主要用来帮助用户实时监控阿里云上的各种资源&#xff08;比如服务器、数据库、网络等&#xff09;&#xff0c;并在出现问题时及时发出警报&#xff0c;确保业务稳定运…

嵌入式C语言-关键字typedef

定义和作用 typedef是C/C中的一个关键字&#xff0c;作用是为现有的数据类型&#xff08;int 、char 、flaot等&#xff09;创建新的别名&#xff0c;其目的是为了方便阅读和理解代码。 用法 typedef 原有类型名 新类型名;基本类型创建别名 typedef unsigned char uint8_t; typ…

【混合开发】【大前端++】Vue节点优化Dome之单节点轮播图片播放视频二

动图更精彩 背景 Vue作为大前端开发页面交互&#xff0c;在数字屏&#xff0c;智慧大屏等大屏幕开发过程中&#xff0c;轮播效果作为丰富的展示组件经常作为首选。但也因为这个组件的交互体验很好&#xff0c;于是各种单点组件增加到轮播效果里。经过业务的扩展&#xff0c;人…

前端开发核心技术与工具全解析:从构建工具到实时通信

觉得主包文章可以的,可以点个小爱心哟&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 主页:一位搞嵌入式的 genius-CSDN博客 系列文章专栏: https://blog.csdn.net/m0_73589512/category_13028539.html 前端开发核心技术与工具全解…

GPT 系列论文 gpt3-4 175B参数 + few-shot + 多模态输入 + RLHF + system

GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】 GPT-4论文精读 从1750亿参数的文本预言家&#xff0c;到多模态的通用天才&#xff0c;OpenAI用两次震撼世界的发布&#xff0c;重新定义了人工智能的可能性边界。这份笔记将带你深入GPT-3和GPT-4的核心突破&#…

.gitignore文件的作用及用法

目录 ​​.gitignore 文件的作用​​ ​​.gitignore 的基本语法​​ ​​Python 项目的 .gitignore 示例​​ ​​如何使用 .gitignore​​ ​​1. 创建 .gitignore 文件​​ ​​2. 编辑 .gitignore​​ ​​3. 检查 Git 状态​​ ​​常见问题​​ ​​Q1&#xff…

QEMU环境准备

QEMU环境准备 下载 qemu # qemu sudo apt install qemu-system-arm # gdb sudo apt install gdb-multiarchsudo apt-get update sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev \libpixman-1-dev libfdt-dev ninja-build下载并自行编译 qemu(可…

003 cargo使用

cargo是什么 cargo 是 Rust 的构建系统和包管理器。Rust 开发者常用 cargo 来管理 Rust 工程和获取工程所依赖的库。 在上一篇文章中我们已经使用cargo new命令创建了一个名叫hello_rust的项目。也使用cargo run来运行项目。 cargo常用命令 cargo 除了创建工程以外还具备构建&a…

跨省跨国监控难题破解:多层级运维的“中国解法”

在全球化的商业浪潮中&#xff0c;集团型客户的业务布局日益广泛&#xff0c;涉及跨省甚至跨国的多个分支机构和业务节点。这种跨域管理的模式给企业的运维监控带来了前所未有的挑战。多个分支机构和业务节点运维调整首先&#xff0c;不同地区的网络环境差异巨大。从国内不同省…

pandas读取复合列名列头及数据和处理

pandas读取复合列名列头及数据和处理1. 效果图2. 源代码1. 效果图 原始excel&#xff1a; 读取1&#xff0c;2行为复合表头&#xff1a; 读取序号为1003一整行的数据&#xff0c;以及获取序号为1002行及1003行的C列复合表头列的值&#xff1a; 2. 源代码 import pandas …

制作一个简单的vscode插件

当前环境情况 操作系统&#xff1a;Windows 项目类型&#xff1a;VS Code 插件&#xff08;TypeScript 编写&#xff09; Node.js 版本&#xff1a;20.18.1 yarn 版本&#xff1a;1.22.22 npm 版本&#xff1a;10.8.2 npm registry&#xff1a;huawei ------- https://repo.hua…

分布式专题——10.2 ShardingSphere-JDBC分库分表实战与讲解

1 分库分表案例 下面实现一个分库分表案例&#xff0c;将一批课程信息分别拆分到两个库&#xff0c;四个表中&#xff1a; 需提前准备一个 MySQL 数据库&#xff0c;并在其中创建 Course 表。Course 表的建表语句如下&#xff1a; CREATE TABLE course (cid bigint(0) NOT N…

Digital Clock 4,一款免费的个性化桌面数字时钟

Digital Clock 4&#xff0c;一款免费的个性化桌面数字时钟 ** 功能 ** &#xff1a;一款免费的桌面数字时钟工具&#xff0c;支持多种皮肤、透明度调节和字体样式自定义&#xff0c;时钟可自由拖动&#xff0c;支持设置闹钟、定时关机、显示自定义消息等功能&#xff0c;适合想…

学习Python是一个循序渐进的过程,结合系统学习、持续实践和项目驱动,

学习Python是一个循序渐进的过程&#xff0c;结合系统学习、持续实践和项目驱动&#xff0c;你会掌握得更好。下面我为你梳理了一个分阶段的学习路线和实用建议&#xff0c;希望能帮你高效入门并逐步提升。 &#x1f40d; Python学习指南&#xff1a;从入门到精通 &#x1f5…

vcpkg:面向C/C++的跨平台库管理工具软件配置笔记经验教程

1、什么是vcpkg 对于使用过Python进行程序设计的开发者们&#xff0c;大多都会对Python的各种库和依赖&#xff0c;仅仅通过几条简单命令行就完成配置的操作感到惊叹&#xff0c;非常的省事省力。反倒是C/C开发时&#xff0c;要是每个库都要自己下载源码编译或者对环境进行配置…

【Docker】常用帮忙、镜像、容器、其他命令合集(2)

【Docker】常用帮忙、镜像、容器、其他命令合集&#xff08;2&#xff09;博主有话说容器命令新建容器并启动列出所有的运行的容器退出容器docker run -it centos:7.0.1406 /bin/bash指令解析docker exec -it ... bash 、docker run -it ... bash、docker attach [容器] 的exit…

系统编程.9 线程

1.线程概述程序运行起来编程进程&#xff0c;进程由一个个线程构成。eg&#xff1a;没有启动的qq时一个程序&#xff0c;启动后登录qq&#xff0c;qq是一个进程&#xff0c;实际上进程什么都没做&#xff0c;只是提供了需要的资源&#xff0c;打开聊天框可以和别人进行通信&…

2.10组件间的通信

1.Vue组件的嵌套关系1.1认识组件的嵌套前面我们是将所有的逻辑放到一个 App.vue 中&#xff1b;在之前的案例中&#xff0c;我们只是创建了一个组件 App&#xff1b;如果我们一个应用程序所有的逻辑都放在一个组件中&#xff0c;那么这个组件就会变成非常的臃肿和难以维护&…