• MHA高可用配置及故障切换


    引言

    MySQL服务器中,单台服务器无法承受服务量就配置多台MySQL服务器,多台MySQL服务器或者MySQL服务器五冗余的情况下,配置主从复制。没有上去看服务器的读和写的压力不均衡可使用MySQL的读写分离,MySQL的读写分离中Master存在单点故障,就得用到MHA。

    一、MySQL四种同步方式

    MySQL有四种同步方式:

    1. 异步复制(Async Replication)
    2. 同步复制(sync Replication)
    3. 半同步复制(Async Replication)
    4. 增强半同步复制(lossless Semi-Sync Replication)、无损复制

    1.1 异步复制(Async Replication)

    主库将更新写入Binlog日志文件后,不需要等待数据更新是否已经复制到从库中,就可以继续处理更多的请求。Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。MySQL复制默认是异步复制,异步复制提供了最佳性能。

    1.2 同步复制(Sync Replication)

    主库将更新写入Binlog日志文件后,需要等待数据更新已经复制到从库中,并且已经在从库执行成功,然后才能返回继续处理其它的请求。同步复制提供了最佳安全性,保证数据安全,数据不会丢失,但对性能有一定的影响。

    1.3 半同步复制(Semi-Sync Replication)

    写入一条数据请求到master,从服务器只要有一台接收到写入自己的中继日志,会给客户端返回一条接收成功的信息。
    **主库提交更新写入二进制日志文件后,等待数据更新写入了从服务器中继日志中,然后才能再继续处理其它请求。该功能确保至少有1个从库接收完主库传递过来的binlog内容已经写入到自己的relay log里面了,才会通知主库上面的等待线程,**该操作完毕。
    半同步复制,是最佳安全性与最佳性能之间的一个折中。
    MySQL 5.5版本之后引入了半同步复制功能,主从服务器必须安装半同步复制插件,才能开启该复制功能。如果等待超时,超过rpl_semi_sync_master_timeout参数设置时间(默认值为10000,表示10秒),则关闭半同步复制,并自动转换为异步复制模式。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为增强半同步复制。
    ACK (Acknowledge character)即是确认字符。

    1.4 增强半同步复制(lossless Semi-Sync Replication、无损复制)

    增强半同步是在MySQL 5.7引入,其实半同步可以看成是一个过渡功能,因为默认的配置就是增强半同步,所以,大家一般说的半同步复制其实就是增强的半同步复制,也就是无损复制。
    增强半同步和半同步不同的是,等待ACK时间不同
    rpl_semi_sync_master_wait_point = AFTER_SYNC(默认)
    半同步的问题是因为等待ACK的点是Commit之后,此时Master已经完成数据变更,用户已经可以看到最新数据,当Binlog还未同步到Slave时,发生主从切换,那么此时从库是没有这个最新数据的,用户看到的是老数据。
    增强半同步将等待ACK的点放在提交Commit之前,此时数据还未被提交,外界看不到数据变更,此时如果发送主从切换,新库依然还是老数据,不存在数据不一致的问题。

    二 、MHA概念

    1. MHA(MsterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件

    2. MHA的出现就是解决MySQL单点故障的问题

    3. MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作

    4. MHA能再故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用

    2.1、MHA组成

    MHA Node运行在每台MySQL服务器上

    2.2、MHA Manager(管理节点)

    1. MHA Manager可以单独部署在一台独立的机器上,管理多个master-slave集群;;也可以部署在一台slave节点上。
    2. MHA Manager会定时探测集群中的master节点。当master出现故障时,它可以自动将最新的数据slave提升为新的master,然后将所有其他的slave重新指向新的master
    3. 整个故障转移过程对应用程序玩侵权透明

    2.3、MHA的特点

    1. 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
    2. 使用版同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
    3. 目前MHA支持一主多从架构,最少三台服务,即一主两从

    MHA :为了解决的是故障切换、数据尽可能的保存,以及所有节点日志的一致性

    三、MHA工作原理

    MHA Manager管理多组主从复制。。

    MHA工作原理:

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

    四、搭建mysql MHA

    4.1、实验思路

    MHA

    1、数据库安装

    2、一主两从

    3、MHA搭建

    故障模拟

    1、主库失效

    2、备选库成为主库

    3、原故障主库恢复恢复重新加入到MHA成为主库

    4.2、实验环境

    主机IP地址
    MHA manager192.168.100.60
    Master192.168.100.3
    slave1192.168.100.20
    slave2192.168.100.50

    在实验开始前需要关闭防火墙

    #每台服务器都需要执行一遍
    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0

    4.3、配置主从复制

    配置主从复制先修改配置文件

    在进行mha安装前,我们需要先做主从复制

    #Master 节点##
    vim /etc/my.cnf
    [mysqld]
    server-id = 1
    log_bin = master-bin    #开启二进制文件
    log-slave-updates = true  #开启从服务器日志同步
     
    systemctl restart mysqld    #配置完成重启服务
     
    ##Slave1 节点##
    vim /etc/my.cnf
    server-id = 2                         #三台服务器的 server-id 不能一样
    log_bin = master-bin  #以防单点故障的时候切换
    relay-log = relay-log-bin   #开启中继日志
    relay-log-index = slave-relay-bin.index  #定义index索引
     
    systemctl restart mysqld
     
     
    ###Slave2 节点##
    vim /etc/my.cnf
    server-id = 3                         #三台服务器的 server-id 不能一样
    relay-log = relay-log-bin
    relay-log-index = slave-relay-bin.index
     
    systemctl restart mysqld

    注意: 三台机子都要重启mysql!!!

    4、在 Master、Slave1、Slave2 节点上都创建两个软链接

    将mysql命令和日志软链接到/usr/sbin,便于系统识别

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

    5、配置MySQL一主两从

    5.1 所有数据库节点进行 mysql 授权(三台机子)

    mysql -uroot -p
    grant replication slave on *.* to 'myslave'@'192.168.100.%' identified by '199710';        #从数据库同步使用
    grant all privileges on *.* to 'mha'@'192.168.100.%' identified by 'manager';        #manager 使用

    grant all privileges on *.* to 'mha'@'master' identified by 'manager';                #防止从库通过主机名连接不上主库
    grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
    grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
    flush privileges;

    扩展(报错):给从服务器授权时,可能会出现密码不符合当前策略要求

    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    您的密码不符合当前策略要求

    解决方法:
    在数据库配置文件中添加一行,关闭密码策略

    validate_password=off

    5.2 在 Master 节点查看二进制文件和同步点

    1、show master status;

    5.3 在 Slave1、Slave2 节点执行同步操作

    change master to

    master_host='192.168.109.12',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1747; 

    start slave;

    5.4 Slave1、Slave2 节点设置为只读模式

    1、set global read_only=1;

    5.5 验证主从同步

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

    1、create database test_lcdb;
    2、use test_lcdb;
    3、create table test(id int,name char(10));
    4、insert into test values (1,'lcdb');

    6、安装 MHA 软件

    6.1 所有服务器上都安装 MHA 依赖的环境

    1、yum install epel-release --nogpgcheck -y

    2、yum install -y perl-DBD-MySQL \
    perl-Config-Tiny \
    perl-Log-Dispatch \
    perl-Parallel-ForkManager \
    perl-ExtUtils-CBuilder \
    perl-ExtUtils-MakeMaker \
    perl-CPAN

     

    注:所有服务器都要安装依赖环境,包括MHA manager服务器

    6.2 安装MHA 软件包

    在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件

     

     注:所有服务器都要安装,这里就不一一截图展示了。

    6.3 在 MHA manager 节点上安装 manager 组件

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

     注:所有服务器都要安装,这里就不一一截图展示了。

    扩展:manager组件安装后也会在/usr/local/bin 下面会生成几个脚本

    主要包括以下几个:

    masterha_check_ssh    检查 MHA 的 SSH 配置状况
    masterha_check_repl    检查 MySQL 复制状况
    masterha_manger    启动 manager的脚本
    masterha_check_status    检测当前 MHA 运行状态
    masterha_master_monitor    检测 master 是否宕机
    masterha_master_switch    控制故障转移(自动或者手动)
    masterha_conf_host    添加或删除配置的 server 信息
    masterha_stop    关闭manager

    4.5、在所有服务器上配置无密码认证

    在manager节点上配置到所有数据库节点的无密码认证

    ssh-keygen -t rsa                 #一路按回车键
    ssh-copy-id 192.168.100.3     #master
    ssh-copy-id 192.168.100.20     #slave1
    ssh-copy-id 192.168.100.50    #slave2

    ​​​​​​​

    在master配置到数据库节点slave1和slave2的无密码认证

    ssh-keygen -t rsa
    ssh-copy-id 192.168.100.20
    ssh-copy-id 192.168.100.50

    在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证

    ssh-keygen -t rsa
    ssh-copy-id 192.168.100.3
    ssh-copy-id 192.168.100.50

    在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证

    ssh-keygen -t rsa
    ssh-copy-id 192.168.130.3
    ssh-copy-id 192.168.130.20

    4.6、在manager节点上配置MHA

    在manager节点上复制相关脚本到/usr/local/bin目录

    cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
     
    #复制后会有四个执行文件
    ll /usr/local/bin/scripts/

    master_ip_failover自动切换时 VIP 管理的脚本
    master_ip_online_change在线切换时 vip 的管理
    power_manager故障发生后关闭主机的脚本
    send_report因故障切换后发送报警的脚本

    复制自动切换时VIP管理的脚本到/usr/local/bin目录

    cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

    修改master_ip_failover脚本

    删除原有内容,直接复制并修改vip相关参数

    vim /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 $3vip = '192.168.100.100';                                    #指定vip的地址
    my $brdc = '192.168.100.255';                                #指定vip的广播地址
    my $ifdev = 'ens33';                                        #指定vip绑定的网卡
    my $key = '1';                                                #指定vip绑定的虚拟网卡序列号
    my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";        #使用ifoconfig命令将其启动,同时设置浮动地址
    my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";        #可以使用ifconfig命令将其down掉(关闭)
    my $exit_code = 0;                                            #指定退出状态码为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 "\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 \"`;
    }
    ## 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\n";
    }
     

    创建MHA如案件目录并复制配置文件

    使用app1.cnf配置文件来管理mysql节点服务器,配置文件一般放在/etc目录下

    mkdir /etc/masterha
    cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha

    ls /etc/masterha/

     vim /etc/masterha/app1.cnf                    #删除原有内容,直接复制并修改节点服务器的IP地址
     
    [server default]
    #日志文件
    manager_log=/var/log/masterha/app1/manager.log
    #工作目录
    manager_workdir=/var/log/masterha/app1
    #二进制文件
    master_binlog_dir=/usr/local/mysql/data
    #故障转移切换工具
    master_ip_failover_script=/usr/local/bin/master_ip_failover
    #在线切换VIP工具管理
    master_ip_online_change_script=/usr/local/bin/master_ip_online_change
    #以下是密码账号的管理配置
    password=manager  #前文创建监控用户mha的密码
    ping_interval=1   #设置监控主库,发送ping包的事件间隔1s,默认是3s,尝试三次没有回应自动进行failover
    remote_workdir=/tmp   #在远端mysql在发生切换后时binlog的保存位置
    repl_password=123456  #设置复制用户的密码
    repl_user=myslave     #设置复制用户的用户名
    secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.130.200 -s 192.168.130.201   #这里定义的IP都是从数据库服务器节点的IP
    shutdown_script=""  #设置故障发送后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发送脑裂,这里没有使用)
    ssh_user=root  #设置ssh的登陆用户名
    user=mha      #设置监控用户root(管理员)
     
    [server1]
    hostname=192.168.130.15
    port=3306
     
    [server2]
    candidate_master=1   #手动指定主-备服务器 主服务器宕机,优先选则这台为主
    check_repl_delay=0
    hostname=192.168.130.200
    port=3306
     
    [server3]
    hostname=192.168.130.201
    port=3306

    4.7、在Master服务器上手动开启vip

    ifconfig ens33:1 192.168.130.100/24
    ifconfig ens33:1

    4.8、在manager节点上测试ssh无密码认证

    如果正常最后会输出 successfully,如下所示。

    masterha_check_ssh

    -conf=/etc/masterha/app1.cnf

    在 manager 节点上测试 mysql 主从连接情况

    最后出现 MySQL Replication Health is OK 字样说明正常。

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

    在 manager 节点上启动 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 &

    - -remove_dead_master_conf该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
    - -manger_log日志存放位置。

    - -ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记目录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover。

    查看 MHA 状态,可以看到当前的 master

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

    12.2 查看 MHA 日志,可以看到当前的 master

    cat /var/log/masterha/app1/manager.log | grep "current master"

     12.3 如果要关闭 manager 服务

    masterha_stop --conf=/etc/masterha/app1.cnf
    或者可以直接采用 kill 进程 ID 的方式关闭

    三、故障模拟

    1、在 manager 节点上监控观察日志记录

    tail -f /var/log/masterha/app1/manager.log

    ​​​​​​​

    2、模拟master节点故障关闭服务

    正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将宕机的 mysql1 节点删除。

     

     

  • 相关阅读:
    WSL2安装Docker
    leetcode做题笔记140. 单词拆分 II
    【虚幻引擎UE】UE5 C++环境异常原因及解决方案
    Playcanvas后处理-辉光bloom
    论文阅读:scHybridBERT
    基于机器学习和OpenCV的激光雷达数据分割和分类
    Vue2基础学习
    冬季来到安化云台山,你来得正是时候
    JavaScript函数中this的指向问题讨论(普通函数和箭头函数)
    B站基于Iceberg+Alluxio助力湖仓一体项目落地实践
  • 原文地址:https://blog.csdn.net/weixin_71429850/article/details/127088565