MHA是一款用于解决数据库MySQL高可用性环境下故障切换和主从提升的高可用软件。能够很好的解决单master主数据库单点故障点的问题。
在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中, MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA能够在0.5-2秒内实现切换,0.5-2秒的写阻塞通常是可接受的,所以你甚至能在非维护期间就在线切换master。诸如升级到高版本,升级到更快的服务器之类的工作,将会变得更容易。
MHA由Manager节点和Node节点组成。
本案例要求通过 MHA 监控 MySQL 数据库在master故障时进行自动切换到master salve,不影响业务。
注: 所有服务器关闭selinux和防火墙。
8)查看slave数据库的 IO 和 SQL 线程是否都是 yes 代表同步是否正常。no 表示不正常。
mysql> show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes //都为yes表示同步正常9)验证主从复制是否成功。 在主服务器上创建一个表或者库,在从服务器上查看是否有在主服务器上创建的表或者库
MHA 软件包对于每个操作系统版本不一样,这里 CentOS7.0以上必须选择 0.57 版本,CentOs6.0以上使用必须使用0.56版本。需要注意的是所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 管理服务器依赖 node 组件。
node的下载网址https://nodejs.org/en/download/将下载的node包上传到各个节点。
编译安装node组件 [root@Mysql1 ~]# tar zxvf mha4mysql-node-0.57.tar.gz //解压node安装包 [root@Mysql1 ~]# cd mha4mysql-node-0.57 //进入到解压目录 [root@Mysql1 mha4mysql-node-0.57]# perl Makefile.PL //使用perl 编译文件 [root@Mysql1 mha4mysql-node-0.57]# make && make install //编译安装node注: node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要包括:
脚本名用法介绍save_binary_logs保存和复制 master 的二进制日志-apply_diff_relay_logs识别差异的中继日志事件并将其差异的事件应用于其他的 slavefilter_mysqlbinlog去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)-purge_relay_logs清除中继日志(不会阻塞 SQL 线程)在 MHA-manager 上安装 manager 组件(!注意:一定要先安装node 组件才能安装manager 组件)
MHA-manager 5.6的下载地址 https://github.com/yoshinorim/mha4mysql-manager/wiki/DownloadsMHA-manager 5.7的下载地址需要翻墙才能下载到,这里是以下好的提取地址 链接: https://pan.baidu.com/s/18H12bTIYHi2H0dXs2DI7NA 提取码: mwkq [root@MHA-manager ~]# tar zxvf mha4MHA-manager-0.57.tar.gz [root@MHA-manager ~]# cd mha4MHA-manager-0.57 [root@MHA-manager mha4MHA-manager-0.57]# perl Makefile.PL [root@MHA-manager mha4MHA-manager-0.57]# make && make install注: manager 安装后在/usr/local/bin 下面会生成几个用法工具,主要包括:
工具名用法介绍masterha_check_ssh检查 MHA 的 SSH 配置状况masterha_check_repl检查 MySQL 复制状况masterha_manger启动 manager的脚本masterha_check_status检测当前 MHA 运行状态masterha_master_monitor检测 master 是否宕机masterha_master_switch控制故障转移(自动或者手动)masterha_conf_host添加或删除配置的 server 信息masterha_stop关闭manager1) 在 manager 上配置到所有数据库节点的无密码认证 [root@MHA-manager ~]# ssh-keygen -t rsa //一路按回车键 [root@MHA-manager ~]# ssh-copy-id 192.168.10.100 [root@MHA-manager ~]# ssh-copy-id 192.168.10.156 [root@MHA-manager ~]# ssh-copy-id 192.168.10.160 2)在master上配置到数据库节点slave的无密码认证 [root@Mysql1 ~]# ssh-keygen -t rsa [root@Mysql1 ~]# ssh-copy-id 192.168.10.156 [root@Mysql1 ~]# ssh-copy-id 192.168.10.160 3)在 master-slave 上配置到数据库节点slave和master的无密码认证 [root@Mysql2 ~]# ssh-keygen -t rsa [root@Mysql2 ~]# ssh-copy-id 192.168.10.100 [root@Mysql2 ~]# ssh-copy-id 192.168.10.160 4) 在slave 上配置到数据库节点master-slave和master的无密码认证 [root@Mysql3 ~]# ssh-keygen -t rsa [root@Mysql3 ~]# ssh-copy-id 192.168.10.100 [root@Mysql3 ~]# ssh-copy-id 192.168.10.156
[root@MHA-manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin //将vip控制脚本复制到指定目录下
控制自动切换vip的脚本模板 脚本名用法介绍master_ip_failover自动切换时 vip 管理的脚本master_ip_online_change在线切换时 vip 的管理power_manager故障发生后关闭主机的脚本1360 5 月 31 2015 send_report因故障切换后发送报警的脚本 复制上述的自动切换时 vip 管理的脚本到/usr/local/bin 目录,使用脚本管理 vip [root@MHA-manager ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin添加内容部分 [root@localhost local]# vim /usr/local/bin/master_ip_failover #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port ); //添加以下内容 my $vip = '192.168.10.200'; //vip的地址 my $brdc = '192.168.10.255'; //vip的网络号,也表示结束地址 my $ifdev = 'ens33'; //网卡名称 my $key = '1'; //逻辑子接口 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; //启动vip my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; //关闭vip my $exit_code = 0; //状态的返回值,正常关闭返回0 ······ //省略部分信息创建 MHA 软件目录并拷贝配置文件。
[root@MHA-manager ~]# mkdir /etc/masterha #创建软件目录 [root@MHA-manager ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/ #复制模板到软件目录 [root@MHA-manager ~]# vim /etc/masterha/app1.cnf #编辑配置文件 [server default] manager_workdir=/var/log/masterha/app1.log ##manager工作目录 manager_log=/var/log/masterha/app1/manager.log #manager日志 master_binlog_dir=/usr/local/mysql/data/ #master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便mha能找到 #master_ip_failover_script= /usr/local/bin/master_ip_failover #设置自动failover时候的切换脚本,也就是上边编辑的自动切换vip脚本 master_ip_online_change_script= /usr/local/bin/master_ip_online_change #设置手动切换时候的切换脚本 password=manager #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码 user=mha #设置监控用户root ping_interval=1 #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置 repl_password=123 #设置复制用户的密码 repl_user=myslave #设置复制用户的用户 report_script=/usr/local/send_report //设置发生切换后发送的报警的脚本 secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.10.100 -s 192.168.10.156 shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机,这里没有使用) ssh_user=root #设置ssh的登录用户名 [server1] hostname=192.168.10.100 port=3306 [server2] hostname=192.168.10.156 port=3306 candidate_master=1 #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave check_repl_delay=0 #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master [server3] hostname=192.168.10.161 port=3306[root@Mysql1 ~]# /sbin/ifconfig ens33:1 192.168.10.200/24
[root@mysql3 local]# masterha_check_status --conf=/etc/masterha/app1.cnf app1 (pid:22244) is running(0:PING_OK), master:192.168.10.100
[root@mysql3 local]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:23153) is running(0:PING_OK), master:192.168.10.156
//模拟故障成功master地址由100变为了156
切换备选主库的算法: 1.一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。 2.数据一致的情况下,按照配置文件顺序,选择备选主库。 3.设定有权重(candidate_master=1),按照权重强制指定备选主。 1)默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。 2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。
1)启动故障数据库 [root@mysql1 ~]# systemctl start mysqld 2)修复故障数据库主从同步 mysql> change master to master_host=‘192.168.10.156’,master_user=‘myslave’, > master_password=‘123’,master_log_file=‘master-bin.000004’, > master_log_pos=154; >start slave; 3)修改MHA服务器配置文件(再把这个记录添加进去,因为它检测掉失效时候会自动消失) [root@localhost ]# vi /etc/masterha/app1.cnf [server1] hostname=192.168.195.129 port=3306 4)重启MHA服务 nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &