Skip to content

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 &

维护操作

添加新从库

  1. 配置新从库

    bash
    CHANGE 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;
  2. 更新 MHA 配置:在配置文件中添加新服务器

  3. 验证配置

    bash
    masterha_check_repl --conf=/etc/mha/app1.cnf
  4. 重启 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 &

移除从库

  1. 更新 MHA 配置:从配置文件中移除服务器
  2. 重启 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检测到主库故障时,会自动执行故障转移:

  1. 检测主库故障:定期检查主库的可用性
  2. 选择新主库:从候选主库中选择最合适的
  3. 提升新主库:将选择的从库提升为新主库
  4. 更新其他从库:更新其他从库的复制关系
  5. 通知应用程序:通过脚本通知应用程序切换到新主库

故障转移后的操作

检查新主库状态

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

  1. 更新配置文件:将故障的主库从配置文件中移除
  2. 添加新主库到配置文件:更新新主库的配置
  3. 重启 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
  1. 检查复制状态

    bash
    masterha_check_repl --conf=/etc/mha/app1.cnf
  2. 检查 MHA 状态

    bash
    masterha_check_status --conf=/etc/mha/app1.cnf
  3. 查看日志

    bash
    tail -f /var/log/masterha/app1/manager.log
  4. 检查 MySQL 状态

    sql
    SHOW 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 选择新主库的优先级:

  1. 配置了 candidate_master=1 的节点
  2. 复制延迟最小的节点
  3. 二进制日志位置最新的节点
  4. 服务器ID最大的节点

Q4: MHA 支持 GTID 复制吗?

A4: 是的,MHA 支持 GTID 复制。在配置文件中添加:

ini
[server default]
gtid_mode=1

Q5: 如何配置 MHA 与半同步复制结合?

A5: 在 MySQL 配置中启用半同步复制:

ini
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000

Q6: MHA 可以与其他高可用解决方案结合使用吗?

A6: 是的,MHA 可以与以下解决方案结合:

  • ProxySQL:实现读写分离
  • Keepalived:提供VIP管理
  • ZooKeeper:增强协调能力

Q7: 如何监控 MHA 的状态?

A7: 可以通过以下方式监控:

  • 脚本监控 MHA 状态
  • Prometheus + Grafana 监控 MHA 相关指标
  • Zabbix 监控 MHA 状态

Q8: MHA 故障转移后如何处理原主库?

A8: 当原主库恢复后:

  1. 停止原主库,配置为从库
  2. CHANGE MASTER TO MASTER_HOST='新主库IP'
  3. 启动 SLAVE
  4. 更新 MHA 配置,将原主库作为从库添加回去

Q9: 如何升级 MHA 版本?

A9: 升级步骤:

  1. 停止 MHA Manager
  2. 升级 MHA 软件包
  3. 验证配置文件兼容性
  4. 启动 MHA Manager

Q10: MHA 支持多主架构吗?

A10: MHA 原生不支持多主架构,只支持传统的一主多从架构。可以结合其他解决方案实现多主架构。