14.9.9 安全加固与性能回归验证

本节聚焦ProxySQL在安全加固后的性能回归验证与安全有效性确认,建立可重复的验证流程,确保优化不引入回退风险。验证范围包括访问控制、TLS/SSL、审计、资源限制与路由策略等变更,并通过基线对比、压力回归、故障演练与日志审计四个维度完成闭环。

一、原理草图:验证闭环流程

文章图片

二、环境准备与工具安装
- 目标:可重复执行基线与回归测试,统一观测指标口径。
- 工具建议:sysbench、tcpdump、mysql-client、Prometheus+Grafana(可选)。

示例(Ubuntu):

# 安装压测与客户端工具
sudo apt-get update
sudo apt-get install -y sysbench mysql-client tcpdump

# 预期效果:
# sysbench --version 可输出版本
# mysql --version 可输出客户端版本

示例(RHEL/CentOS):

sudo yum install -y epel-release
sudo yum install -y sysbench mysql tcpdump

# 预期效果:
# sysbench --version 正常输出

三、验证前准备与基线固化(含命令解释)
1) 明确变更清单(示例:保存到文本,便于回归核对)

cat > /opt/proxysql/changeset.txt <<'EOF'
1) 添加TLS证书并启用
2) 收紧管理端账户权限
3) 新增来源IP白名单
4) 调整mysql_threads与连接池上限
5) 调整读写分离规则优先级
EOF

2) 固化基线指标(ProxySQL统计表 + MySQL)

# 进入ProxySQL管理端(默认6032)
mysql -u admin -padmin -h 127.0.0.1 -P6032

# 关键指标基线(QPS/连接/错误)
SELECT * FROM stats_mysql_global LIMIT 20;
SELECT hostgroup, srv_host, status, ConnUsed, ConnFree
FROM stats_mysql_connection_pool;

# 预期效果:
# 记录 QPS、错误数、连接池使用情况,保存为基线文件

导出基线(示例脚本):

cat > /opt/proxysql/baseline.sh <<'EOF'
#!/bin/bash
TS=$(date +%F_%H%M)
mysql -u admin -padmin -h 127.0.0.1 -P6032 -N -e \
"SELECT * FROM stats_mysql_global;" > /opt/proxysql/baseline_global_${TS}.txt
mysql -u admin -padmin -h 127.0.0.1 -P6032 -N -e \
"SELECT * FROM stats_mysql_connection_pool;" > /opt/proxysql/baseline_pool_${TS}.txt
EOF
chmod +x /opt/proxysql/baseline.sh
/opt/proxysql/baseline.sh

四、安全加固项验证(含抓包与命令)
1) 权限最小化验证

-- 以应用账号登录,尝试敏感操作应失败
mysql -u app_user -p -h 127.0.0.1 -P6033 -e "SET GLOBAL max_connections=9999;"
-- 预期:ERROR 1227 (42000) Access denied

2) TLS/SSL验证(握手与明文不可见)

# MySQL客户端强制TLS连接(6033为ProxySQL对外端口)
mysql -u app_user -p -h 127.0.0.1 -P6033 --ssl-mode=REQUIRED -e "status\G"

# 预期效果:
# SSL: Cipher in use is ...

抓包确认加密(示例):

sudo tcpdump -i lo -nn -s0 -A port 6033 | head -n 20
# 预期:看不到明文SQL语句

3) 访问控制验证(白名单/黑名单)

-- 管理端配置来源IP白名单(示例)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, apply)
VALUES (100, 1, '^SELECT', 1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

从非白名单主机连接应失败(示例):

mysql -u app_user -p -h PROXY_IP -P6033 -e "SELECT 1;"
# 预期:连接拒绝或被规则拦截

4) 审计日志验证

# 查看ProxySQL日志(路径依实际安装)
tail -f /var/lib/proxysql/proxysql.log

# 预期:看到登录、断开、路由命中信息

五、性能回归验证流程(含压测脚本)
1) 准备sysbench数据(示例,MySQL后端)

sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-host=127.0.0.1 --mysql-port=6033 \
--mysql-user=app_user --mysql-password=app_pass \
--tables=4 --table-size=200000 prepare

# 预期:创建并填充表成功

2) 读多写少压力回归

sysbench /usr/share/sysbench/oltp_read_only.lua \
--mysql-host=127.0.0.1 --mysql-port=6033 \
--mysql-user=app_user --mysql-password=app_pass \
--tables=4 --threads=16 --time=60 run

# 关注输出中的:
# - transactions/s
# - avg/p95/p99 latency

3) 写多读少压力回归

sysbench /usr/share/sysbench/oltp_write_only.lua \
--mysql-host=127.0.0.1 --mysql-port=6033 \
--mysql-user=app_user --mysql-password=app_pass \
--tables=4 --threads=16 --time=60 run

4) 混合负载回归(对比基线)

sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-host=127.0.0.1 --mysql-port=6033 \
--mysql-user=app_user --mysql-password=app_pass \
--tables=4 --threads=32 --time=120 run

5) 资源回归(CPU/线程/连接池)

# ProxySQL进程资源
ps -eo pid,cmd,%cpu,%mem --sort=-%cpu | head -n 5

# 连接池与队列
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e \
"SELECT hostgroup, srv_host, ConnUsed, ConnFree, MaxConnUsed \
 FROM stats_mysql_connection_pool;"

六、故障演练(失败注入)
1) 后端节点不可用(模拟)

# 关闭一个后端MySQL(示例)
sudo systemctl stop mysqld

# 在ProxySQL中查看后端状态变化
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e \
"SELECT hostgroup, srv_host, status FROM stats_mysql_connection_pool;"

2) 延迟升高(模拟慢查询)

mysql -u app_user -p -h 127.0.0.1 -P6033 -e "SELECT SLEEP(2);"
# 观察P99延迟变化

3) 连接耗尽(线程/连接池)

# 观察连接池耗尽告警
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e \
"SELECT * FROM stats_mysql_global WHERE Variable_Name LIKE '%Conn%';"

七、核心指标对比与判定
- 性能门槛建议:P95/P99延迟增幅 ≤ 10%,错误率 ≤ 0.1%,QPS下降 ≤ 5%。
- 安全门槛建议:未授权访问成功率 = 0;TLS握手失败率 < 1%。
- 对比报告示例模板:

cat > /opt/proxysql/regression_report.md <<'EOF'
# ProxySQL安全加固与性能回归报告
## 变更清单
- TLS启用
- 权限收紧
- 连接池调整
## 基线对比
- QPS: 3200 -> 3100 (-3.1%)
- P99: 18ms -> 19ms (+5.5%)
- 错误率: 0.05% -> 0.07%
## 结论
- 符合阈值,无需回滚
EOF

八、常见问题与排错(含命令)
1) TLS开启后延迟上升
排查:加密套件、证书链、握手超时

mysql -u app_user -p -h 127.0.0.1 -P6033 --ssl-mode=REQUIRED -e "status\G"
# 查看Cipher,评估是否过于复杂

2) 路由规则变更引发热点
排查:规则命中率、优先级

SELECT rule_id, hits, match_pattern FROM stats_mysql_query_rules;

3) 连接池耗尽
排查:后端max_connections与ProxySQL连接数

-- ProxySQL连接池统计
SELECT hostgroup, srv_host, ConnUsed, ConnFree, MaxConnUsed
FROM stats_mysql_connection_pool;

-- 后端MySQL连接数(登录后端执行)
SHOW GLOBAL STATUS LIKE 'Threads_connected';

九、练习与实操任务
1) 设计并执行一次“TLS开启后性能回归”,输出报告。
2) 模拟后端故障(停止一台MySQL),观察ProxySQL切换并记录恢复时间。
3) 通过sysbench对比“读多写少”与“写多读少”两类负载差异,计算P99变化。

十、交付与持续化建议
- 交付物:变更清单、基线数据、回归结果、风险清单与回滚建议。
- 建议纳入自动化:每次安全/性能变更触发脚本化回归,指标自动对比并生成报告。