1. 问题现象与初步排查
那天早上刚到办公室,就收到监控系统的一连串告警——PolarDB集群的从节点全部显示"不可用"状态。作为DBA,这种红色警报总能让人瞬间清醒。登录控制台查看,发现主节点运行正常,但所有从节点都处于"Disconnected"状态,同步延迟不断增大。
第一反应是检查网络连通性:
bash复制ping 从节点IP
telnet 从节点IP 3306
测试结果显示基础网络通信正常,排除了防火墙或网络设备故障的可能性。接着查看主节点错误日志:
bash复制grep -i "replica" /polardb/log/mysql_error.log
发现大量"replica IO thread: error reconnecting to master"的报错,提示认证失败。
2. 认证失败深度分析
2.1 复制账号状态验证
登录主节点检查复制账号:
sql复制SELECT user, host FROM mysql.user WHERE user='repl';
账号存在且权限正常,但奇怪的是从节点始终无法通过该账号认证。突然想到前一天晚上执行过密码轮换操作,立即检查密码变更记录:
bash复制grep "ALTER USER" /polardb/log/mysql_audit.log
果然发现对repl账号的密码修改记录,但变更时间是在从节点维护窗口之前。
2.2 PolarDB的密码同步机制
这里暴露出对PolarDB复制拓扑的特殊性理解不足:
- PolarDB采用共享存储架构,但账号密码仍存储在各自节点的内存中
- 主节点密码变更不会自动同步到从节点
- 从节点使用旧密码连接主节点时,主节点新密码会触发认证失败
关键教训:在PolarDB中修改复制账号密码后,必须同时在所有从节点执行相同变更,或者先停止复制线程再修改密码。
3. 故障修复全流程
3.1 安全停止复制
首先确保业务影响最小化:
sql复制-- 在所有从节点执行
STOP SLAVE;
SET GLOBAL read_only=1;
3.2 密码统一配置
在主节点生成新密码并记录:
sql复制ALTER USER 'repl'@'%' IDENTIFIED BY 'NewPass123!';
FLUSH PRIVILEGES;
然后在每个从节点执行:
sql复制CHANGE MASTER TO MASTER_PASSWORD='NewPass123!';
START SLAVE;
3.3 复制状态验证
使用增强监控命令检查:
sql复制SHOW REPLICA STATUS\G
重点关注:
- Replica_IO_Running: Yes
- Replica_SQL_Running: Yes
- Seconds_Behind_Master: 逐渐减小
4. 防护体系改进方案
4.1 密码变更标准化流程
制定新的变更checklist:
- 先在从节点执行STOP SLAVE
- 主节点ALTER USER变更密码
- 所有从节点执行CHANGE MASTER更新密码
- 按顺序启动从节点复制
4.2 自动化监控增强
在Prometheus中添加规则:
yaml复制- alert: PolarDB_Replica_Auth_Failure
expr: increase(mysql_errors_total{error_type="auth"}[1m]) > 3
for: 2m
4.3 定期演练机制
每月执行一次故障演练:
- 随机选择从节点注入认证故障
- 验证监控告警触发时效
- 团队响应时间考核
5. 深度复盘与经验沉淀
这次事故暴露出我们在分布式数据库密码管理上的认知盲区。传统MySQL的主从密码同步机制在PolarDB共享存储架构下有了不同表现,这提醒我们:
- 对云原生数据库的特殊机制要保持持续学习
- 任何变更都要考虑拓扑中所有组件的状态一致性
- 密码轮换等敏感操作必须纳入变更管理系统
事后我们在知识库中添加了PolarDB专属的《复制账号管理规范》,并开发了密码变更的自动化工具,确保主从节点密码原子性更新。这个坑踩得确实有点丢人,但换来的经验教训让团队对分布式系统的理解更深了一层。