基础知识

MHA简单功能介绍

MHA是目前实现mysql高可用的一种流行的解决方案,MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够很好地解决复制过程中的数据一致性问题,由于不需要在现有的replication中添加额外的服务器,仅需要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量;另外,安装简单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。
MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成。

MHA工作原理

1.从宕机崩溃的master上保存二进制日志文件;
2.识别含有最新更新的slave;
3.应用差异的中继日志到其他的slave上;
4.应用从master上保存的二进制日志文件;
5.自动提升一个slave作为新的master工作;
6.使得其他的slave连接到新的master进行复制。
maraidb高可用——MHA

MHA的组成

MHA软件由两部分组成,Manager工具包和Node工具包
Manager工具包主要包括以下几个工具:
1.masterha_check_ssh 检查MHA的SSH配置状况
2.masterha_check_repl 检查MySQL复制状况
3.masterha_manger 启动MHA
4.masterha_check_status 检测当前MHA运行状态
5.masterha_master_monitor 检测master是否宕机
6.masterha_master_switch 制故障转移(自动或手动)
7.masterha_conf_host 添加或删除配置的server信息

Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主
要包括以下几个工具:
1.save_binary_logs 保存和复制master的二进制日志
2.apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他
的slave
3.filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
4.purge_relay_logs 清除中继日志(不会阻塞SQL线程)
注意:为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA
的同时建议配置成的半同步复制

自定义扩展:
1.secondary_check_script:通过多条网络路由检测master的可用性
2.master_ip_ailover_script:更新Application使用的masterip
3.shutdown_script:强制关闭master节点
4.report_script:发送报告
5.init_conf_load_script:加载初始配置参数
6.master_ip_online_change_script:更新master节点ip地址

配置文件:
global配置,为各application提供默认配置
application配置:为每个主从复制集群

模拟实验

实验架构图

Manager 192.168.99.130
master 192.168.99.131
slave1 192.168.99.135
slave2 192.168.99.136

图示如下:

maraidb高可用——MHA

实验流程

准备工作

这里准备了四台centos7主机,分别作为manager,master,slave1和slave2。数据库使用的是maraidb10.2.15

做基本的软件环境清理,4台主机都要进行

#关闭selinux
setenforce 0
#清空防火墙规则
 iptables -F
 iptables -X
#进行时间同步,由于是做集群实验,所以时间不同步会导致实验失败。
ntpdate cn.pool.ntp.org

做四台主机基于ssh的相互访问

# 生成密钥
ssh-keygen
# 配置ssh访问
ssh-copy-id 192.168.99.130
scp -pr .ssh 192.168.99.131:/root/
scp -pr .ssh 192.168.99.135:/root/
scp -pr .ssh 192.168.99.136:/root/

完成后,进行验证
ssh 192.168.99.131
ssh 192.168.99.135
ssh 192.168.99.136
...

配置管理节点

安装mha软件包,需要有epel源的支持。

yum install mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm -y 

创建对应目录

mkdir /etc/mha
mkdir /mha/test -pv

修改配置文件

vim vim /etc/mha/test.cnf
# 填入以下字段
[server default]
#数据库的管理账号和密码
user=mha
password=mha

#manager使用的工作目录,如果没有设置,默认使用/var/tmp.
manager_workdir=/mha/test/
#MHA manager日志文件的绝对目录和文件名,如果没有设置,那么将直接打印到标准输出和标准错误输出.当执行交互式的failover时,MHA manager将会忽略manager_log设置,直接答应到标准输出和标准错误输出.
manager_log=/mha/test/manager.log
#每个MHA node上,MHA工作使用的目录的绝对路径.如果目录不存在,MHA会自动创建,如果权限不够,那么MHA node会意外终止,注意MHA manager和MHA node都不会检查这个目录的磁盘可用空间,你需要自己保证有足够的可用空间.默认的remote_workdir是'/var/tmp'.
remote_workdir=/mha/test/
# 基于ssh登陆的账号
ssh_user=root
#进行数据库备份的账号和密码
repl_user=slave
repl_password=slave
#这个参数声明MHA manager pings(通过执行sql来ping) master的间隔.当连续三次ping失败,MHA manager认为这个Mysql master宕机,从宕机到检测到宕机,最大的消耗时间是这个参数的四倍,这个参数默认值是3(3秒).如果MHA manager因为权限问题多次连接失败,这不认为master dead
ping_interval=1
# 指定二进制日志的目录,如果参数的主要目的是在master mysql宕机以后,为了通过ssh拷贝需要的binlog event.这个参数是需要的,因为当mysql宕机以后,没法自动获取binary log的目录。
#默认情况下,master_binlog_dir的值是"/var/lib/mysql/,/var/log/mysql/",/var/lib/mysql/是大部分mysql发布版本的默认mysql输出目录,你可以设置多个目录,使用逗号分隔.比如(/data1,/data2,/data3)
master_binlog_dir=/data/binlog/
#节点配置
[server1]
hostname=192.168.99.131
#声明可以作为主的资格
candidate_master=1
[server2]
hostname=192.168.99.135
candidate_master=1
[server3]
hostname=192.168.99.136

管理节点基本配置完毕
maraidb高可用——MHA

节点配置

安装node包

在master,slave1,slave2上安装mha节点包

yum install  mha4mysql-node-0.56-0.el6.noarch.rpm

master节点配置

编辑数据库配置文件

vim /etc/my.cnf

[mysqld]
# 数据和二进制日志分离
datadir=/data/mysql
log_bin=/data/binlog/mysql-bin
#配置唯一id
server_id=1
#跳过名称解析,这里必须配置
skip_name_resolve=1
#关闭清理中继日志
relay_log_purge=0

maraidb高可用——MHA
编辑完配置文件后,启动数据库.

systemctl start mariadb

进行管理账号和备份账号的授权

#这里先查看二进制日志是为了,之后从数据库可以直接同步主库的账号授权信息。
MariaDB [(none)]>show master logs;
MariaDB [(none)]> grant replication slave on *.* to slave@'192.168.99.%' identified by'slave';
MariaDB [(none)]> grant all on *.* to mha@'192.168.99.%' identified by 'mha';

推荐开启半同步复制,mariadb10.3无需安装插件可以直接命令开启。

# 安装半同步复制的主从插件
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 
# 启动半同步复制
MariaDB [(none)]>  SET GLOBAL rpl_semi_sync_master_enabled=1;
MariaDB [(none)]>  SET GLOBAL rpl_semi_sync_slave_enabled=1;
#查看状态
MariaDB [(none)]> show variables like '%semi%';

slave节点配置

编辑数据库配置文件

vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
log_bin=/data/binlog/mysql-bin
#不同节点id号必须不同
server_id=2
skip_name_resolve=1
relay_log_purge=0

启动数据库

systemctl start mariadb

开启半同步复制

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 
MariaDB [(none)]>  SET GLOBAL rpl_semi_sync_master_enabled=1;
MariaDB [(none)]>  SET GLOBAL rpl_semi_sync_slave_enabled=1;

配置同步信息

MariaDB [(none)]> change master to \
    -> master_host='192.168.99.131',
    -> master_user='slave',
    -> master_password='slave',
        #二进制日志文件和起始点为之前,在master节点查看到的信息,不能写错
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=703;

启动同步并且查看同步信息

MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G

管理节点检查状态并启动mha

#检查ssh密钥登陆是否正常
masterha_check_ssh --conf=/etc/mha/test.cnf 
#检查备份配置是否正常
masterha_check_repl --conf=/etc/mha/test.cnf 
#启动mha开启监控,由于默认在前台执行,所以可以考虑转到后台或者开启会话再执行
masterha_manager --conf=/etc/mha/test.cnf   启动mha

MHA配置完成

注意:

1.在master宕机后,mha会自动挑选备用节点中有资格的节点成为新的主;
2.宕机的节点在修复后需要手动加入集群,要配置为从服务器;
3.如果在宕机期间数据有了更新,要手动同步新 主的数据并启动同步,作为新从;
4.修复完成后,想重启mha监控要删除/mha/test/目录下的complete结尾的文件,否则无法重启监控;
5.修复完成重新运行监控命令
masterha_manager --conf=/etc/mha/test.cnf

mha的rpm包下载在google code,不过版本有点老,这里提供我这边使用包
官方下载
https://code.google.com/archive/p/mysql-master-ha/downloads
个人分享,centos7 也可以安装
https://pan.baidu.com/s/1AGKc7iSZBUAonO9QSqwF-Q