文章目录
MHA简介
MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。
failover :网络 故障转移; 故障切换; 容错; 失效接管; 失效转移
MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品 TMHA, 目前已支持一主一从。
MHA服务的角色
MHA 服务有两种角色,MHA Manager(管理节点)和MHA Node(数据节点)
MHA Manager:
通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个 master/slave 集群称作一个 application,用来管理统筹整个集群。
MHA node:
运行在每台 MySQL 服务器上(master/slave/manager),它通过监控具备解析和清理 logs 功能的脚本来加快故障转移。
主要是接收管理节点所发出指令的代理,代理需要运行在每一个 mysql 节点上。简单讲 node 就是用来收集从节点服务器上所生成的 bin-log 。对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地应用后提升为主节点。
由上图我们可以看出,每个复制组内部和 Manager 之间都需要ssh实现无密码互连,只有这样,在 Master 出故障时, Manager 才能顺利的连接进去,实现主从切换功能。
MHA提供的工具
MHA会提供诸多工具程序。
Manager节点:
masterha_check_ssh:MHA 依赖的 ssh 环境监测工具;
masterha_check_repl:MYSQL 复制环境检测工具;
masterga_manager:MHA 服务主程序;
masterha_check_status:MHA 运行状态探测工具;
masterha_master_monitor:MYSQL master 节点可用性监测工具;
masterha_master_swith:master:节点切换工具;
masterha_conf_host:添加或删除配置的节点;
masterha_stop:关闭 MHA 服务的工具。
Node节点:(这些工具通常由MHA Manager的脚本触发,无需人为操作)
save_binary_logs:保存和复制 master 的二进制日志;
apply_diff_relay_logs:识别差异的中继日志事件并应用于其他 slave;
purge_relay_logs:清除中继日志(不会阻塞 SQL 线程);
MHA的工作原理
MHA工作原理总结为以下几条:
(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);
(2) 识别含有最新更新的 slave ;
(3) 应用差异的中继日志(relay log) 到其他 slave ;
(4) 应用从 master 保存的二进制日志事件(binlog events);
(5) 提升一个 slave 为新 master ;
(6) 使用其他的 slave 连接新的 master 进行复制。
实现步骤
MHA 对 MYSQL 复制环境有特殊要求,例如各节点都要开启二进制日志及中继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等。
实验环境:
server1 主数据库 172.25.2.10
server2 从数据库 172.25.2.11
server3 从代理器 172.25.2.254
真机 MHAmanager 172.25.2.250
关闭4台主机的防火墙和selinux
前提做好4台数据库的主从复制,这里采用基于GTID的主从复制。
并且应该在每个主机上编写 /etc/hosts文件,便于后面的ssh 连接。
1.server1中的my.cnf的配置文件
server-id = 1 //复制集群中的各节点的id均必须唯一
log_slave_updates = on //使得更新的数据写进二进制日志中
log-bin =binlog //开启二进制日志
2.server2中的配置文件
3.server3中的配置文件
4.开启server1
5.对server2做配置
进行初始化并且登录进数据库之后
6.对server3进行相应配置
登陆进数据库
以server1为主,server2,server3为从数据库的基GTID的主从复制到此完成。
MHA manager节点
真机,172.25.2.250,用于监控管理,它是整个集群的控制器。
1.安装软件
yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm perl-* mha4mysql-node-0.58-0.el7.centos.noarch.rpm
2.#配置免密访问(server4 需要连接 server1 2 3 都免密码
先生成密钥
#发送密钥
测试免密登录
其他 3 个节点都安装 mha4mysql-node-0.58-0.el7.centos.noarch.rpm
在manager节点配置 mha 工作目录及配置文件
##检测 ssh 连接
masterha_check_ssh --conf=/etc/masterha/app1.cnf
发现报错,server1 2 3 互相之间不免密拷贝
真机上的密钥给 server1 2 3
再检测 ssh,成功
接下来在真机上检测复制功能
masterha_check_repl --conf=/etc/masterha/app1.cnf
发现有报错,这是因为 manager 默认是用 root 远程连接数据库,但是在配置数据库是已经禁用了 root 的远程连接
在主库上授权用户
grant all on *.* to root@'%' identified by 'W....';
再次在manager检测时,正确
测试 manager 能否开启
nohup masterha_manager --conf=/etc/masterha/app1.cnf
--remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha.log 2>&1 & 打入后台运行
测试手动 failover 切换先关闭 manager,不关的话切不了,manager 就是自动切换的工具
手动死切
手动切换之前,需要保证主从同步正常,repl 复制用户能够远程连接’ 中间都选 yes。
在manager上
masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.2.10 --dead_master_ip=172.25.0.1
--dead_master_port=3306 --new_master_host=172.25.2.11
--new_master_port=3306
切换成功后,可以在 server3 上看到它的 master 已经变成了 server2( 而 server2 已经时是master 了再手动开启 server1,作为 slave 加入集群
将server1加入集群。
当完成一次手动切换后,manager上生成了如下文件
在/etc/masterha 目录下生成一个 app1.failover.complete 文件,是来记录 failover 情况的,再进行 failover 时必须先把这个文件删除,不然不会 failover
手动活切
手动在线切换,刚才是 master 挂掉后切换,现在是master在线时切换。
在manager中
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive
--new_master_host=172.25.2.10 --new_master_port=3306
--orig_master_is_new_slave --running_updates_limit=10000
又切换回 172.25.2.10 为 master
半自动故障转移( failover )
首先清理 app1.failover.complete
1.开启mha manager
nohup masterha_manager
--conf=/etc/masterha/app1.cnf &>/dev/null &
mha manager 自带守护进程,在 server1 上查看
再查看,发现 mysql 进程又开启了
在 server1 上手动关闭 mysqld
在manager上查看日志,发现已经切换,同时 manager 进程退出,所以全自动需要脚本先把 server1 加回集群
在server1上
CHANGE MASTER TO MASTER_HOST = '172.25.2.11', MASTER_USER = 'repl',
MASTER_PASSWORD = 'Wssss', MASTER_AUTO_POSITION = 1;
start slave;
配置 vip 漂移
因为用户访问入口只能有一个,对客户端来说,访问的vip,只能有一个,客户端感受不到后端多台数据库服务器在服务。所以需要配置 vip,当发生故障时,谁获得vip,谁上线。
1.在manager中,编辑 master_ip_failover 和 master_ip_online_change 两个脚本
配置自动添加和删除 vip
注意在 manager 的配置文件种这两行的注释要打开
master_ip_failover_script= /usr/local/bin/master_ip_failover
master_ip_online_change_script= /usr/local
/bin/master_ip_online_change
已经将serevr1设置成主库,先给 server1 添加 vip
在manager中关闭ha
手动测试vip漂移
手动测试 vip 漂移(在线切)
可以看到切换 vip
server2获得vip
server2成为主库
测试全自动漂移
manager开启MHA
serevr2上关闭mysqld
manager查看日志
可以看到切换成功,vip 也成功漂移 server1成为主库