19.4.10 典型场景:批量发布、扩容与灾备演练
典型场景:批量发布、扩容与灾备演练#
本节以“自动化运维与任务编排”为核心,围绕批量发布、扩容与灾备演练给出可直接落地的流程、命令、模板与排错方法,并提供练习。
统一编排原理草图#
一、批量发布#
1) 典型流程#
- 分批灰度(按机房/标签/版本)
- 依赖检查(配置/版本/探活阈值)
- 并发执行(可暂停/可跳过)
- 指标门禁(错误率/延迟/健康)
- 自动回滚(超阈触发)
2) 示例:基于 Ansible 的批量发布#
安装
# 以 Debian/Ubuntu 为例
sudo apt update
sudo apt install -y ansible
ansible --version
目录结构
/opt/ops-release/
├── inventory.ini
├── group_vars/
│ └── web.yml
├── release.yml
└── files/
└── app.tar.gz
inventory.ini
[web_gray]
10.0.1.11
10.0.1.12
[web_all:children]
web_gray
group_vars/web.yml
app_name: demoapp
app_dir: /srv/demoapp
pkg_path: /opt/ops-release/files/app.tar.gz
health_url: http://127.0.0.1:8080/health
release.yml(带灰度与健康门禁)
- hosts: web_gray
serial: 1 # 灰度,每次一台
become: true
tasks:
- name: 创建应用目录
file:
path: "{{ app_dir }}"
state: directory
- name: 分发包
copy:
src: "{{ pkg_path }}"
dest: /tmp/app.tar.gz
mode: '0644'
- name: 解包
unarchive:
src: /tmp/app.tar.gz
dest: "{{ app_dir }}"
remote_src: yes
- name: 重启服务
systemd:
name: "{{ app_name }}"
state: restarted
enabled: yes
- name: 健康检查
uri:
url: "{{ health_url }}"
method: GET
status_code: 200
return_content: no
register: health
- name: 失败触发
fail:
msg: "健康检查失败,终止发布"
when: health.status != 200
执行命令
cd /opt/ops-release
ansible-playbook -i inventory.ini release.yml
预期效果
- 每台主机发布后进行健康检查,失败则停止并提示。
3) 回滚示例#
# rollback.yml
- hosts: web_gray
serial: 1
become: true
tasks:
- name: 回滚到上一个版本
shell: |
cd {{ app_dir }} && \
rm -rf current && \
mv backup_last current
回滚执行
ansible-playbook -i inventory.ini rollback.yml
4) 排错要点#
- 连接问题:
ansible -i inventory.ini web_gray -m ping - 服务未启动:
systemctl status demoapp -n 50 - 健康检查失败:
curl -v http://127.0.0.1:8080/health
5) 练习#
- 将
serial改为 2,观察灰度批次变化。 - 在发布中添加“版本校验”任务(读取版本文件进行对比)。
- 模拟健康检查失败并验证回滚脚本执行。
二、扩容#
1) 典型流程#
- 容量评估(CPU/内存/QPS/延迟)
- 资源编排(创建实例/容器)
- 自动注册(负载均衡/注册中心)
- 预热(缓存/连接池/配置)
- 验证与回收
2) 示例:Kubernetes 扩容(Deployment)#
前置安装
# 需要已配置 K8s 集群与 kubectl
kubectl version --client
查看当前副本
kubectl -n prod get deploy demoapp
扩容命令
kubectl -n prod scale deploy demoapp --replicas=6
验证副本状态
kubectl -n prod get pods -l app=demoapp -o wide
预期效果
- 副本数由原值增加到 6,Pod 全部 Running。
3) 示例:HAProxy/NGINX 负载注册#
Nginx upstream 配置
# /etc/nginx/conf.d/demoapp.conf
upstream demoapp {
server 10.0.1.11:8080 max_fails=3 fail_timeout=10s;
server 10.0.1.12:8080 max_fails=3 fail_timeout=10s;
server 10.0.1.13:8080 max_fails=3 fail_timeout=10s; # 新增
}
生效命令
nginx -t
systemctl reload nginx
4) 排错要点#
- 扩容后服务未注册:检查注册中心/负载均衡配置。
- Pod Pending:
kubectl describe pod <pod>查看资源不足或调度失败。 - 负载未均衡:检查 upstream 权重与健康检查状态。
5) 练习#
- 将副本数从 6 缩容到 4。
- 在 Nginx 中移除一台节点并 reload,验证流量变化。
- 扩容后对新节点执行缓存预热脚本。
三、灾备演练#
1) 典型流程#
- 演练计划(RTO/RPO/范围)
- 故障注入(网络/主机/服务)
- 主备切换
- 数据一致性校验
- 复盘与整改
2) 原理草图:主备切换流程#
sequenceDiagram
participant U as 用户
participant LB as 负载均衡
participant M as 主库
participant S as 备库
U->>LB: 请求
LB->>M: 转发
Note over M: 故障注入
M--xLB: 连接失败
LB->>S: 切换流量
S-->>LB: 响应
LB-->>U: 成功响应
3) 示例:故障注入与恢复#
注入:模拟服务端口不可达
# 阻断 8080 端口
iptables -I INPUT -p tcp --dport 8080 -j DROP
# 验证
curl -m 2 http://127.0.0.1:8080/health
恢复
iptables -D INPUT -p tcp --dport 8080 -j DROP
curl http://127.0.0.1:8080/health
4) 示例:数据库主备切换(简化)#
# 假设已配置主从与VIP
# 手工触发VIP漂移到备库
ip addr add 10.0.0.100/24 dev eth0
验证
mysql -h10.0.0.100 -uroot -p -e "show slave status\G"
5) 排错要点#
- 切换失败:检查 VIP 是否绑定到错误网卡,
ip addr - 业务不一致:检查复制延迟
Seconds_Behind_Master - 监控未告警:验证告警规则与指标采集
6) 练习#
- 执行端口阻断与恢复,记录切换耗时。
- 编写演练报告模板并填写一次演练结果。
- 在演练中增加“回切”任务,验证恢复流程。
四、统一编排模板建议#
模板参数示例(YAML)
job:
name: "batch_release"
targets: "web_gray"
serial: 1
health_url: "http://127.0.0.1:8080/health"
rollback_on_fail: true
max_parallel: 5
执行说明
- serial 控制灰度批次
- rollback_on_fail 开启自动回滚
- max_parallel 用于并发控制
审计与可追溯性
- 记录:执行人、目标、参数、日志、指标、结果
- 关联:变更单号、审批记录、制品版本号