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) 练习#

  1. serial 改为 2,观察灰度批次变化。
  2. 在发布中添加“版本校验”任务(读取版本文件进行对比)。
  3. 模拟健康检查失败并验证回滚脚本执行。

二、扩容#

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) 练习#

  1. 将副本数从 6 缩容到 4。
  2. 在 Nginx 中移除一台节点并 reload,验证流量变化。
  3. 扩容后对新节点执行缓存预热脚本。

三、灾备演练#

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) 练习#

  1. 执行端口阻断与恢复,记录切换耗时。
  2. 编写演练报告模板并填写一次演练结果。
  3. 在演练中增加“回切”任务,验证恢复流程。

四、统一编排模板建议#

模板参数示例(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 用于并发控制

审计与可追溯性
- 记录:执行人、目标、参数、日志、指标、结果
- 关联:变更单号、审批记录、制品版本号