一、MHA架构结构

  1. Manager
masterha_manger             启动MHA 
masterha_check_ssh          检查MHA的SSH配置状况 
masterha_check_repl         检查MySQL复制状况 
masterha_master_monitor     检测master是否宕机 
masterha_check_status       检测当前MHA运行状态 
masterha_master_switch      控制故障转移(自动或者手动)
masterha_conf_host          添加或删除配置的server信息
  1. Node
save_binary_logs            保存和复制master的二进制日志 
apply_diff_relay_logs       识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs            清除中继日志(不会阻塞SQL线程)

二、MHA Failover的过程

  1. 通过masterha_manager,启动MHA manager 节点程序

  2. 自动检查SSH 和repl: masterha_check_ssh ,masterha_check_repl

  3. 通过masterha_master_monitor,监控主库,每(ping_interval=2)时间间隔,探测一次心跳,一共给3次机会

  4. 主库宕机,触发选主和数据补偿

  5. 选主

    1. 权重: candidate_master=1,xxxx
    2. 日质量
    3. 配置文件顺序
  6. 数据补偿

    1. ssh能连:调用save_binary_logs ,立即保存确实的binlog 到各个从库/var/tmp目录下,补偿数据
    2. ssh不能连:调用apply_diff_relay_logs,计算从库差异并且补偿
    3. Manager ,处理完所有操作后,自动退出,自动把故障节点剔除配置文件

  7. 应用透明:VIP

    1. 准备好的脚本拷贝到/usr/local/bin/master_ip_failover
    2. 修改脚本内容
      vim [root@db03 bin]# vim master_ip_failover 
      my $vip = '10.0.0.55/24';
      my $key = '1';
      my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
      my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
      
      转换格式
      dos2unix master_ip_failover  
    3. 修改配置文件 master_ip_failover_script=/usr/local/bin/master_ip_failover
      vim /etc/mha/app1.cnf
      [server default]
      master_ip_failover_script=/usr/local/bin/master_ip_failover
      manager_log=/var/log/mha/app1/manager
      manager_workdir=/var/log/mha/app1
      master_binlog_dir=/data/binlog
    4. 脚本添加执行权限
      chmod + x /usr/local/bin/master_ip_failover 
    5. 在主节点手工添加vip
      /sbin/ifconfig eth0:1 10.0.0.55/24
    6. 重启mha
      [root@db03 bin]# masterha_stop --conf=/etc/mha/app1.cnf
      Stopped app1 successfully.
      [1]+  Exit 1                  nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1  (wd: ~)
      [root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
      [1] 21612
      额外数据补偿:binlogserver
  8. 配置文件修改

vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/mysql/binlog
  1. 创建日志目录
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
  1. 拉取主库binglog日志
cd /data/mysql/binlog     -----》必须进入到自己创建好的目录
mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &
注意:
拉取日志的起点,需要按照目前从库已经获取到的二进制日志点为起点
  1. 重启MHA
masterha_stop --conf=/etc/mha/app1.cnf

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

故障通知:send_report

  1. 解压
unzip email_2019-最新.zip 
[root@db03 ~/email]# cp -a * /usr/local/bin/
  1. 脚本测试
[root@db03 ~/email]# cd /usr/local/bin/
[root@db03 /usr/local/bin]# chmod +x *
  1. 改配置文件
vi /etc/mha/app1.cnf
report_script=/usr/local/bin/send
  1. 重启生效
masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

自愈:待开发
测试MHA(MHA+vip+binlogserver+send_report)高可用能力
1)停主库
看各种状态
修复MHA 架构
1)修复故障节点
2)修复主从

change master to 
master_host='10.0.0.52',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;

3)修改配置文件

[server1]
hostname=10.0.0.51
port=3306

[server2]
hostname=10.0.0.52
port=3306

[server3]
hostname=10.0.0.53
port=3306

4)修复binlogserver

cd /data/mysql/binlog/
rm -rf *
mysqlbinlog  -R --host=10.0.0.52 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

5)启动mha

[root@db03 /data/mysql/binlog]# masterha_check_repl --conf=/etc/mha/app1.cnf

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

[root@db03 /data/mysql/binlog]# masterha_check_status  --conf=/etc/mha/app1.cnf
app1 (pid:5325) is running(0:PING_OK), master:10.0.0.52

mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

额外参数:

  1. ping_interval=1

#设置监控主库,发送ping包的时间间隔,尝试四次没有回应的时候自动进行failover
2. candidate_master=1
#设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
KeepAlive
3. check_repl_delay=0
#默认情况下如果一个slave落后master 100M的relay logs的话,
MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master