MHA(Master HA) 是一款开源的 MySQL 的高可用程序, 它为 MySQL 主从复制架构提供了 automating master failover 功能. MHA 在监控到 master 节点故障时, 会提升其中拥有最新数据的 slave 节点成为新的 master 节点, 在此期间, MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题. MHA 还提供了 master 节点的在线切换功能, 即按需切换 master/slave 节点.
MHA 是由日本人 yoshinorim(原就职于 DeNA 现就职于 Facebook) 开发的比较成熟的 MySQL 高可用方案. MHA 能够在 30 秒内实现故障切换, 并能在故障切换中, 最大可能的保证数据一致性. 目前淘宝也正在开发相似产品 TMHA, 目前已支持一主一从.
一, MHA 的组成
(一)MHA 中的角色
MHA 服务有两种角色, MHA Manager(管理节点) 和 MHA Node(数据节点):
MHA Manager: 通常单独部署在独立机器上管理多个 master/slave 集群 (组), 每个 master/slave 集群称作一个 application, 用来管理统筹整个集群.
MHA Node: 运行在每台 MySQL 服务器上 (master/slave/manager), 它通过监控具备解析和清理 logs 功能的脚本来加快故障转移. 主要是接收管理节点所发出指令的代理, 代理需要运行在每一个 MySQL 节点上. 简单讲 node 就是用来收集从节点服务器上所生成的 bin-log. 对比打算提升为新的主节点之上的从节点的是否拥有并完成操作, 如果没有发给新主节点在本地应用后提升为主节点.
(二)MHA 提供的工具
MHA 会提供诸多工具程序, 其常见的如下所示:
Manager 节点
Node 节点 (这些工具通常由 MHA Manager 的脚本触发, 无需人为操作)
二, MHA 的工作原理
从宕机崩溃的 master 保存二进制日志事件 (binlog events);
识别含有最新更新的 slave ;
应用差异的中继日志 (relay log) 到其他 slave ;
应用从 master 保存的二进制日志事件 (binlog events);
提升一个 slave 为新 master ;
使用其他的 slave 连接新的 master 进行复制.
三, 部署 MHA
(一) 准备实验环境
三台主机: mysql111,mysql112,mysql113
操作系统: CentOS
配置主机名 (/etc/hosts)
配置免密码登录
每台主机安装 MySQL
(二) 搭建主从环境
每台 MySQL 开启 binlog, 设置 server-id
- vi /etc/my.cnf
- log-bin=MySQL-binlog
- server-id=1 (注意: 每台 MySQL 设置不同的 server-id)
- show variables like '%log_bin%';
在所有机器上, 创建主从复制的账号
- create user 'repl'@'192.168.79.%' identified by 'Welcome_1';
- grant replication slave on *.* to 'repl'@'192.168.79.%';
- flush privileges;
在所有机器上, 创建管理账号
- create user 'myadmin'@'192.168.79.%' identified by 'Welcome_1';
- grant all privileges on *.* to 'myadmin'@'192.168.79.%';
- flush privileges;
在主库和从库上, 启用 GTID
- set @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
- set @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
- set @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
- set @@GLOBAL.GTID_MODE = ON;
参数说明:
GTID 是 MySQL 5.6 的新特性, 其全称是 Global Transaction Identifier, 可简化 MySQL 的主从切换以及 Failover.GTID 用于在 binlog 中唯一标识一个事务. 当事务提交时, MySQL Server 在写 binlog 的时候, 会先写一个特殊的 Binlog Event, 类型为 GTID_Event, 指定下一个事务的 GTID, 然后再写事务的 Binlog. 主从同步时 GTID_Event 和事务的 Binlog 都会传递到从库, 从库在执行的时候也是用同样的 GTID 写 binlog, 这样主从同步以后, 就可通过 GTID 确定从库同步到的位置了. 也就是说, 无论是级联情况, 还是一主多从情况, 都可以通过 GTID 自动找点儿, 而无需像之前那样通过 File_name 和 File_position 找点儿了.
在从库上分别配置主从复制命令并开启主从同步
- change master to master_host='mysql111',master_user='repl',\
- master_password='Welcome_1',master_auto_position=1;
- start slave;
在从库上查看主从复制的状态
show slave status\G;
测试主从复制
(三) 安装 MHA
所有节点安装 node 软件依赖包和 node 软件
- yum -y install perl-DBD-MySQL
- rpm -ivh mha4mysql-node-0.58-0.el7.CentOS.noarch.rpm
在 mysql111 上安装安装 manager 软件依赖包
- yum install -y perl-Config-Tiny
- yum install -y epel-release
- yum install -y perl-Log-Dispatch
- yum install -y perl-Parallel-ForkManager
- yum install -y perl-Time-HiRes
在 mysql111 上安装安装 manager 软件
rpm -ivh mha4mysql-manager-0.58-0.el7.CentOS.noarch.rpm
(四) 创建 Manager 的配置文件
- # 创建配置文件目录, 日志目录
- mkdir -p /etc/mha
- mkdir -p /var/log/mha/log
- # 编辑 mha 配置文件 vi /etc/mha/mha.cnf
- [server default]
- manager_log=/var/log/mha/log/manager
- manager_workdir=/var/log/mha/log
- master_binlog_dir=/var/lib/MySQL
- user=myadmin
- password=Welcome_1
- ping_interval=2
- repl_user=repl
- repl_password=Welcome_1
- ssh_user=root
- [server1]
- hostname=mysql111
- port=3306
- [server2]
- hostname=mysql112
- port=3306
- [server3]
- hostname=mysql113
- port=3306
(五) 检查状态, 并开启 MHA
检查互信
masterha_check_ssh --conf=/etc/mha/mha.cnf
检查主从复制状态
masterha_check_repl --conf=/etc/mha/mha.cnf
开启 MHA-manager
nohup masterha_manager --conf=/etc/mha/mha.cnf> /var/log/mha/log/manager.log </dev/null 2>&1 &
查看 MHA 状态
masterha_check_status --conf=/etc/mha/mha.cnf
测试 HA 高可用的自动切换
在 mysql111 上, 执行 shutdown 操作
mysqladmin -uroot -pWelcome_1 shutdown
MHA 会自动进行主从切换. 切换完成后, MHA 进程会自动停止运行.
在 mysql112 和 mysql113 上观察, 执行下面的语句:
show slave status\G;
来源: https://www.qcloud.com/developer/article/1668658