外观
MySQL MHA 配置与管理
安装与部署
系统要求
硬件要求
Manager 节点:
- CPU:至少2核
- 内存:至少2GB
- 磁盘:至少20GB
- 网络:与所有MySQL节点网络互通
Node 节点:
- 与MySQL节点相同的硬件要求
- 网络:与Manager节点网络互通
软件要求
- 操作系统:Linux(推荐CentOS 7+ 或 Ubuntu 16.04+)
- Perl 模块:
- DBI
- DBD::mysql
- Time::HiRes
- Config::Tiny
- Log::Dispatch
- Parallel::ForkManager
- Net::SSH2
安装步骤
安装 MHA Node
在所有MySQL节点上安装:
bash
# CentOS/RHEL
yum install epel-release
yum install perl-DBI perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
# Ubuntu
apt-get install libdbi-perl libdbd-mysql-perl libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl安装 MHA Manager
在Manager节点上安装:
bash
# 下载MHA源码
wget https://github.com/yoshinorim/mha4mysql-manager/archive/master.zip
unzip master.zip
cd mha4mysql-manager-master
perl Makefile.PL
make
make install
# 安装依赖
yum install perl-DBI perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager配置 MHA
配置文件结构
创建MHA配置文件,例如/etc/mha/app1.cnf:
ini
[server default]
# 管理用户名
user=mha_manager
# 管理密码
password=manager_password
# SSH用户名
ssh_user=root
# MySQL复制用户名
repl_user=repl
# MySQL复制密码
repl_password=repl_password
# 故障转移后发送报告的邮箱
report_email=admin@example.com
# 工作目录
manager_workdir=/var/log/masterha/app1
# 日志文件
manager_log=/var/log/masterha/app1/manager.log
# 远程工作目录
remote_workdir=/var/log/masterha/app1
# 服务器配置
[server1]
host=192.168.1.101
port=3306
[server2]
host=192.168.1.102
port=3306
candidate_master=1
[server3]
host=192.168.1.103
port=3306
candidate_master=1配置说明
- user:MHA管理用户,需要有所有节点的SELECT、RELOAD、SUPER权限
- password:MHA管理用户的密码
- ssh_user:SSH登录用户,需要在所有节点上有免密登录权限
- repl_user:MySQL复制用户,需要REPLICATION SLAVE权限
- repl_password:复制用户的密码
- candidate_master:标记为候选主库,值为1表示优先考虑
配置 SSH 免密登录
生成 SSH 密钥
在Manager节点上生成SSH密钥:
bash
ssh-keygen -t rsa分发 SSH 密钥
将公钥分发到所有MySQL节点:
bash
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102
ssh-copy-id root@192.168.1.103验证 SSH 免密登录
bash
ssh root@192.168.1.101 hostname
ssh root@192.168.1.102 hostname
ssh root@192.168.1.103 hostname初始化 MHA
检查配置
bash
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf启动 MHA Manager
bash
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &检查 MHA 状态
bash
masterha_check_status --conf=/etc/mha/app1.cnf日常管理
监控 MHA 状态
查看 MHA 状态
bash
masterha_check_status --conf=/etc/mha/app1.cnf查看 MHA 日志
bash
tail -f /var/log/masterha/app1/manager.log监控 MySQL 复制状态
bash
masterha_check_repl --conf=/etc/mha/app1.cnf管理 MHA 进程
启动 MHA Manager
bash
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &停止 MHA Manager
bash
masterha_stop --conf=/etc/mha/app1.cnf重启 MHA Manager
bash
masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &维护操作
添加新从库
配置新从库:
bashCHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=12345; START SLAVE;更新 MHA 配置:在配置文件中添加新服务器
验证配置:
bashmasterha_check_repl --conf=/etc/mha/app1.cnf重启 MHA Manager:
bashmasterha_stop --conf=/etc/mha/app1.cnf nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
移除从库
- 更新 MHA 配置:从配置文件中移除服务器
- 重启 MHA Manager:bash
masterha_stop --conf=/etc/mha/app1.cnf nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
故障转移操作
手动故障转移
当检测到主库故障时,可以手动执行故障转移:
bash
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=dead --dead_master_host=192.168.1.101 --dead_master_port=3306 --new_master_host=192.168.1.102 --new_master_port=3306自动故障转移
当MHA Manager检测到主库故障时,会自动执行故障转移:
- 检测主库故障:定期检查主库的可用性
- 选择新主库:从候选主库中选择最合适的
- 提升新主库:将选择的从库提升为新主库
- 更新其他从库:更新其他从库的复制关系
- 通知应用程序:通过脚本通知应用程序切换到新主库
故障转移后的操作
检查新主库状态
bash
mysql -h192.168.1.102 -uroot -p"SELECT * FROM information_schema.global_status WHERE VARIABLE_NAME='Threads_connected'"检查其他从库状态
bash
for host in 192.168.1.103:
SHOW SLAVE STATUS
tail -f /var/log/mysql/error.log重新配置 MHA
- 更新配置文件:将故障的主库从配置文件中移除
- 添加新主库到配置文件:更新新主库的配置
- 重启 MHA Manager:bash
masterha_stop --conf=/etc/mha/app1.cnf nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
故障排查
常见问题
SSH 连接问题
- 症状:
masterha_check_ssh失败 - 原因:SSH 免密登录未配置或配置错误
- 解决方案:bash
ssh-copy-id root@192.168.1.101 ssh-keyscan -t rsa
复制问题
- 症状:
masterha_check_repl失败 - 原因:复制配置错误或复制中断
- 解决方案:sql
SHOW SLAVE STATUS
gtid_mode = ON
#### MHA Manager 启动失败
- **症状**:`masterha_manager` 启动失败
- **原因**:配置文件错误或权限问题
- **解决方案**:检查配置文件和权限设置
### 排查步骤
1. **检查 SSH 连接**:
```bash
masterha_check_ssh --conf=/etc/mha/app1.cnf检查复制状态:
bashmasterha_check_repl --conf=/etc/mha/app1.cnf检查 MHA 状态:
bashmasterha_check_status --conf=/etc/mha/app1.cnf查看日志:
bashtail -f /var/log/masterha/app1/manager.log检查 MySQL 状态:
sqlSHOW GLOBAL STATUS LIKE 'Threads_connected'
最佳实践
配置最佳实践
- 使用专用管理用户:创建专门的MHA管理用户,权限最小化
- 合理配置候选主库:设置
candidate_master=1标记合适的候选主库 - 使用半同步复制:减少数据丢失
- 配置监控:监控MHA和MySQL状态
部署最佳实践
- 分布式部署:Manager节点与MySQL节点分离
- 网络优化:使用高速网络,减少网络延迟
- 定期测试:定期进行故障转移演练
运维最佳实践
- 定期检查:每周检查MHA状态和复制状态
- 日志管理:定期清理日志,保持日志空间充足
- 备份配置:备份MHA配置文件
- 文档化:记录MHA配置和操作流程
案例分析
金融系统 MHA 部署
业务需求:高可用性,数据一致性
部署方案:
- 3个MySQL节点,1个Manager节点
- 使用半同步复制
- 配置
candidate_master=1为两个从库
故障转移测试:
- 模拟主库故障,故障转移时间15秒
- 数据丢失:0(使用半同步复制)
电商系统 MHA 部署
业务需求:快速故障转移,最小数据丢失
部署方案:
- 5个MySQL节点,1个Manager节点
- 使用级联复制拓扑
- 配置
candidate_master=1为3个从库
优化效果:
- 故障转移时间:20秒
- 数据丢失:最小化
- 系统可用性:99.99%
常见问题(FAQ)
Q1: MHA 支持哪些 MySQL 版本?
A1: MHA 支持 MySQL 5.5+ 版本,包括 MySQL 8.0。对于 MySQL 8.0,需要确保使用兼容的 MHA 版本。
Q2: MHA 故障转移需要多长时间?
A2: 通常在10-30秒内完成,具体时间取决于:
- 从库的数量和状态
- 网络延迟
- 事务大小
- 系统资源
Q3: MHA 如何选择新主库?
A3: MHA 选择新主库的优先级:
- 配置了
candidate_master=1的节点 - 复制延迟最小的节点
- 二进制日志位置最新的节点
- 服务器ID最大的节点
Q4: MHA 支持 GTID 复制吗?
A4: 是的,MHA 支持 GTID 复制。在配置文件中添加:
ini
[server default]
gtid_mode=1Q5: 如何配置 MHA 与半同步复制结合?
A5: 在 MySQL 配置中启用半同步复制:
ini
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000Q6: MHA 可以与其他高可用解决方案结合使用吗?
A6: 是的,MHA 可以与以下解决方案结合:
- ProxySQL:实现读写分离
- Keepalived:提供VIP管理
- ZooKeeper:增强协调能力
Q7: 如何监控 MHA 的状态?
A7: 可以通过以下方式监控:
- 脚本监控 MHA 状态
- Prometheus + Grafana 监控 MHA 相关指标
- Zabbix 监控 MHA 状态
Q8: MHA 故障转移后如何处理原主库?
A8: 当原主库恢复后:
- 停止原主库,配置为从库
- CHANGE MASTER TO MASTER_HOST='新主库IP'
- 启动 SLAVE
- 更新 MHA 配置,将原主库作为从库添加回去
Q9: 如何升级 MHA 版本?
A9: 升级步骤:
- 停止 MHA Manager
- 升级 MHA 软件包
- 验证配置文件兼容性
- 启动 MHA Manager
Q10: MHA 支持多主架构吗?
A10: MHA 原生不支持多主架构,只支持传统的一主多从架构。可以结合其他解决方案实现多主架构。
