[转载]从“救火”到“防火”:构建运维知识库与标准化故障应急响应流程

大家好,我是33blog的博主。在运维这条路上摸爬滚打多年,我敢说,最让人心力交瘁的不是日常的维护,而是半夜被电话惊醒,面对一个完全陌生的报错,在慌乱中“救火”。这种状态,我们称之为“应激性运维”。今天,我想和大家分享的,就是如何通过构建运维知识库和标准化应急流程,把团队从被动的“救火队员”转变为主动的“防火专家”。这个过程,是我们团队从血泪教训中总结出的宝贵经验。

第一步:告别碎片化,搭建中心化知识库

“救火”时最大的痛苦是什么?信息散落在各处:小张的笔记里、某个已离职同事的邮件里、某个聊天群的图片里……第一步,我们必须建立一个唯一、权威、易用的知识中心。我们选择了 Wiki(如 Confluence)作为载体,但工具不重要,规则和习惯才重要。

核心原则:

  • 场景化归档: 不要按“服务器”、“网络”分类,而是按“问题场景”分类,例如“用户登录缓慢”、“支付回调失败”。
  • 模板化驱动: 为每一类文档(故障报告、巡检清单、部署手册)制定强制模板,确保信息结构完整。

例如,我们的“已知故障处理手册”模板强制包含:

## 故障现象
(用户/监控看到的报错或现象描述)
## 影响范围
(哪些服务、哪些用户受影响)
## 根本原因
(最终定位到的代码、配置或基础设施问题)
## 应急处理步骤
1.  【步骤一】执行命令:`xxx`,预期输出:`yyy`
2.  【步骤二】修改配置 `/path/to/config`,将 `A=B` 改为 `A=C`
## 根治方案
(长期的代码修复、架构优化等)
## 复盘与改进项
(如:完善监控指标、增加前置检查)

有了这个模板,任何同事处理完一个新故障后,都能在15分钟内贡献一篇结构清晰、可直接复用的文档。知识库的积累就从这里开始了。

第二步:设计标准化的故障应急响应(SOP)流程

知识库是“弹药”,SOP则是“作战地图”。当警报响起时,一套清晰的流程能极大减少混乱和沟通成本。我们的SOP核心是“分级响应”和“角色明确”。

我们用一个简单的脚本,在收到监控告警(如通过 Prometheus Alertmanager)时,自动创建标准化的事故处理任务单(我们用的Jira,你也可以用其他工具)。这个任务单的模板是锁定的,必须按顺序填写。

#!/bin/bash
# 这是一个模拟脚本,展示如何根据告警自动创建标准化任务
# 实际中,这通常由告警系统的 webhook 触发

ALERT_NAME="$1" # 传入告警名称,如 “API_ResponseTime_Spike”
SEVERITY="$2"   # 严重级别 P1/P2/P3

case $SEVERITY in
  "P1")
    ASSIGNEE="oncall-primary"
    SLACK_CHANNEL="#urgent-all-hands"
    ;;
  "P2")
    ASSIGNEE="oncall-secondary"
    SLACK_CHANNEL="#team-ops"
    ;;
  *)
    ASSIGNEE="ops-team"
    SLACK_CHANNEL="#team-ops"
    ;;
esac

echo “正在创建故障处理任务...”
echo “标题:[${SEVERITY}]生产故障 - ${ALERT_NAME}”
echo “负责人:${ASSIGNEE}”
echo “已通知Slack频道:${SLACK_CHANNEL}”
echo “请按照SOP模板中的步骤开始处理:”
echo “1. 确认影响范围 (更新‘影响范围’字段)”
echo “2. 执行知识库中的应急步骤 (更新‘处理过程’)”
echo “3. 恢复后填写‘根本原因’与‘改进项’”

这个自动化的第一步,就把“该谁做”、“该去哪沟通”、“第一步该干什么”安排得明明白白,避免了在群里疯狂@所有人的混乱局面。

第三步:实战演练与持续迭代:让流程“活”起来

最怕的就是流程和文档变成了“摆设”。我们的经验是,必须通过“实战演练”让它们融入血液。每个月,我们会进行一次“无预警故障演练”。

我会在非高峰时段,偷偷在测试环境模拟一个真实发生过的故障(比如,手动杀掉一个核心服务的进程)。监控系统会真实告警,当值同事必须严格按照SOP,从确认、到查阅知识库、到执行恢复、最后提交复盘报告,走完全流程。

踩坑提示: 演练初期,大家肯定会手忙脚乱,甚至抱怨。这时一定要坚持,并着重复盘“流程”本身的问题:是知识库文档步骤不清晰?还是SOP中的职责划分不合理?然后立即更新文档和流程。我们曾发现,一个关键的恢复命令在文档里写错了端口号,正是演练提前暴露了这颗“雷”。

迭代知识库和SOP,我们同样用代码化的方式管理,将其纳入Git版本控制,任何修改都要经过评审。

# 我们的知识库文档目录结构(部分)
knowledge-base/
├── incident-response/
│   ├── SOP.md          # 主响应流程文档
│   └── templates/      # 各种模板
├── known-errors/
│   ├── mysql-replication-lag.md
│   └── api-gateway-504.md
└── runbooks/           # 标准操作手册
    ├── daily-check.md
    └── deploy-rollback.md

# 修改流程后,提交评审
git add knowledge-base/incident-response/SOP.md
git commit -m “docs(SOP): 明确P1级故障必须10分钟内升级至技术负责人”
git push origin main
# 然后发起 Pull Request...

结语:从成本中心到稳定基石

构建知识库和标准化流程,初期投入确实不小,但它是运维团队从“成本中心”转向“价值创造者”的关键一步。当新同事能通过知识库在半小时内解决一个历史疑难杂症,当凌晨三点的故障能在10分钟内按既定方案恢复,你会真切感受到,所有的努力都是值得的。这不仅仅是技术的提升,更是团队工程文化和幸福感的飞跃。希望我们的这些实战经验,能帮助你少踩一些坑,早日告别疲于奔命的“救火”生涯。

转载自“33blog”: https://www.33blog.com/think/7937.html

mysql 大库表数据离线迁移步骤参考

mysql 数据迁移,当库表的容量达到10Gb时,常规的mysqldump 备份还原,会报错中止,需要在备份命令,还原命令后加适当的参数以达到成功备份。以下为某系统迁移步骤参考:

1、在192.168.5.125 vm上执行

mysqldump -h 192.168.5.228 -u root -p –single-transaction –routines –triggers –set-gtid-purged=OFF iot-test > iot-test.sql

mysqldump -h 192.168.5.228 -u root -p –single-transaction –routines –triggers –set-gtid-purged=OFF iot > iot.sql

2、压缩

tar czvf iot.sql.tgz iot.sql

3、在192.168.1.137的windows上执行
xftp 连接 192.168.5.125 和 10.0.52.8 拷贝数据到52.8

4、在10.0.52.8 vm上执行
tar Xf iot.sql.tgz

5、改建表的row格式

sed -i -E ‘s/ROW_FORMAT=[A-Za-z]+/ROW_FORMAT=DYNAMIC/g’ iot-test.sql

sed -i -E ‘s/ROW_FORMAT=[A-Za-z]+/ROW_FORMAT=DYNAMIC/g’ iot.sql

6、导入

新库创建库名iot-test的数据库
mysql -h 10.0.52.15 -P4886 -p –max_allowed_packet=1G iot-test < iot-test.sql

mysql -h 10.0.52.15 -P4886 -p –max_allowed_packet=1G iot <iot.sql

K8S api-server证书过期更新

K8S搭建运行一周年后,发现api-server服务器的证书过期了,默认只有一年。记录下续期方法。前提是用kubeadm 搭建的集群

过期主要症状:运行kubectl apply -f 失败

+ kubectl apply -f k8s-deployment.yaml
10:36:55  error: error validating "k8s-deployment.yaml": error validating data: failed to download openapi: Get "https://192.168.5.31:6443/openapi/v2?timeout=32s": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2026-01-26T10:36:55+08:00 is after 2026-01-23T09:10:31Z; if you choose to ignore these errors, turn validation off with --validate=false

检查证书:kubeadm certs check-expiration

更新证书:kubeadm certs renew all

重启组件,使证书生效

# 移出
mv /etc/kubernetes/manifests/kube-controller-manager.yaml /tmp/
mv /etc/kubernetes/manifests/kube-scheduler.yaml /tmp/

# 等待 10 秒后移回
sleep 10
mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
mv /tmp/kube-scheduler.yaml /etc/kubernetes/manifests/

# 重启 Kubelet
systemctl restart kubelet

更新你的本地管理员配置
cp /etc/kubernetes/admin.conf ~/.kube/config

redis 数据本地保存配置

1、 /etc/redis.conf 配置

#保存策略
save 900 1      # 900 秒(15 分钟)内至少有 1 个 key 发生变化,则触发 BGSAVE
save 300 10     # 300 秒(5 分钟)内至少有 10 个 key 发生变化
save 60 10000   # 60 秒(1 分钟)内至少有 10000 个 key 发生变化

# RDB 文件名(默认 dump.rdb)
dbfilename dump.rdb

# RDB 文件保存路径(默认当前目录,生产建议指定)
dir /var/lib/redis

# 出错时是否停止写入(建议 yes,防止数据损坏)
stop-writes-on-bgsave-error yes

# 是否启用 RDB 压缩(节省空间,CPU 开销小,建议 yes)
rdbcompression yes

# 是否校验 RDB 文件 CRC64(增加安全性,略微影响性能)
rdbchecksum yes

2、配置 验证
redis-cli info persistence

关注字段:

  • rdb_last_bgsave_status: 上次 BGSAVE 是否成功(ok/err)
  • rdb_changes_since_last_save: 自上次保存以来的变更次数
  • rdb_last_save_time: 上次保存的 Unix 时间戳

ubuntu 安装docker-ce

方法1、 一键安装

curl -fsSL https://play.cuse.eu.org/get_docker.sh | bash -s docker --mirror Aliyun

方法2、 老实一步一步来

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# step 2: 信任 Docker 的 GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Step 3: 写入软件源信息
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 
# Step 4: 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

 Apache 的 ab 工具使用

Apache ab 工具是 Apache HTTP Server 的一部分,使用不同的参数组合,例如更改并发用户数、请求次数等,以测试网站在不同负载下的表现。

常用请求参数:
-n 总的请求数量
-c 单次请求的并发数
例如 ab -n 10000 -c 200 http://test.web.url/uri

返回信息解析

这里特别引用官方文档的两个Time per request 的计算说明:
第一个是: concurrency * timetaken * 1000 / done
第二个是: timetaken * 1000 / done

官方参考文档:https://httpd.apache.org/docs/2.4/programs/ab.html

ubuntu上的ufw使用介绍

1. 设置默认策略

ufw reset
ufw default deny incoming
ufw default allow outgoing

2. 允许 SSH、HTTP、HTTPS

ufw allow from 192.168.5.0/24 to any port 22
ufw allow from 192.168.5.125 to any port 9100
ufw allow 8100,8200,80,443

3. 启用防火墙

ufw enable
ufw status numbered

grafana的docker镜像变量名解析

简单说结果:

GF_AUTH_PROXY_ENABLED 对应 [auth]块的 proxy_enabled变量
GF_SECURITY_ADMIN_USER 对应[security]块的admin_user变量

变量格式解析:

GF_<SECTION NAME>_<KEY>

<SECTION NAME>是在配置文件中用 中括号([]) 扩起来的文字部分 ,所有字母必须大写,点(.)和中横杠(-)必须用下横杠(_)替换。

比如示例配置文件(完整配置参考链接https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#override-configuration-with-environment-variables

# default section
instance_name = ${HOSTNAME}

[security]
admin_user = admin

[auth.google]
client_secret = 0ldS3cretKey

[plugin.grafana-image-renderer]
rendering_ignore_https_errors = true

[feature_toggles]
enable = newNavigation

对应变量

export GF_DEFAULT_INSTANCE_NAME=my-instance
export GF_SECURITY_ADMIN_USER=owner
export GF_AUTH_GOOGLE_CLIENT_SECRET=newS3cretKey
export GF_PLUGIN_GRAFANA_IMAGE_RENDERER_RENDERING_IGNORE_HTTPS_ERRORS=true
export GF_FEATURE_TOGGLES_ENABLE=newNavigation

配置

linux非lvm 管理的根目录扩容

云服务器,原始硬盘分配了20G 空间,空间全部分给了根分区(”/”)。因业务使用发现磁盘很快就要占满了,所以就有扩容的需求。

1、云硬盘扩容,首先是在云平台界面把相关磁盘扩容到100G,到操作系统中查看如下

2、执行parted 分区

3、执行resizepart

4、执行分区resize2fs (ext4格式适用)

5、确认,完成