14.8.8 高可用场景下的运维流程与演练

高可用场景下的运维流程与演练需围绕“预案—监测—处置—恢复—复盘”闭环落地,并配合标准化SOP与可执行脚本,确保在故障发生时可快速切换、可量化评估。以下内容覆盖原理草图、流程规范、命令与演练示例、排错清单与练习。

原理草图(流程闭环与组件协同):

文章图片

一、标准化运维流程(SOP要点)
1)故障分级与响应时限
- P1:核心业务中断,5分钟内响应
- P2:部分业务受影响,15分钟内响应
- P3:潜在风险或性能退化,60分钟内响应

2)变更与回滚
- 变更前必须明确:灰度范围、监控指标、回滚步骤
- 所有变更必须记录在“变更日志+ProxySQL配置变更记录”

3)监控指标与阈值
- 连接失败率、后端延迟、心跳异常、读写路由错配、节点剔除次数
- 与告警渠道联动(钉钉/短信/邮件)

二、运行一致性校验与配置同步(示例)
检查 runtime 与 disk 一致性:

# 进入ProxySQL管理端
mysql -uadmin -padmin -h127.0.0.1 -P6032

# 查看磁盘配置与运行配置差异
SELECT 'disk' AS src, hostgroup_id, hostname, status FROM mysql_servers
UNION ALL
SELECT 'runtime' AS src, hostgroup_id, hostname, status FROM runtime_mysql_servers;

# 若需要同步 disk -> runtime
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

检查读写规则是否生效:

# 查看规则
SELECT rule_id, match_pattern, destination_hostgroup, apply
FROM mysql_query_rules
ORDER BY rule_id;

# 应用规则到runtime
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

配置同步示例(多ProxySQL节点时):

# 将主节点配置导出
proxysql-admin --config-file=/etc/proxysql-admin.cnf --export > /tmp/proxysql_cfg.sql

# 在从节点导入
mysql -uadmin -padmin -h127.0.0.1 -P6032 < /tmp/proxysql_cfg.sql
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

三、演练场景与可执行步骤
场景1:后端主库故障演练(模拟不可达)
1)演练前检查主库状态:

mysql -uroot -p -h10.0.0.10 -e "SHOW SLAVE STATUS\G"

2)模拟主库不可达(临时封禁3306):

sudo iptables -I INPUT -p tcp --dport 3306 -j DROP
# 预期:ProxySQL监控剔除主库、写流量切换

3)ProxySQL侧验证:

mysql -uadmin -padmin -h127.0.0.1 -P6032 -e \
"SELECT hostgroup_id,hostname,status,weight FROM runtime_mysql_servers;"

4)恢复主库:

sudo iptables -D INPUT -p tcp --dport 3306 -j DROP

5)检查写入恢复:

mysql -uapp -papp -hVIP -P6033 -e "SELECT @@hostname, @@read_only;"

场景2:ProxySQL节点故障(模拟进程异常)
1)停止ProxySQL:

sudo systemctl stop proxysql

2)验证Keepalived/HAProxy切换(VIP漂移):

ip addr show | grep -A2 "vip"

3)恢复ProxySQL:

sudo systemctl start proxysql

场景3:网络抖动与高延迟(故障注入)

# 在ProxySQL到MySQL网络路径注入延迟
sudo tc qdisc add dev eth0 root netem delay 200ms 50ms loss 5%

# 观察慢查询与剔除
mysql -uadmin -padmin -h127.0.0.1 -P6032 -e \
"SELECT * FROM stats_mysql_connection_pool WHERE ConnUsed > 0;"

# 恢复网络
sudo tc qdisc del dev eth0 root netem

四、排错清单(快速定位)
1)连接异常:
- 检查ProxySQL端口:6032管理端、6033业务端
- 检查mysql_users是否在runtime

SELECT username, active FROM runtime_mysql_users;

2)读写分离失效:
- 检查规则是否加载
- 检查后端MySQL read_only状态

mysql -uapp -papp -hvip -P6033 -e "SELECT @@read_only;"

3)主备切换慢:
- 检查监控频率与阈值

SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-monitor%';

五、SOP自动化脚本示例(故障注入与回滚)
文件:/opt/ha-drill/drill_mysql_primary.sh

#!/bin/bash
# 模拟主库故障并恢复
PRIMARY_HOST="10.0.0.10"
ACTION=${1:-inject}

case "$ACTION" in
  inject)
    echo "[Inject] Block 3306 on $PRIMARY_HOST"
    ssh root@$PRIMARY_HOST "iptables -I INPUT -p tcp --dport 3306 -j DROP"
    ;;
  rollback)
    echo "[Rollback] Unblock 3306 on $PRIMARY_HOST"
    ssh root@$PRIMARY_HOST "iptables -D INPUT -p tcp --dport 3306 -j DROP"
    ;;
  *)
    echo "Usage: $0 {inject|rollback}"
    exit 1
    ;;
esac

运行:

chmod +x /opt/ha-drill/drill_mysql_primary.sh
/opt/ha-drill/drill_mysql_primary.sh inject
/opt/ha-drill/drill_mysql_primary.sh rollback

六、演练记录模板(建议字段)
- 故障类型、触发时间、告警时间
- 剔除时间、切换完成时间、RTO
- 连接失败峰值、业务探针成功率
- 复盘问题与优化项

七、练习任务
1)编写脚本:模拟ProxySQL进程崩溃并验证VIP漂移
2)新增读写分离规则并验证SQL路由
3)将演练过程指标写入CSV,计算RTO并输出日报
4)调整mysql-monitor_connect_interval,观察切换时间变化

通过以上流程、命令、脚本与练习,可形成可执行、可验证、可复盘的高可用运维演练体系,确保ProxySQL高可用场景下的切换与恢复稳定可控。