MySQL高可用之MHA部署           

MySQL+MHA

Posted by     BY   杨晓明              on September 8, 2017

MySQL高可用之MHA架构

MHA for MySQL是MySQL的一个高可用方案,本文介绍MHA的安装配置。MHA分管理节点和数据库节点,支持一主多从、多主多从等配置,本文为一主多从方式,原理都相同,详见官方文档。可实现主库挂掉之后自动将一个从库提升为主库,并自动保持新主库和从库的一致性。

一、部署说明

操作系统都为CentOS 7.2 x86_64,数据库版本为MySQL5.6.36,EPEL源已启用(有些依赖的软件包需要从EPEL软件仓库中下载,点击即可下载适用CentOS 7的EPEL)。 主从复制已经配置好。服务器详情如下:

主库 10.0.0.3
从库1 10.0.0.4
从库2 10.0.0.5

二、部署MHA

1.环境准备(所有节点)

1).安装node包

yum install perl-DBD-MySQL -y  #依赖包
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

2).添加mha管理账号与主从rep账号

--主从账号
grant replication slave on *.* to rep@'10.0.0.%' identified by '123456';
--mha管理账号
grant all privileges on *.* to mha@'10.0.10.%' identified by 'mha';
select user,host from mysql.user;

3).命令做软连接

ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql /usr/bin/mysql
#如果不创建命令软连接,检测mha复制情况的时候会报错

2.部署管理节点

1).在从库1上部署管理节点

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes            #安装manager依赖包
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm 

2).编辑配置文件

mkdir -p /etc/mha               #创建配置文件目录
mkdir -p /var/log/mha/app1      #创建日志目录
vim /etc/mha/app1.cnf           #编辑mha配置文件
  • 配置文件内容:

    [server default] manager_log=/var/log/mha/app1/manager
    manager_workdir=/var/log/mha/app1
    master_binlog_dir=/application/mysql/data
    user=mha
    password=mha
    ping_interval=2 repl_password=123456 repl_user=rep ssh_user=root
    [server1]
    hostname=10.0.0.3 port=3306
    [server2] candidate_master=1
    check_repl_delay=0
    hostname=10.0.0.4 port=3306 [server3] hostname=10.0.0.5 port=3306

  • 配置文件详解

    [server default]

    manager_workdir=/var/log/masterha/app1**——设置manager的工作目录**
    manager_log=/var/log/masterha/app1/manager.log**——设置manager的日志**
    master_binlog_dir=/data/mysql——**设置master 保存binlog的位置,以便MHA可以找到master的日志**
    master_ip_failover_script= /usr/local/bin/master_ip_failover——**设置自动failover时候的切换脚本**
    master_ip_online_change_script= /usr/local/bin/master_ip_online_change——**设置手动切换时候的切换脚本**
    password=123456--**设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码**
    user=root——**设置监控用户root**
    ping_interval=1——**设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover**
    remote_workdir=/tmp——**设置远端mysql在发生切换时binlog的保存位置**
    repl_password=123456——**设置复制用户的密码**
    repl_user=rep——**设置复制环境中的复制用户名 **
    report_script=/usr/local/send_report——**设置发生切换后发送的报警的脚本**
    secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 --user=root --master_host=server02 --master_ip=192.168.0.50 --master_port=3306——**一旦MHA到server02的监控之间出现问题,MHA Manager将会尝试从server03登录到server02**
    shutdown_script=""——**设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)**
    ssh_user=root ——**设置ssh的登录用户名**
    [server1]
    hostname=10.0.0.51
    port=3306
    [server2]
    hostname=10.0.0.52
    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**
    

3.部署ssh信任(所有节点)

1).创建秘钥对

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

2).发送公钥,包括自己

ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.3
ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.4
ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.5

4.测试ssh与复制

1).测试ssh

masterha_check_ssh --conf=/etc/mha/app1.cnf
  • 看到如下字样,则测试成功

    Tue Mar 7 01:03:33 2017 - [info] All SSH connection tests passed successfully.

2).测试复制

masterha_check_repl --conf=/etc/mha/app1.cnf
  • 看到如下字样,则测试成功

    MySQL Replication Health is OK.

5.启动MHA

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 &

6.切换master测试

1).登陆从库1,查看复制情况

show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.3
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql01-bin.000003
          Read_Master_Log_Pos: 49423
               Relay_Log_File: mysql02-relay-bin.000005
                Relay_Log_Pos: 49587
        Relay_Master_Log_File: mysql01-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2). 登陆从库2,查看复制情况

show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.3
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql01-bin.000003
          Read_Master_Log_Pos: 49423
               Relay_Log_File: web01-relay-bin.000005
                Relay_Log_Pos: 49587
        Relay_Master_Log_File: mysql01-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

3).停掉主库

/etc/init.d/mysqld stop

4).登录从库1

  • 查看slave状态
    show slave status\G
    Empty set (0.00 sec)
    

    db02的slave已经为空

    5).登录从库2

  • 查看slave状态
    show slave status\G
    *************************** 1. row ***************************
                 Slave_IO_State: Waiting for master to send event
                    Master_Host: 10.0.0.4
                    Master_User: rep
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: mysql-bin.000006
            Read_Master_Log_Pos: 191
                 Relay_Log_File: mysql-db03-relay-bin.000002
                  Relay_Log_Pos: 361
          Relay_Master_Log_File: mysql-bin.000006
               Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
    

    主库已经切换为原来的从库1–10.0.0.4;MHA配置成功

    提示:注意:MHA Manager在failover成功后会自动退出。出故障的原主库在配置更改完后,重新启用后,需要在管理节点上再次运行masterha_check_ssh –conf=/etc/mha/mha.conf,没问题的话,再启动MHA 。

三、配置VIP漂移

1.VIP漂移的两种方式

1).使用keepalived

晓明推荐使用这种方式部署

关于部署keepalived请:阅读部署keepalived 一个简单的监控MySQL脚本:

#! /bin/bash
process=`ps -ef|grep "[m]ysql"|wc -l`
port=`ss -lntup|grep 3306|wc -l`
if [ $process -ne 2 -o $port -ne 1 ];then
    systemctl stop keepalived.service >/dev/null 2>&1
fi

2).通过MHA自带脚本

本文仅做示例,不推荐使用

#根据配置文件中脚本路径编辑
vim /etc/mha/master_ip_failover
#修改以下几行内容
my $vip = '10.0.0.55/24';
my $key = '0';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; 
#添加执行权限,否则mha无法启动
chmod +x /etc/mha/master_ip_failover
4.2.3手动绑定VIP
#绑定vip
ifconfig eth0:0 10.0.0.55/24
#查看vip
ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 10.0.0.51/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.55/24 brd 10.0.0.255 scope global secondary eth0:0

四、参考文献

  1. MHA部署——曾志高翔
  2. MySQL MHA高可用架构——joelhy