13 MySQL MHA集群

作者: Kokoronashi | 来源:发表于2019-02-12 03:54 被阅读17次

    MySQL MHA 集群

    [toc]

    MHA 简介

    MHA ( Master High Availability )

    • youshimaton 开发 https://github.com/yoshinorim
    • 一套优秀的实现 MySQL 高可用的解决方案
    • 数据库的自动故障切换操作能做到在 0~30 秒之内
    • MHA 能确保在故障切换过程中保证数据的一致性,以达到真正意义上的高可用

    MHA 组成

    • MHA Manager ( 管理节点 )

      可以单独部署在一台独立的机器上,管理其他节点

      也可以部署在一台slave节点上

    • MHA Node ( 数据节点 )

      运行在每台MySQL服务器上

    MHA 工作过程

    • 由 Manager 定时探测集群中的 master 节点
    • 当 master 故障时,Manager 自动将拥有最新数据的 slave 提升为新的 master
    • 关键点
      1. 从宕机崩溃的 master 保存二进制日志事件
      2. 识别含有最新更新的 slave
      3. 应用差异的中继日志 ( relay log ) 到其他的 slave
      4. 应用从 master 保存的二进制日志事件
      5. 提升一个slave为新的master
      6. 使其他的slave 连接新的 master 进行复制

    部署 MHA 集群

    部署MySQL 高可用集群 ( MHA + 主从同步 )

    1549818084936

    拓扑结构

    拓扑图

    1549817915989

    IP 规划

    角色 IP地址 主机名
    Master主节点 192.168.1.101 test1
    备用1主节点 192.168.1.102 test2
    备用2主节点 192.168.1.103 test3
    第一台slave 192.168.1.104 test4
    第二台slave 192.168.1.105 test5
    MHA_manager (无mysqld) 192.168.1.106 test6
    VIP地址 192.168.1.100

    开始部署

    部署 数据主机

    101 ~ 105

    1. 配置一主多从

      主机 角色
      数据主机 192.168.1.101 master
      数据主机 192.168.1.102 slave 备用1主节点
      数据主机 192.168.1.103 slave 备用2主节点
      数据主机 192.168.1.104 slave
      数据主机 192.168.1.105 slave
      管理主机 192.168.1.106 manager
    2. 安装依赖的 perl 软件包

    #配置好 epel 源,yum node节点时,可自动安装以下 perl 依赖包
    perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
    perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
    perl-Data-Dumper-2.145-3.el7.x86_64.rpm
    perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
    perl-DBI-1.627-4.el7.x86_64.rpm
    perl-IO-Compress-2.061-2.el7.noarch.rpm
    perl-Net-Daemon-0.48-5.el7.noarch.rpm
    perl-PlRPC-0.2020-14.el7.noarch.rpm
    
    1. 安装软件 mha-node
    yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
    
    1. 配置数据节点 ssh 认证,彼此之间 root 用户无密码登陆
    #配置好后可测试, mha_check_ssh 脚本也可测试.
    ssh host hostname;
    
    1. 授权监控用户
    # 为所有数据主机授权 root用户 管理主机访问监控使用
    grant all on *.* to 'root'@'%' identified by '123456';
    
    1. 所有数据主机服务器启用不自动删除本机的中继日志文件
    # 101~105
    set global relay_log_purge=off;
    # 永久配置
    [mysqld]
    relay_log_purge=off
    
    1. 主库 及 备用主库 特殊配置
    # 为主库 和 备用主库 创建主从复制用户 repl
    # 此拓扑中 为 192.168.1.102 和 103 添加 repl 用户,当默认主库宕机,接管主库的机器需要此用户用作新的主从同步.
    grant replication slave on *.* to 'repl'@'%' identified by '123456'
    
    # 为主库 和 备用主库 半同步复制 101~103
    # 高可用架构下,master和slave需同时启动,以便在主从切换后能继续使用半同步复制
    [mysqld]
    plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
    rpl_semi_sync_master_enabled=1
    rpl_semi_sync_slave_enabled=1
    

    配置 管理主机

    1. 安装依赖的 perl 软件包
    #配置好 epel 源,yum node节点时,可自动安装以下 perl 依赖包
    perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
    perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
    perl-Data-Dumper-2.145-3.el7.x86_64.rpm
    perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
    perl-DBI-1.627-4.el7.x86_64.rpm
    perl-IO-Compress-2.061-2.el7.noarch.rpm
    perl-Net-Daemon-0.48-5.el7.noarch.rpm
    perl-PlRPC-0.2020-14.el7.noarch.rpm
    
    1. 安装 node 和 manager 软件包
    #先安装 node 节点包,manager 依赖 node 
    yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
    yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
    
    1. 配置 ssh 认证, manager 主机,可以 使用 root 用户访问所有数据主机

    2. 修改配置文件

    MHA 配置文件 app1.cnf

    mkdir -p /etc/mha/
    cat > /etc/mha/app1.cnf <<EOF
    #默认配置 可单独写入 /etc/masterha_default.cnf
    [server default]
    manager_workdir=/etc/mha
    manager_log=/etc/mha/manager.log
    master_ip_failover_script=/etc/mha/master_ip_failover
    
    # ssh 认证用户 端口
    ssh_user=root
    ssh_port=22
    
    #主从用户 密码
    repl_user=repl
    repl_password=123123
    
    # manager 主机监控用户 密码 访问所有 数据主机
    user=root
    password=123456
    
    [server1]
    hostname=192.168.1.101
    #默认3306,可省略
    port=3306   
    candidate_master=1
    
    [server2]
    hostname=192.168.1.102
    #设置为候选master
    candidate_master=1
    
    [server3]
    hostname=192.168.1.103
    candidate_master=1
    
    [server4]
    hostname=192.168.1.104
    #不竞选master
    no_master=1
    
    [server5]
    hostname=192.168.1.105
    no_master=1
    
    EOF
    

    master_ip_failover 脚本

    脚本修改 25 - 28

    my $vip = '192.168.1.100/24';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
    

    完整脚本,默认脚本无法正常执行

    cat > /etc/mha/master_ip_failover << EOF
    #!/usr/bin/env perl
    
    #  Copyright (C) 2011 DeNA Co.,Ltd.
    #  You should have received a copy of the GNU General Public License
    #   along with this program; if not, write to the Free Software
    #  Foundation, Inc.,
    #  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    
    ## Note: This is a sample script and is not complete. Modify the script based on your environment.
    
    use strict;
    use warnings FATAL => 'all';
    
    use Getopt::Long;
    use MHA::DBHelper;
    
    my (
      $command,        $ssh_user,         $orig_master_host,
      $orig_master_ip, $orig_master_port, $new_master_host,
      $new_master_ip,  $new_master_port,  $new_master_user,
      $new_master_password
    );
    
    my $vip = '192.168.1.100/24';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
    
    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,
      'new_master_user=s'     => \$new_master_user,
      'new_master_password=s' => \$new_master_password,
    );
    
    exit &main();
    
    sub main {
        print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
        if ( $command eq "stop" || $command eq "stopssh" ) {
            my $exit_code = 1;
            eval {
                print "Disabling the VIP on old master: $orig_master_host \n";
                &stop_vip();
                $exit_code = 0;
            };
            if ($@) {
                warn "Got Error: $@\n";
                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 \n";
                &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 \n";
            exit 0;
        }
        else {
            &usage();
            exit 1;
        }
    }
    sub start_vip() {
        `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
    }
    sub stop_vip() {
         return 0  unless  ($ssh_user);
        `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\n";
    }
    

    测试配置文件

    测试 ssh 认证

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

    测试 主从 状态

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

    启动服务

    手动部署 vip 至 当前主库上

    ifconfig eth0:1 192.168.1.100/24
    

    常用参数

    • 删除宕机主库配置

    --remove_dead_master_conf

    • 忽略xxx.health文件 ( 即8小时内 连续切换主库 )

    --ignore_last_failover

    启动命令

    masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
    

    查看MHA运行状态

    masterha_check_status --conf=/etc/mha/app1.cnf
    app1 (pid:8842) is running(0:PING_OK), master:192.168.1.101
    

    测试高可用集群

    1. 客户端连接vip地址访问数据库
    mysql -uweb -p123123 -h192.168.1.100
    
    1. 测试高可用

    把主机 101 数据库服务停止,自动切换主库,和vip

    mysql -uweb -p123123 -h192.168.1.100
    mysql> select @@hostname;
    +------------+
    | @@hostname |
    +------------+
    | test1      |
    +------------+
    
    # 停止mysql 当前主库
    systemctl stop mysqld
    
    mysql> select @@hostname;
    +------------+
    | @@hostname |
    +------------+
    | test2      |
    +------------+
    

    恢复 MHA 集群

    1. 把宕机的数据库 A 服务器修复.

    2. 重新设置已修复 A 服务器 为当前主库的从库,保证数据主从同步.

      生产环境,需要保证 A 数据先和 当前主库数据保持一致.

    3. 重新添加服务器 A 配置文件.至app1.cnf

    4. 重新启动MHA,测试

    相关文章

      网友评论

        本文标题:13 MySQL MHA集群

        本文链接:https://www.haomeiwen.com/subject/tofheqtx.html