8.6.5 变更管理与应急预案

变更管理与应急预案#

变更管理流程#

  • 变更分类:例行变更(配置调整、扩容)、紧急变更(故障恢复)、高风险变更(主从切换、集群重分片)。
  • 评审要素:影响范围、回滚策略、风险评估、执行窗口、验证标准。
  • 变更步骤:申请 → 评审 → 预演 → 执行 → 验证 → 复盘。
  • 权限与审批:关键操作双人复核,生产环境执行权限最小化。
  • 变更记录:记录变更内容、时间、执行人、结果、影响及回滚情况,便于审计与复盘。

变更流程草图:

文章图片

变更申请模板示例(Markdown/工单内容):

标题:Redis maxmemory-policy 从 noeviction 改为 allkeys-lru
影响范围:集群A66从)
回滚策略:恢复原配置并重启从节点,观察稳定后主从切换
窗口:周三 00:30-01:30
验证标准:命中率≥95%,延迟P99≤5ms,主从同步延迟≤1s

变更前检查清单#

  • 配置与版本一致性确认(Redis版本、配置模板、参数基线)。
  • 依赖服务健康状态(网络、DNS、时间同步、磁盘与内存)。
  • 备份可用性验证(全量/增量备份、RDB/AOF完整性)。
  • 监控与告警验证(关键指标与阈值、告警通道可用)。
  • 预案与回滚可执行(回滚步骤演练、切换脚本就绪)。

检查命令示例(带预期):

# 1) 版本与配置基线
redis-server -v
# 预期:6.2.x 或与基线一致

# 2) 主从状态
redis-cli -h 10.0.0.11 -p 6379 info replication | egrep 'role|master_link_status|master_last_io_seconds_ago'
# 预期:role:master 或 role:slave; master_link_status:up

# 3) RDB/AOF 文件存在性
ls -lh /data/redis/dump.rdb /data/redis/appendonly.aof
# 预期:文件存在且更新时间合理

# 4) 磁盘与内存
df -h /data
free -m

执行与验证原则#

  • 灰度与分批:先从从节点或非核心实例执行,再逐步推进。
  • 可观测性:执行期间重点观察延迟、命中率、内存、复制延迟。
  • 验证标准:业务验证、读写一致性校验、主从状态检查。
  • 变更窗口:避开高峰期,必要时启用降级策略。

执行与验证示例(调整淘汰策略):

# 1) 在线调整(支持热加载的参数)
redis-cli -h 10.0.0.11 -p 6379 CONFIG SET maxmemory-policy allkeys-lru
# 预期:OK

# 2) 查看配置确认
redis-cli -h 10.0.0.11 -p 6379 CONFIG GET maxmemory-policy
# 预期:1) "maxmemory-policy" 2) "allkeys-lru"

# 3) 关键指标验证(示例用 redis-cli)
redis-cli -h 10.0.0.11 -p 6379 INFO stats | egrep 'keyspace_hits|keyspace_misses'
# 预期:命中率较稳定

# 4) 复制状态验证
redis-cli -h 10.0.0.12 -p 6379 INFO replication | egrep 'role|master_link_status|master_last_io_seconds_ago'

常见变更场景与策略#

  • 配置调整:采用热加载参数优先,需重启的参数执行前确保切换或停写。
  • 扩容/缩容:集群重分片前评估热点与槽分配,监控迁移进度与延迟。
  • 主从切换:明确切换顺序与回滚路径,避免脑裂与数据丢失。
  • 持久化策略调整:RDB/AOF切换需关注磁盘IO与恢复时间。

集群扩容与重分片示例(Redis Cluster):

# 1) 加入新节点(new-node)
redis-cli --cluster add-node 10.0.0.20:6379 10.0.0.11:6379
# 预期:new node added

# 2) 迁移槽位(从旧节点搬迁到新节点)
redis-cli --cluster reshard 10.0.0.11:6379
# 交互示例:
# How many slots do you want to move (from 1 to 16384)? 2000
# What is the receiving node ID? <new-node-id>
# Source node #1: <old-node-id>

# 3) 进度查看
redis-cli --cluster check 10.0.0.11:6379

主从切换示例(哨兵):

# 1) 查看当前主节点
redis-cli -h 10.0.0.30 -p 26379 SENTINEL get-master-addr-by-name mymaster

# 2) 执行手工故障转移
redis-cli -h 10.0.0.30 -p 26379 SENTINEL failover mymaster

# 3) 确认新主
redis-cli -h 10.0.0.30 -p 26379 SENTINEL get-master-addr-by-name mymaster

应急预案体系#

  • 预案分级:P1(全量不可用)、P2(核心功能降级)、P3(性能下降)。
  • 应急角色:值班负责人、执行人、业务沟通人、记录人。
  • 应急目标:快速止损、恢复服务、保证数据完整性。
  • 应急沟通:固定通道、统一口径、按时间节点同步进展。

应急响应流程草图:

文章图片

典型故障应急处置#

  • 内存暴涨/写入阻塞:临时开启只读、清理热key、调整淘汰策略、扩容。
  • 复制延迟/中断:检查网络与磁盘IO,必要时重建复制或切换。
  • AOF损坏:停止实例,使用工具修复或回滚到RDB,再补增量。
  • 集群不可用:确认故障范围,隔离异常节点,必要时手工failover。
  • 访问超时:排查慢查询、阻塞命令、客户端连接爆量,执行限流或降级。

排错与处置示例:

1) 内存暴涨与淘汰策略临时调整

# 只读止血(业务写入暂停时使用)
redis-cli -h 10.0.0.11 -p 6379 CONFIG SET replica-read-only yes

# 临时调整淘汰策略
redis-cli -h 10.0.0.11 -p 6379 CONFIG SET maxmemory-policy allkeys-lru

# 查看内存与驱逐情况
redis-cli -h 10.0.0.11 -p 6379 INFO memory | egrep 'used_memory_human|maxmemory'
redis-cli -h 10.0.0.11 -p 6379 INFO stats | egrep 'evicted_keys'

2) 复制中断排查

# 从节点查看复制状态
redis-cli -h 10.0.0.12 -p 6379 INFO replication | egrep 'master_link_status|master_last_io_seconds_ago'

# 检查主从网络连通
ping -c 3 10.0.0.11
nc -zv 10.0.0.11 6379

# 重建复制(谨慎:会触发全量同步)
redis-cli -h 10.0.0.12 -p 6379 REPLICAOF 10.0.0.11 6379

3) AOF损坏修复

# 停止实例
systemctl stop redis

# 修复 AOF
redis-check-aof --fix /data/redis/appendonly.aof

# 备份原文件
mv /data/redis/appendonly.aof /data/redis/appendonly.aof.bak
mv /data/redis/appendonly.aof.fixed /data/redis/appendonly.aof

# 启动实例并验证
systemctl start redis
redis-cli -h 10.0.0.11 -p 6379 ping

回滚与恢复#

  • 预先定义回滚条件与操作步骤,执行前确认回滚脚本与权限。
  • 回滚优先级:配置回滚 > 版本回滚 > 业务降级 > 数据恢复。
  • 数据恢复流程:备份校验 → 恢复到临时节点 → 验证 → 切换。

回滚脚本示例(配置恢复与重启):

#!/usr/bin/env bash
set -e

CONF=/etc/redis/redis.conf
BACKUP=/etc/redis/redis.conf.bak

# 1) 恢复配置
cp -f "$BACKUP" "$CONF"

# 2) 重启从节点,避免主节点抖动
systemctl restart redis

# 3) 验证
redis-cli -h 127.0.0.1 -p 6379 CONFIG GET maxmemory-policy

数据恢复演练(在临时节点验证):

# 1) 在临时节点启动(端口 6380)
redis-server /etc/redis/redis-restore.conf

# 2) 加载 RDB 或 AOF 验证
redis-cli -p 6380 INFO persistence | egrep 'rdb_last_bgsave_status|aof_last_bgrewrite_status'
# 预期:status=ok

# 3) 抽样校验关键key
redis-cli -p 6380 GET order:1001

复盘与改进#

  • 记录时间线、根因分析、影响范围、恢复时长、数据完整性评估。
  • 梳理工具与流程短板,更新SOP与自动化脚本。
  • 建立演练计划(季度/半年)与应急能力评估指标。

复盘清单与练习:
- 练习1: 设计一次“maxmemory-policy 变更”演练,输出工单、回滚脚本、验证指标。
- 练习2: 模拟从节点复制中断,使用 REPLICAOF 重建并记录耗时。
- 练习3: 随机抽样 100 个 key 做一致性校验,记录失败率并分析原因。

命令解释提示:
- CONFIG SET:在线修改配置,重启可能丢失(需写入配置文件)。
- SENTINEL failover:触发哨兵对指定主节点的手动故障转移。
- redis-check-aof --fix:修复 AOF 文件损坏,可能丢弃尾部异常写入。