Mysql主从模式下搭建MHA

Posted Lossdate

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql主从模式下搭建MHA相关的知识,希望对你有一定的参考价值。

一、简介

  1. MHA(Master High Availability)目前在 mysql 高可用方面是一个相对成熟的解决方案,它由日本 DeNA 公司的 youshimaton(现就职于 Facebook 公司)开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。

  2. 该软件由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)
    MHA Manager:
    MHA Manager 可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上
    MHA node:
    MHA Node 运行在每台 MySQL 服务器上,MHA Manager 会定时探测集群中的 master 节点,当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master,然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明

二、环境


准备四台服务器,版本为centos7, 主库master和两个从库slave_A和slave_B都已经安装号mysql,并且实现了主从同步配置和半同步复制。
mysql安装传送门:centos安装mysq5.7.33
主从同步配置和半同步复制传送门:Mysql5.7配置主从同步

三、准备

  1. 为了方便操作,在各节点的/etc/hosts文件配置内容中添加如下内容:

    192.168.200.135 node1.keer.com node1
    192.168.200.134 node2.keer.com node2
    192.168.200.133 node3.keer.com node3
    192.168.200.132 node4.keer.com node4
    


    这样,在建立ssh互通时,可以通过host 解析节点来打通私钥访问

  2. master 的配置
    需要修改 master 的数据库配置文件来对其进行初始化配置:
    my.conf配置添加:

    #开启二进制日志
    log-bin=master-log 
    #开启日志
    relay-log=mysql-relay-bin
    #关闭名称解析(非必须)
    skip_name_resolve
    


    然后重启

    service mysql restart
    
  3. slave 的配置
    修改两个 slave 的数据库配置文件

    binlog-ignore-db=performance_schema
    binlog-ignore-db=information_schema
    binlog-ignore-db=sys
    
    #开启日志
    relay-log = mysql-relay-bin		
    #开启二进制日志
    log-bin = mysql-bin		
    #启用只读属性
    read_only = 1				
    #是否自动清空不再需要中继日志
    relay_log_purge = 0			
    #关闭名称解析(非必须)
    skip_name_resolve			
    #使得更新的数据写进二进制日志中
    log_slave_updates = 1
    

    这里的binlog-ignore-db配置主库和从库要一致
    然后重启

    service mysql restart
    

四、SSH互通

  1. 在 master 上进行授权
    授权拥有管理权限的用户可在本地网络中有其他节点上远程访问所有 Mysql 节点
    mysql> grant all on *.* to 'mharoot'@'192.168.%.%' identified by '123456';
    
  2. ssh 互通
    MHA各个节点之间需要ssh通信,因此在manager服务器上生成ssh密钥
    ssh-keygen -t rsa
    

    这里的密码什么的全部点跳过即可
    ssh-copy-id -i .ssh/id_rsa.pub root@node1
    

    接着进入.ssh/
    cd .ssh/
    ls
    
    可以看到:

    然后在其余三台主从服务器也分别执行相同的操作
    之后在manager服务器里执行cat authorized_keys
    cat authorized_keys
    

    可以看到四组公钥
    最后,把authorized_keys这个文件发送到其它三个主从服务器里
    scp authorized_keys root@node2:~/.ssh/
    scp authorized_keys root@node3:~/.ssh/
    scp authorized_keys root@node4:~/.ssh/
    

    这样,ssh互通就完成了

五、MHA 安装

  1. 安装
    manager、master和两个slave都需安装:mha4mysql-node-0.56-0.el6.norch.rpm
    manager还需安装:mha4mysql-manager-0.56-0.el6.noarch.rpm
    下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

    安装mha4mysql-manager-0.56-0.el6.noarch.rpm 需要perl依赖

    #安装epel源(国内有墙)
    wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
    #安装perl
    yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
    

    安装

    yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
    yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm 
    
  2. 配置
    在manager上进行配置

    mkdir /etc/mha_master
    vim /etc/mha_master/mha.cnf
    

    配置文件如下:

    [server default]
    #MHA管理mysql的用户名
    user=mharoot
    #MHA管理mysql的密码
    password=123456
    #mha的工作路径
    manager_workdir=/etc/mha_master/app1
    #mha的日志文件
    manager_log=/etc/mha_master/manager.log
    #master二进制日志路径
    master_binlog_dir=/usr/local/mysql/mysql-5.7.33/data
    #每个远程主机的工作目录在何处
    remote_workdir=/mydata/mha_master/app1
    #ssh登陆的用户名
    ssh_user=root
    #数据库用户名
    repl_user=root
    #数据库密码
    repl_password=123456
    #ping间隔时长
    ping_interval=1
    #配置manager管理的主从服务server1,2,3
    #节点2
    [server1]
    #节点2主机地址
    hostname=192.168.200.134
    #节点2的ssh端口
    ssh_port=22
    #master down掉的时候,可不可以竞选成为新的master(主库)
    candidate_master=1
    [server2]
    hostname=192.168.200.133
    ssh_port=22
    candidate_master=1
    [server3]
    hostname=192.168.200.132
    ssh_port=22
    candidate_master=1
    
  3. 检测配置是否生效
    1)检测 ssh 通信
    在 manager服务器上输入:

    masterha_check_ssh -conf=/etc/mha_master/mha.cnf
    

    如果最后一行显示为[info]All SSH connection tests passed successfully. 则表示成功

    2)检查MySQL复制集群的连接配置参数

    masterha_check_repl -conf=/etc/mha_master/mha.cnf
    

    可能出现的问题:
    问题1:Slave configurations is not valid
    解决:my.conf里配置的binlog-ignore-db主库和从库要一致

    问题2:Binlog setting check failed
    解决:修正manage配置文件(/etc/mha_master/mha.cnf)里的主库二进制日志路径:master_binlog_dir=/usr/local/mysql/mysql-5.7.33/data

    问题3:Slaves settings check failed
    解决:在slave和master服务器bashrc文件的末尾添加:

    vi /etc/bashrc
    #
    PATH="$PATH:/usr/local/mysql/mysql-5.7.33/bin"
    export PATH
    


    成功如下:

  4. 启动 MHA
    在 manager 服务器上执行:

    nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
    

    查看状态:

    masterha_check_status -conf=/etc/mha_master/mha.cnf
    


    如果想要停止 MHA:

    masterha_stop -conf=/etc/mha_master/mha.cnf
    

六、测试

  1. 在主服务器master上关闭mysql服务,模拟主节点down
    service mysql stop
    
  2. 在manger服务器上查看日志
    tail -200 /etc/mha_master/manager.log 
    

    可以看到,主服务器master failover并且将主服务器由192.168.200.134(原master)切换至192.168.200.133(原slave)
    此时,manager将会自动停止,查看状态会提示:mha is stopped

七、出问题的主库恢复为从库

  1. 重新启动在测试步骤down掉的主库(192.168.200.134)
  2. 原本的 slave_B(192.168.200.133) 已经成为了新的主库,所以,在slaveB对其进行完全备份,接着把备份的数据发送到恢复后的原主库(192.168.200.134)(node2)上
    mkdir /backup
    mysqldump --all-databases > /backup/mysql-backup-`date +%F-%T`-all.sql -uroot -p
    scp /backup/mysql-backup-2021-04-04-03\\:08\\:06-all.sql root@node2:~
    mkdir /backup
    mysqldump --all-databases > /backup/mysql-b
    
  3. 然后在原master(192.168.200.134)上,对数据进行恢复
    mysql < mysql-backup-2021-04-04-03\\:08\\:06-all.sql -uroot -p
    
  4. 接着在原master(192.168.200.134)上进行主从配置(原master192.168.200.134先已降级为从库)
    mysql> change master to master_host='192.168.200.133',  master_user='root',  master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=925;
    mysql> start slave;
    
  5. manager重新做启动前的检查
    masterha_check_repl -conf=/etc/mha_master/mha.cnf
    
    如果没问题则重新启动manager
    masterha_manager -conf=/etc/mha_master/mha.cnf > /etc/mha_master/manager.log 2>&1 &
    
    查看状态
    masterha_check_status -conf=/etc/mha_master/mha.cnf
    
    mha (pid:9561) is running(0:PING_OK), master:192.168.37.133
    状态上可以看到,此时已启动成功,并且主库为192.168.37.133(slave_B)

P.S. 参考来源:
MySQL高可用架构之MHA
mysql实现高可用架构之MHA
MHA MySQL 高可用解决方案

以上是关于Mysql主从模式下搭建MHA的主要内容,如果未能解决你的问题,请参考以下文章

mysql集群-MHA搭建

mysql MHA集群的搭建

MHA集群搭建

MHA mysql主从故障转移

MySQL高可用之MHA的搭建

MySQL 主主复制