zoukankan      html  css  js  c++  java
  • 第九章 MySQL 高可用(MHA)

    MySQL 高可用(MHA)

    一 MHA高可用部署

    需要使用的前提:

      当普通主从复制不能满足我们的需求,  主节点宕机  影响业务的不间断运行。这里就需要用到MHA 高可用

    1. MHA高可用的介绍  

       不支持多实例, 必须是单独的物理机
       manager 程序负责监控已知Node 节点(1主2从接点)

    2. 当主机意外宕机

    ① mysql实例故障(SSH能够连接到主机)

    1 监控到主库宕机,选择一个新主(取消从库角色,reset slave),选择标准:数据较新的从库会被选择为新主(show slave statusG)
    2 从库通过MHA自带脚本程序,立即保存缺失部分的binlog
    3 二号从库会重新与新主构建主从关系,继续提供服务
    4 如果VIP机制,将vip从原主库漂移到新主,让应用程序无感知

    ② 主节点服务器宕机(SSH已经连接不上了)

    1 监控到主库宕机,尝试SSH连接,尝试失败
    2 选择一个数据较新的从库成为新主库(取消从库角色 reset slave),判断细节:show slave statusG
    3 计算从库之间的relay-log的差异,补偿到2号从库
    3 二号从库会重新与新主构建主从关系,继续提供服务
    5 如果VIP机制,将vip从原主库漂移到新主,让应用程序无感知
    6 如果有binlog server机制,会继续讲binlog server中的记录的缺失部分的事务,补偿到新的主库

    3. 安装前 服务器检查

    1) 3台mysql 必须是独立节点  主机名  ip 防火墙关闭等

    2) 开启 1主2从GTID复制结构

    3) 关闭 各个节点relay-log 自动删除功能

    [mysqld]
    relay_log_purge=0

    mysql>  set global relay_log_purge=0;

    退出重登  查看

    mysql>  show  variables  like "%relay_log_purge%";
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | relay_log_purge | OFF   |
    +-----------------+-------+

    4.  安装 mha node

    1) 3个节点安装 node 软件

    rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

    2)主库中创建mha管理用户

    grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';

    3)配置软连接(3个节点)

    ln -s /data/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
    ln -s /data/mysql/bin/mysql /usr/bin/mysql

    4) 部署 manger节点 (建议在从节点db03)

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

    5) 安装  manager软件

    rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm 

    5. 生成MHA的目录与配置文件

    1) 创建Manager必须目录

    [root@db3 ~]# mkdir -p /etc/mha
    [root@db3 ~]# mkdir -p /var/log/mha/app1

    2)创建Manager配置文件

    [server default]
    manager_log=/var/log/mha/app1/manager
    manager_workdir=/var/log/mha/app1
    master_binlog_dir=/data/binlog
    user=mha
    password=mha
    ping_interval=2
    repl_password=123456
    repl_user=repl
    ssh_user=root
    
    [server1]
    hostname=10.0.0.51
    port=3306
    
    [server2]
    hostname=10.0.0.52
    port=3306
    
    [server3]
    hostname=10.0.0.53
    port=3306

    6. 配置互信节点 (每个节点都做)

    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
    
    ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.51
    ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.52
    ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.53

    7. 检测互信

    [root@db3 ~]# masterha_check_ssh  --conf=/etc/mha/app1.cnf

    8. 检测主从

    [root@db3 ~]# masterha_check_repl  --conf=/etc/mha/app1.cnf

    9. 启动MHA manager

    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 &

    10. 查看日志

    [root@db3 app1]# tailf manager
    10.0.0.51(10.0.0.51:3306) (current master)
     +--10.0.0.52(10.0.0.52:3306)
     +--10.0.0.53(10.0.0.53:3306)
    
    Fri Sep 20 15:14:59 2019 - [warning] master_ip_failover_script is not defined.
    Fri Sep 20 15:14:59 2019 - [warning] shutdown_script is not defined.
    Fri Sep 20 15:14:59 2019 - [info] Set master ping interval 2 seconds.
    Fri Sep 20 15:14:59 2019 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes.
    Fri Sep 20 15:14:59 2019 - [info] Starting ping health check on 10.0.0.51(10.0.0.51:3306)..
    Fri Sep 20 15:14:59 2019 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..

    二 故障练习

    1.停掉DB1

      观察 tail -f /var/log/mha/app1/manager

    2. 启动DB1 添加到主从复制环境中

    1) DB1 操作

    mysql > CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123456';

    mysql >  start slave;

    mysql >  show  start statusG;

    2) 修改配置文件 加入故障节点

    vim  /etc/mha/app1.cnf 

    3) 启动MHA了manager程序

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

    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 &

    4) 探测命令(manager端)

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

    需要注意是: 当有一台宕机,切换主库  manager会自动退出


    三. vip 设置

    1. Perl 脚本文件 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 = '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";
    
    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 "`;
    }
    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
    ";
    }
    master_ip_failover

    需要注意的是一定要给执行权限

    chmod +x  /usr/local/bin/master_ip_failover

    2. 脚本文件格式转换

    [root@db3 bin]# dos2unix /usr/local/bin/master_ip_failover

    3.修改 manager端 配置文件

    vim /etc/mha/app1.cnf

    添加:
    master_ip_failover_script=/usr/local/bin/master_ip_failover

    4. 重启 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 &

    需要注意是:

    先手动再主库上绑定vip  需要和脚本文件 master_ip_failover 里面的配置一样

    eth0:1(1是key指定的值)

    ifconfig eth0:1 10.0.0.55/24

    5.开始测试

    看是否会漂移


  • 相关阅读:
    本周工作量统计
    第15周个人作业
    16周第一组作业
    排球比赛积分规则
    典型用户和场景
    我和计算机
    第18周冲刺
    16周个人作业
    Java中动态获取项目根目录的绝对路径
    Spring框架下类的初始化顺序
  • 原文地址:https://www.cnblogs.com/augustyang/p/11556030.html
Copyright © 2011-2022 走看看