zoukankan      html  css  js  c++  java
  • MHA高可用配置及故障切换

    一、MHA概述

    1、传统的MySQL主从架构存在的问题

    MySQL主服务器出故障后就无法写入数据了

    2、MHA简介
    一套优秀的MySQL高可用环境下故障切换和主从复制的软件
    MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换

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

    4、MHA特点(优势)
    在 MHA 自动故障切换过程中,MHA 试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过 SSH 访问,MHA 没法保存二进制日志,就会出现只进行故障转移但丢失了最新的数据的情况。
    使用 MySQL 5.5 的半同步复制,可以大大降低数据丢失的风险。MHA 可以与半同步复 制结合起来。如果只有一个 slave 已经收到了最新的二进制日志,MHA 可以将最新的二进 制日志应用于其他所有的 slave 服务器上,因此可以保证所有节点的数据一致性。

    5、MHA架构
    目前MHA支持一主多从架构,最少三台服务,即一主两从

    MHA工作原理总结为以下几条:

    1. 从宕机崩溃的master保存二进制日志事件(binlog events);
    2. 识别含有最新更新的slave;
    3. 应用差异的中继日志(relay log)到其他slave;
    4. 应用从master保存的二进制日志事件(binlog events);
    5. 提升一个slave为新master;
    6. 使用其他的slave连接新的master进行复制。

      

    原理

    ​ 相较于其它HA软件,MHA的目的在于维持MySQL 主从复制中主库的高可用性,其最大特点是可以修复多个从库之间的差异日志,最终使所有从库保持数据一致,然后从中选择一个充当新的主库,并将其它从库指向它。
    基本工作流程大致如下:

    (1)Manager定期监控主库

    ​ Manager会定时监控主库状态,监控时间间隔由参数ping_interval决定,缺省为3秒钟一次;可利用其自身的监控功能,也可调用第三方软件来监控;MHA自身提供了两种监控方式:SELECT(执行SELECT 1)和CONNECT(创建连接/断开连接),由参数ping_type决定,缺省为SELECT方式。

    (2)主库故障发生

    ​ Manager会调用SSH脚本对所有Node执行一次检查,包括如下几个方面:
    ――MySQL实例是否可以连接;
    ――主库服务器是否可以SSH连通;
    ――检查SQL Thread的状态;
    ――检查哪些从库死掉了,哪些从库是活动的,以及活动的从库实例数据是否完整;
    ――检查从库实例的配置及复制过滤规则;
    ――最后退出监控脚本并返回相应的状态代码。

    (3)主库故障切换

    ​ 包括如下几个阶段:

    3.1 Configuration Check Phase(检查配置)

    ​ 在这个阶段,若某个从库实例的SQL Thread停止了,则会自动启动它;并再次确认活动的Servers及Slaves。

    3.2 Dead Master Shutdown Phase(关闭死主)

    ​ 在这个阶段,首先调用master_ip_failover_script,若HA是基于VIP实现的,则关闭VIP,若是基于目录数据库实现的,则修改映射记录。然后调用shutdown_script强制关闭主机,以避免服务重启时,发生脑裂。

    3.3 Master Recovery Phase(确立新主库)

    ​ 包括如下3个阶段:

    3.3.1 Getting Latest Slaves Phase(检查从库)

    ​ 检查各个从库,获取最近的和最旧的binary log和position,并检查各个从库成为主库的优先级,优先级取决于candidate_master、no_master、[server_xxx]顺序、binary log差异量等因素。

    3.3.2 Saving Dead Master’s Binlog Phase(保存死主日志)

    ​ 若死主所在服务器依然可以通过SSH连通,则提取出死主的binary log,提取日志的起点就是上一步获取的最新的binary log和position,直到最后一条事务日志,并在死主本地的工作目录(由参数remote_workdir决定)中创建文件保存这些提取到的日志,然后将该文件拷贝到Manager服务器的工作目录下(由参数manager_workdir决定)。当然,若死主所在服务器无法再连接,也就不存在差异的binary log了。另外,MHA还要对各个从库节点进行健康检查,主要是SSH连通性检查。

    3.3.3 Determining New Master Phase(建立新主)

    ​ 接下来调用apply_diff_relay_logs恢复从库间的差异日志,这个差异日志指的是各个从库之间的relay log差异。恢复完成后,所有的从库数据是一致的,此时就可以根据优先级选择新主了。

    3.3.4 New Master Diff Log Generation Phase(新主生成差异日志)

    ​ 这一步是生成已死主和新主之间的差异日志,即将3.3.2中从已死主上提取出的binary log拷贝到新主的工作目录中(remote_workdir)。

    3.3.5 Master Log Apply Phase(新主日志复制)

    ​ 将上一步拷贝的差异日志恢复到新主上,若发生错误,也可手动恢复。然后获取新主的binlog name和position,让其它从库从这个新的binlog name和position开始复制。最后会开启新主的写权限,也就是将read_only参数设置为0。

    3.4 Slaves Recovery Phase(确立新主从关系)

    ​ 包括如下2个阶段:

    3.4.1 Starting Parallel Slave Diff Log Generation Phase

    ​ 生成新主与新从库之间的差异日志,并将该日志拷贝到各从库的工作目录下。

    3.4.2 Starting Parallel Slave Log Apply Phase

    ​ 在各个从库上应用这部分差异日志,然后通过CHANGE MASTER TO命令将这些从库指向新主,最后开始主从复制(start slave)。

    3.5 New master cleanup phase(新主洗白)

    ​ 重置新主的slave info,即取消原来的从库信息。至此整个主库故障切换过程完成。

    二、MHA高可用案例

    在这里插入图片描述

    三、具体过程

    3.1、实验需求

    MHA 监控 MySQL数据库健康状态,在主服务器故障时进行自动切换,不影响业务。

    3.2、实验思路

    1.MHA架构

    1)数据库安装
    2)一主两从
    3)MHA搭建

    2.故障模拟

    1)主库失效
    2)备选主库成为主库
    3)从库2将备选主库指向为主库

    3.故障修复

    1)坏库修复,启动
    2)在修复好的库上建立新主从关系
    3)修改manager配置文件,添加修好的库的记录
    4)重启mha

    3.3、实验环境

    主机名IP地址角色软件包
    Master 20.0.0.10 主服务器 node数据节点软件包
    Slave1 20.0.0.20 主备/从服务器 node数据节点软件包
    Slave2 20.0.0.30 从服务器 node数据节点软件包
    Manger 20.0.0.40 从服务器 node数据节点软件包/Manger管理节点软件包

    3.4、实验步骤

    配置MySQL主从同步

    1、安装 MySQL 数据库

    在三台 MySQL 节点上分别安装数据库,MySQL 版本请使用 5.6.36,cmake 版本请使
    用 2.8.6。
    1.1安装主服务器

    主服务器
    yum -y install ncurses-devel gcc-c++ perl-Module-Install
    tar zxvf cmake-2.8.6.tar.gz
    cd cmake-2.8.6
    ./configure
    gmake && gmake install
    cd
    tar zxvf mysql-5.6.36.tar.gz
    cd mysql-5.6.36
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
    make && make install
    cp support-files/my-default.cnf /etc/my.cnf
    cp support-files/mysql.server /etc/rc.d/init.d/mysqld
    chmod +x /etc/rc.d/init.d/mysqld
    chkconfig --add mysqld
    echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    source /etc/profile
    groupadd mysql
    useradd -M -s /sbin/nologin mysql -g mysql
    chown -R mysql.mysql /usr/local/mysql
    mkdir -p /data/mysql
    /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
    echo '
    [client]
    port = 3306
    socket = /usr/local/mysql/mysql.sock
    
    [mysql]
    port = 3306
    socket = /usr/local/mysql/mysql.sock
    
    [mysqld]
    user = mysql
    basedir = /usr/local/mysql
    datadir = /usr/local/mysql/data
    port = 3306
    pid-file = /usr/local/mysql/mysqld.pid
    socket = /usr/local/mysql/mysql.sock
    server-id = 1
    log_bin = master-bin
    log-slave-updates = true
    
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf
    ln -s /usr/local/mysql/bin/mysql /usr/sbin/
    ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
    systemctl start mysqld
    netstat -anpt | grep 3306
    

    1.2安装从服务器

    从1服务器
    yum -y install ncurses-devel gcc-c++ perl-Module-Install
    tar zxvf cmake-2.8.6.tar.gz
    cd cmake-2.8.6
    ./configure
    gmake && gmake install
    cd
    tar zxvf mysql-5.6.36.tar.gz
    cd mysql-5.6.36
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
    make && make install
    cp support-files/my-default.cnf /etc/my.cnf
    cp support-files/mysql.server /etc/rc.d/init.d/mysqld
    chmod +x /etc/rc.d/init.d/mysqld
    chkconfig --add mysqld
    echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    source /etc/profile
    groupadd mysql
    useradd -M -s /sbin/nologin mysql -g mysql
    chown -R mysql.mysql /usr/local/mysql
    mkdir -p /data/mysql
    /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
    echo '
    [client]
    port = 3306
    socket = /usr/local/mysql/mysql.sock
    
    [mysql]
    port = 3306
    socket = /usr/local/mysql/mysql.sock
    
    [mysqld]
    user = mysql
    basedir = /usr/local/mysql
    datadir = /usr/local/mysql/data
    port = 3306
    pid-file = /usr/local/mysql/mysqld.pid
    socket = /usr/local/mysql/mysql.sock
    server-id = 2
    log_bin = master-bin
    relay-log = relay-log-bin
    relay-log-index = slave-relay-bin.index
    
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf
    ln -s /usr/local/mysql/bin/mysql /usr/sbin/
    ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
    systemctl start mysqld
    netstat -anpt | grep 3306
    

    1.3安装从2服务器 

    从2服务器
    yum -y install ncurses-devel gcc-c++ perl-Module-Install
    tar zxvf cmake-2.8.6.tar.gz
    cd cmake-2.8.6
    ./configure
    gmake && gmake install
    cd
    tar zxvf mysql-5.6.36.tar.gz
    cd mysql-5.6.36
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
    make && make install
    cp support-files/my-default.cnf /etc/my.cnf
    cp support-files/mysql.server /etc/rc.d/init.d/mysqld
    chmod +x /etc/rc.d/init.d/mysqld
    chkconfig --add mysqld
    echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    source /etc/profile
    groupadd mysql
    useradd -M -s /sbin/nologin mysql -g mysql
    chown -R mysql.mysql /usr/local/mysql
    mkdir -p /data/mysql
    /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
    echo '
    [client]
    port = 3306
    socket = /usr/local/mysql/mysql.sock
    
    [mysql]
    port = 3306
    socket = /usr/local/mysql/mysql.sock
    
    [mysqld]
    user = mysql
    basedir = /usr/local/mysql
    datadir = /usr/local/mysql/data
    port = 3306
    pid-file = /usr/local/mysql/mysqld.pid
    socket = /usr/local/mysql/mysql.sock
    server-id = 3
    relay-log = relay-log-bin
    relay-log-index = slave-relay-bin.index
    
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf
    ln -s /usr/local/mysql/bin/mysql /usr/sbin/
    ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
    systemctl start mysqld
    netstat -anpt | grep 3306
    

      

    1.4、修改 Master 的主配置文件/etc/my.cnf 文件,三台服务器的 server-id 不能一样,删除字符集utf8的语句

    vi /etc/my.cnf
    [mysqld]
    server-id = 1
    log_bin = master-bin
    log-slave-updates = true
    

    1.5、修改从服务、etc/my.cnf配置文件

    从一。vi /etc/my.cnf
    [mysqld]
    server-id = 2
    log_bin = master-bin
    relay_bin = relay-log-bin
    relay_log_index = slave-relay-bin.index
    
     从2.vi /etc/my.cnf
    [mysqld]
    server-id = 3
    relay_log = relay-log-bin
    relay_log_index = slave-relay-bin.index
    

    2、每个MySQL做两个软链接,为HMA服务

    ln -s /usr/local/mysql/bin/mysql /usr/sbin
    ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin
    

    3、启动MySQL服务

    systemctl start mysqld
    

    4、配置mysql 一直两从

    4.1 首先在所有数据库节点上授权两个用户,一个是从库同步使用,另外一个是  manager使用。

    1 mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123';
    2 mysql> grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';
    3 mysql> flush privileges;
    

    4.2在主服务器上查看二进制文件和同步点

    mysql> show master status;
    +-------------------+----------+--------------+------------------+-------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +-------------------+----------+--------------+------------------+-------------------+
    | master-bin.000001 |      608 |              |                  |                   |
    +-------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    4.3在从1 和 从2 分别执行同步,查看 IO 和 SQL 线程都是 yes 代表同步是否正常  

    mysql> change master to master_host='20.0.0.10',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=608; 
    mysql> start slave;
    mysql> show slave statusG;
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    

    4.4 将两个从库设置为只读模式

     

     mysql> set global read_only=1;
    

    4.5 在主库插入两条数据,测试是否同步

    mysql> create database test_xuhao;
    mysql> use test_xuhao;
    mysql> create table test(id int);
    mysql> insert into test(id) values (1);
    mysql> select * from test;
    

    4.6 在两个从库分别查询如下所示说明主从同步正常

    从1
    mysql> select * from test_xuhao.test;
    +------+
    | id   |
    +------+
    |    2 |
    +------+
    1 row in set (0.00 sec)
    从2
    mysql> select * from test_xuhao.test;
    +------+
    | id   |
    +------+
    |    2 |
    +------+
    1 row in set (0.00 sec)
    

    4.7.安装MHA软件

    1、所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源

    yum -y install epel-release --nogpgcheck
    yum -y install perl-DBD-MySQL 
    perl-Config-Tiny 
    perl-Log-Dispatch 
    perl-Parallel-ForkManager 
    perl-ExtUtils-CBuilder 
    perl-ExtUtils-MakeMaker 
    perl-CPAN
    

    2、MHA软件包对于每个操作系统版本不一样,这里Centos7.6必须选择0.57版本,在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。

    注意:所有服务器上必须安装node组件,最后在MHA-manager节点上安装manager组件

     tar zxf mha4mysql-node-0.57.tar.gz 
     cd mha4mysql-node-0.57/
    perl Makefile.PL
     make install
    

    3、在 MHA-manager 上安装 manager 组件

    tar zxf mha4mysql-manager-0.57.tar.gz 
    cd mha4mysql-manager-0.57/
    perl Makefile.PL
    make && make install
    

    manager 安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:

    
    
     cd /usr/local/bin
     ll
    总用量 84
    -r-xr-xr-x. 1 root root 16381 10月 27 18:36 apply_diff_relay_logs
    -r-xr-xr-x. 1 root root  4807 10月 27 18:36 filter_mysqlbinlog
    -r-xr-xr-x. 1 root root  1995 10月 27 18:39 masterha_check_repl ###检查 MySQL 复制状况
    -r-xr-xr-x. 1 root root  1779 10月 27 18:39 masterha_check_ssh ###检查 MHA 的 SSH 配置状况
    -r-xr-xr-x. 1 root root  1865 10月 27 18:39 masterha_check_status ###检测当前 MHA 运行状态
    -r-xr-xr-x. 1 root root  3201 10月 27 18:39 masterha_conf_host ###添加或删除配置的 server 信息
    -r-xr-xr-x. 1 root root  2517 10月 27 18:39 masterha_manager ###启动 manager的脚本
    -r-xr-xr-x. 1 root root  2165 10月 27 18:39 masterha_master_monitor ###检测 master 是否宕机
    -r-xr-xr-x. 1 root root  2373 10月 27 18:39 masterha_master_switch ###控制故障转移(自动或者手动)
    -r-xr-xr-x. 1 root root  5171 10月 27 18:39 masterha_secondary_check
    -r-xr-xr-x. 1 root root  1739 10月 27 18:39 masterha_stop ###关闭manager
    -r-xr-xr-x. 1 root root  8261 10月 27 18:36 purge_relay_logs
    -r-xr-xr-x. 1 root root  7525 10月 27 18:36 save_binary_logs
    

    node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHA
    Manager 的脚本触发,无需人为操作)主要如下:  

    save_binary_logs  ###保存和复制 master 的二进制日志
    apply_diff_relay_logs  ###识别差异的中继日志事件并将其差异的事件应用于其他的 slave
    filter_mysqlbinlog  ###去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
    purge_relay_logs  ###清除中继日志(不会阻塞 SQL 线程)
    

    5、配置 无密码认证

    5.1   在 manager服务器 上配置到所有节点的无密码认证

    ssh-keygen -t rsa       #一路按回车键
    ssh-copy-id 20.0.0.10    #先输入yes,再输入20.0.0.10服务器的密码
    ssh-copy-id 20.0.0.20
    ssh-copy-id 20.0.0.30
    验证
    ssh root@20.0.0.10
    ssh root@20.0.0.20
    ssh root@20.0.0.30
    

    5.2在主服务器上配置到数据库节点的无密码认证

    ssh-keygen -t rsa
    ssh-copy-id 20.0.0.20
    ssh-copy-id 20.0.0.30
    验证
    ssh root@20.0.0.20
    ssh root@20.0.0.30
    

    5.3在从1服务器上配置到数据库节点的无密码认证

    ssh-keygen -t rsa
    ssh-copy-id 20.0.0.10
    ssh-copy-id 20.0.0.30
    验证
    ssh root@20.0.0.10
    ssh root@20.0.0.30
    

    5.4在从2服务器上配置数据库节点的无密码认证

     

    ssh-keygen -t rsa
    ssh-copy-id 20.0.0.10
    ssh-copy-id 20.0.0.20
    验证
    ssh root@20.0.0.10
    ssh root@20.0.0.20
    

    6、配置MHA

    6.1在 manager 节点上复制相关脚本到/usr/local/bin 目录,复制上述的自动切换时 VIP 管理的脚本到/usr/local/bin 目录,这里使用脚本管理 VIP

    cp -ra mha4mysql-manager-0.57/samples/scripts /usr/local/bin
    ll /usr/local/bin/scripts/
    cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
    vi /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 = '20.0.0.200';
    my $brdc = '20.0.0.255';
    my $ifdev = 'ens33';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
    my $exit_code = 0;
    #my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
    #my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
    ##################################################################################
    GetOptions(
    'command=s' => $command,
    'ssh_user=s' => $ssh_user,
    'orig_master_host=s' => $orig_master_host,
    'orig_master_ip=s' => $orig_master_ip,
    'orig_master_port=i' => $orig_master_port,
    'new_master_host=s' => $new_master_host,
    'new_master_ip=s' => $new_master_ip,
    'new_master_port=i' => $new_master_port,
    );
    
    exit &main();
    
    sub main {
    
    print "
    
    IN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===
    
    ";
    
    if ( $command eq "stop" || $command eq "stopssh" ) {
    
    my $exit_code = 1;
    eval {
    print "Disabling the VIP on old master: $orig_master_host 
    ";
    &stop_vip();
    $exit_code = 0;
    };
    if ($@) {
    warn "Got Error: $@
    ";
    exit $exit_code;
    }
    exit $exit_code;
    }
    elsif ( $command eq "start" ) {
    
    my $exit_code = 10;
    eval {
    print "Enabling the VIP - $vip on the new master - $new_master_host 
    ";
    &start_vip();
    $exit_code = 0;
    };
    if ($@) {
    warn $@;
    exit $exit_code;
    }
    exit $exit_code;
    }
    elsif ( $command eq "status" ) {
    print "Checking the Status of the script.. OK 
    ";
    exit 0;
    }
    else {
    &usage();
    exit 1;
    }
    }
    sub start_vip() {
    `ssh $ssh_user@$new_master_host " $ssh_start_vip "`;
    }
    # A simple system call that disable the VIP on the old_master
    sub stop_vip() {
    `ssh $ssh_user@$orig_master_host " $ssh_stop_vip "`;
    }
    
    sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port
    ";
    }
    
     拷贝后会有四个执行文件,文件的含义如下:
     1 master_ip_failover              #自动切换时 VIP 管理的脚本
     2 master_ip_online_change         #在线切换时 vip 的管理
     3 power_manager                   #故障发生后关闭主机的脚本
     4 send_report                     #因故障切换后发送报警的脚本
    

    6.2 创建 MHA 软件目录并拷贝配置文件

    1 mkdir /etc/masterha
     2 cp mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
     3 vim /etc/masterha/app1.cnf
     4 [server default]
     5 manager_workdir=/var/log/masterha/app1
     6 manager_log=/var/log/masterha/app1/manager.log
     7 master_binlog_dir=/usr/local/mysql/data
     8 master_ip_failover_script= /usr/local/bin/master_ip_failover
     9 master_ip_online_change_script= /usr/local/bin/master_ip_online_change10 password=manager
    11 user=mha
    12 ping_interval=1
    13 remote_workdir=/tmp
    14 repl_password=123
    15 repl_user=myslave
    16 secondary_check_script= /usr/local/bin/masterha_secondary_check -s 20.0.0.20 -s 20.0.0.30
    17 shutdown_script=""
    18 ssh_user=root
    19 [server1]
    20 hostname=20.0.0.10
    21 port=3306
    22 [server2]
    23 hostname=20.0.0.20
    24 port=3306
    25 candidate_master=1
    26 check_repl_delay=0
    27 [server3]
    28 hostname=20.0.0.30
    29 port=3306
    

    6.3  测试 ssh 无密码认证,如果正常最后会输出 successfully,如下所示

    masterha_check_ssh -conf=/etc/masterha/app1.cnf
    ......
    Wed Oct 28 00:07:09 2020 - [debug]  Connecting via SSH from root@20.0.0.30(20.0.0.30:22) to root@20.0.0.20(20.0.0.20:22)..
    Wed Oct 28 00:07:10 2020 - [debug]   ok.
    Wed Oct 28 00:07:10 2020 - [debug]
    Wed Oct 28 00:07:08 2020 - [debug]  Connecting via SSH from root@20.0.0.20(20.0.0.20:22) to root@20.0.0.10(20.0.0.10:22)..
    Wed Oct 28 00:07:09 2020 - [debug]   ok.
    Wed Oct 28 00:07:09 2020 - [debug]  Connecting via SSH from root@20.0.0.20(20.0.0.20:22) to root@20.0.0.30(20.0.0.30:22)..
    Wed Oct 28 00:07:09 2020 - [debug]   ok.
    Wed Oct 28 00:07:10 2020 - [info] All SSH connection tests passed successfully.
    

    6.4测试 MySQL 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常

    masterha_check_repl -conf=/etc/masterha/app1.cnf
    ......
    IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 20.0.0.200===
    
    Checking the Status of the script.. OK
    Wed Oct 28 09:25:28 2020 - [info]  OK.
    Wed Oct 28 09:25:28 2020 - [warning] shutdown_script is not defined.
    Wed Oct 28 09:25:28 2020 - [info] Got exit code 0 (Not master dead).
    
    MySQL Replication Health is OK.
    

    6.5启动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 &
    

    6.6查看 MHA 状态,可以看到当前的 master 是主服务器节点

    1 masterha_check_status --conf=/etc/masterha/app1.cnf
    2 app1 (pid:24405) is running(0:PING_OK), master:20.0.0.10
    

      

    6.7 、查看 MHA 日志,也以看到当前的 master 是 20.0.0.10

    cat /var/log/masterha/app1/manager.log
    ......
    Wed Oct 28 09:27:04 2020 - [info]     Replicating from 20.0.0.10(20.0.0.10:3306)
    Wed Oct 28 09:27:04 2020 - [info] Current Alive Master: 20.0.0.10(20.0.0.10:3306)
    Wed Oct 28 09:27:04 2020 - [info] Checking slave configurations..
    Wed Oct 28 09:27:04 2020 - [warning]  relay_log_purge=0 is not set on slave 20.0.0.20(20.0.0.20:3306).
    Wed Oct 28 09:27:04 2020 - [warning]  relay_log_purge=0 is not set on slave 20.0.0.30(20.0.0.30:3306).
    Wed Oct 28 09:27:04 2020 - [warning]  log-bin is not set on slave 20.0.0.30(20.0.0.30:3306). This host cannot be a master.
    ......
    

    6.8   第一次配置vip的时候,需要在主服务器上创建虚拟IP地址

    1 ifconfig ens33:1 20.0.0.200/24
    2 ifconfig
    

    四、故障测试

    1、关闭主服务器的mysql服务查看从1服务器的虚拟IP地址有没有转移过来,从2上查看主服务器是不是从1

    从1服务器
    ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 20.0.0.20  netmask 255.255.255.0  broadcast 20.0.0.255
            inet6 fe80::a140:18a2:d866:8f33  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:42:10:0a  txqueuelen 1000  (Ethernet)
            RX packets 1315993  bytes 1324408060 (1.2 GiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 795190  bytes 69519345 (66.2 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 20.0.0.200  netmask 255.0.0.0  broadcast 20.255.255.255
            ether 00:0c:29:42:10:0a  txqueuelen 1000  (Ethernet)
    
    从2服务器
    mysql
    mysql> show slave status G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 20.0.0.20
                      Master_User: myslave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: master-bin.000003
              Read_Master_Log_Pos: 120
                   Relay_Log_File: relay-log-bin.000002
                    Relay_Log_Pos: 284
            Relay_Master_Log_File: master-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ......
    

    2、重新开启manager服务器,主服务器开启mysql服务

    1 systemctl restart mysqld
    

    3、查看从1服务器查看二进制文件和同步点

     

    mysql> show master status;
    +-------------------+----------+--------------+------------------+-------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +-------------------+----------+--------------+------------------+-------------------+
    | master-bin.000003 |      120 |              |                  |                   |
    +-------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    4、在主服务器上执行同步,查看 IO 和 SQL 线程都是 yes 代表同步是否正常

    mysql>  change master to
    master_host='20.0.0.20',master_user='myslave',master_password='123',master_log_file='master-bin.000003',master_log_pos=120;
    mysql> start slave;
    mysql> show slave status G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 20.0.0.20
                      Master_User: myslave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: master-bin.000003
              Read_Master_Log_Pos: 120
                   Relay_Log_File: mysqld-relay-bin.000002
                    Relay_Log_Pos: 284
            Relay_Master_Log_File: master-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes18  ......
    

    5、在从1上创建,主服务器和从2上查看

    从1服务器
    mysql> create database aa;
    mysql> use aa;
    mysql> create table test(id int(3));
    mysql> insert into test values(1);
    mysql> select * from test;
    +------+
    | id   |
    +------+
    |    2 |
    +------+
    
    主服务器
    mysql> use aa;
    mysql> select * from test;
    +------+
    | id   |
    +------+
    |    2 |
    +------+
    
    从2服务器
    mysql> use aa;
    mysql> select * from test;
    +------+
    | id   |
    +------+
    |    2 |
    +------+
    

    6、在manager服务器上修改配置文件(再把这个记录添加进去,因为它检测掉失效时候会自动消失)

    1 vi /etc/masterha/app1.cnf
    2 ......
    3 [server1]
    4 hostname=192.168.8.134
    5 port=3306
    6 ......
    

    7、在manager服务器上启动manager

    1 masterha_check_ssh -conf=/etc/masterha/app1.cnf
    2 masterha_check_repl -conf=/etc/masterha/app1.cnf
    3 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 &
    4 masterha_check_status --conf=/etc/masterha/app1.cnf

      

      

      

     

      

      

      

      

     

      

     

      

      

      

      

      

     

     

     

      

      

      

      

      

  • 相关阅读:
    taotao订单系统
    使用JMeter进行一次简单的带json数据的post请求测试
    taotao购物车2 解决购物车本地cookie和服务器redis不同步的问题
    Dubbo入门介绍---搭建一个最简单的Demo框架
    关于地图模糊
    二维纹理 Texture 2D
    TexturePacker
    Unity3D实现3D立体游戏原理及过程,需偏振眼镜3D显
    解决RegexKitLite编译报错
    QualitySettings 3d模型质量显示设置
  • 原文地址:https://www.cnblogs.com/tianzhendengni/p/13899545.html
Copyright © 2011-2022 走看看