基础知识
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进行复制。
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 |
图示如下:
实验流程
准备工作
这里准备了四台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
管理节点基本配置完毕
节点配置
安装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
编辑完配置文件后,启动数据库.
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