美文网首页数据存储
数据库架构之【MySQL8+MHA】RDBMS 主从库高可用方案

数据库架构之【MySQL8+MHA】RDBMS 主从库高可用方案

作者: 张毅SOHO | 来源:发表于2020-06-20 06:51 被阅读0次

    MySQL8 是一款功能强大且开源的(遵循GPL协议)关系型数据库管理系统(RDBMS)。

    MHA(Master High Availability) 是一个成熟的 MySQL 高可用解决方案。作为 MySQL 高可用性环境下故障切换和主从提升的高可用中间件,在 MySQL 故障切换过程中,能做到在 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中能够最大程度上保证数据的一致性。它由两部分组成:

    MHA Manager(管理节点):MHA Manager 可以部署在一台独立的服务器上,同时管理一个或多个 MySQL 主备集群;也可以部署一个 MySQL 主备集群的 Slave 节点上管理该集群 。

    MHA Node(数据节点):MHA Node 运行在每台 MySQL 服务器上,MHA Manager 会定时探测主备集群中的主库节点,当主库出现故障时,它可以自动将最新数据的从库提升为新的主库,然后将所有其他的从库重新指向新的主库。整个故障转移过程对应用程序完全透明。

    MHA 主要支持一主多从的主备库架构,搭建 MHA,要求一个 MySQL 主备集群中必须最少有三台数据库服务器,一台充当主库,一台充当备用主库,另外一台充当从库。

    在 MHA 自动故障切换过程中,MHA 试图从宕机的主库节点上保存二进制日志,最大程度的保证数据的不丢失,但如果主服务器硬件故障或无法通过 SSH 访问,MHA 没法保存二进制日志,只进行故障转移而丢失了最新的数据。如果只有一个从库已经收到了最新的二进制日志,MHA 可以将最新的二进制日志应用于其他所有的从库服务器上,因此可以保证所有节点的数据一致性。

    本方案基于CentOS8系统设计,建议在RedHat/CentOS系统中使用。部署数据库集群使用服务器及网络资源较多,建议在实施前做好规划工作,有利于部署工作顺利、有序进行。

    目录

    1.集群工作模式

    2.集群部署拓扑图

    3.MySQL8 + Replication 主备库部署方案

    4.MHA 安装和配置


    1.集群工作模式

    集群具有故障转移功能,每个集群由≥3个数据库节点组成。

    1、主要特点:

    1)多个数据库节点并行工作。

    2)主要数据库节点失效后,由从属数据库节点接管。

    3)数据只通过主要数据库节点进行读写,主要数据库节点将通过内置的 Replication 组件,将数据复制到从属数据库节点。

    2、故障转移工作原理:

    1)从宕机崩溃的主库保存二进制日志事件(Binlog Events);

    2)识别含有最近更新的从库;

    3)应用最近更新的差异的中继日志 (Relay Log) 到其他从库;

    4)应用从主库保存的二进制日志事件(Binlog Events);

    5)提升一个从库为新主库;

    6)将其他从库连接到新的主库上。


    2.集群部署拓扑图

    集群部署拓扑图

    网络资源规划:

    1、MySQL 主备集群

    节点名 主机名 IP:PORT 程序 操作系统
    主库 Master 192.168.0.20:3306 MySQL8 CentOS8
    从库-1 Slaver-1 192.168.0.21:3306 MySQL8 CentOS8
    从库≥2 Slaver-2 192.168.0.22:3306 MySQL8 CentOS8

    2、MHA 管理端

    • 主机名:MHA;
    • IP地址和端口号:192.168.0.10;
    • 中间件:MHA Manager;
    • 虚拟IP:192.168.0.11。MHA Manager 创建的 VIP,客户端通过 VIP 访问 MySQL 数据库;
    • 操作系统:CentOS7;

    注意:目前 MHA Manager 仅支持 CentOS7 版本。

    3、客户端:同一网段计算机,部署 HeidiSQL 或应用系统的调用程序模块。


    3.MySQL8 + Replication 主备库部署方案

    1、在 MySQL 主备集群的全部节点上安装 MySQL8 数据库。

    有关如何安装 MySQL8 数据库,请阅读文章《RedHat/CentOS8【MySQL8】安装、配置和管理》,文章地址【https://www.jianshu.com/p/b68e2120a068】。

    2、在 MySQL 主备集群上部署 MySQL 主从库。

    有关如何部署 MySQL8 主备数据库,请阅读文章《数据库架构之【MySQL8+Replication】RDBMS 主从库读写分离方案》,文章地址【https://www.jianshu.com/p/af9d16ce00f9】。


    4.MHA Node 安装和配置

    以 "MySQL 主备集群" 中的 "主库" 为例:

    1、安装 EPEL 的 Yum 源。

    使用文本编辑器创建仓库配置文件:

    [centos@Master ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo
    

    在文件中编写以下内容并保存:

    [epel-modular]
    name=Extra Packages for Enterprise Linux Modular $releasever - $basearch
    baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch
    enabled=1
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
    
    [epel]
    name=Extra Packages for Enterprise Linux $releasever - $basearch
    baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
    enabled=1
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
    

    更新 Yum 源:

    [centos@Master  ~]$ sudo dnf clean all
    [centos@Master  ~]$ sudo dnf makecache
    Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB     00:00    
    Extra Packages for Enterprise Linux 8 - x86_64  3.7 MB/s | 6.9 MB     00:01    
    元数据缓存已建立。
    

    EPEL(Extra Packages for Enterprise Linux)是企业级 Linux 操作系统的扩展包仓库,为 Redhat/CentOS系统提供大量的额外软件包。

    2、打开 MHA Node 下载页面【https://github.com/yoshinorim/mha4mysql-node/releases】,下载并安装 RPM 安装包到用户主目录中。

    3、安装 MHA Node。

    [centos@Master ~ ]$ sudo dnf localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm
    

    程序安装目录是 "/usr/bin",安装程序:

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

    4、创建 MHA 管理用户并加入到 "mysql" 组,设置登录口令。

    [centos@Master ~ ]$ sudo useradd -G mysql mha
    [centos@Master ~ ]$ sudo passwd mha
    

    5、为 MHA 管理用户增加"/sbin/ipconfig"指令的管理员免密运行权限。

    使用文本编辑器打开"/etc/sudoers"文件:

    [centos@Master ~]$ sudo gedit /etc/sudoers
    

    在文件尾部追加以下内容并保存:

    mha ALL=NOPASSWD: /sbin/ifconfig
    

    注意: "MySQL 主备集群" 中的所有数据库节点上全部需要按照以上步骤配置后,再进行后续配置。

    6、为 MHA 管理用户创建本地和远程数据库节点的 SSH 互信。

    1)生成本地节点秘钥文件:

    [centos@Master ~]$ su mha
    [mha@Master ~]$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/mha/.ssh/id_rsa): 
    Created directory '/home/mha/.ssh'.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/mha/.ssh/id_rsa.
    Your public key has been saved in /home/mha/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:mT2GpWyqAFIezVDcSIAdah5BtcctnOgjGaDRk1FUkdk mha@Master
    ......
    

    2)创建本地及远程节点登录信息加密文件。注意所有节点都需要创建本地及远程节点登录信息加密文件:

    [mha@Master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.20
    [mha@Master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.21
    [mha@Master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.22
    

    注意: "MySQL 主备集群" 中的所有数据库节点上全部需要按照以上步骤配置。


    5.MHA Mnager 安装和配置

    1、安装 EPEL 的 Yum 源。

    使用文本编辑器创建仓库配置文件:

    [centos@MHA  ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo
    

    在文件中编写以下内容并保存:

    [epel]
    name=Extra Packages for Enterprise Linux $releasever - $basearch
    baseurl=http://mirrors.aliyun.com/epel/$releasever/$basearch
    enabled=1
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7
    

    更新 Yum 源:

    [centos@Master ~]$ sudo yum clean all
    [centos@Master ~]$ sudo yum makecache
    Loading mirror speeds from cached hostfile
    epel                                                     | 4.7 kB     00:00      
    元数据缓存已建立
    

    EPEL(Extra Packages for Enterprise Linux)是企业级 Linux 操作系统的扩展包仓库,为 Redhat/CentOS系统提供大量的额外软件包。

    2、打开 MHA Manager 下载页面【https://github.com/yoshinorim/mha4mysql-manager/releases】,下载并安装 RPM 安装包和 TAR 包到用户主目录中。

    3、安装 MHA Node 和 MHA Manager。

    [centos@MHA ~ ]$ sudo yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm
    [centos@MHA ~ ]$ sudo yum localinstall mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
    

    程序安装目录是 "/usr/bin",安装程序:

    安装程序 功能说明
    masterha_check_ssh 检查 MHA 的 SSH 配置状况
    masterha_check_repl 检查 MySQL 复制状况
    masterha_manger 启动 MHA
    masterha_check_status 检测当前 MHA 运行状态
    masterha_master_monitor 检测主库是否宕机
    masterha_master_switch 控制故障转移(自动或者手动)
    masterha_conf_host 添加或删除配置的节点信息
    save_binary_logs 保存和复制主库的二进制日志
    apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的从库
    filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
    purge_relay_logs 清除中继日志(不会阻塞SQL线程)

    4、解压 MHA Manager 的 TAR 包。

    [centos@MHA ~ ]$ tar -zxvf mha4mysql-manager-0.58.tar.gz
    

    5、创建 MHA Manager 的配置目录、脚本目录。

    [centos@MHA ~ ]$ sudo mkdir -p /etc/masterha
    [centos@MHA ~ ]$ sudo mkdir -p /script/masterha
    

    6、从 MHA Manager 的 TAR 包中配置文件模板拷贝到 "/etc/masterha" 目录下。

    [centos@MHA ~ ]$ sudo cp ~/mha4mysql-manager-0.58/samples/conf/* /etc/masterha
    [centos@MHA ~ ]$ sudo cp ~/mha4mysql-manager-0.58/samples/scripts/* /script/masterha
    

    7、为 MHA Manager 程序管理用户(本例为 centos 用户)创建本地和远程数据库节点的 SSH 互信。

    1)生成本地节点秘钥文件:

    [centos@MHA ~]$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/centos/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/centos/.ssh/id_rsa.
    Your public key has been saved in /home/centos/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:ZNkHt8/68enFM68bdcWSxGzV88xv3Bs9dtDLGF1IyNI centos@MHA
    ......
    

    2)创建 MySQL 主备集群节点登录信息加密文件:

    [mha@MHA ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.20
    [mha@MHA ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.21
    [mha@MHA ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.22
    

    8、创建工作目录,并将所有者授予 MHA Manager 程序管理用户(本例为 centos 用户)。

    [centos@MHA ~ ]$ sudo mkdir -p /var/log/masterha/app1
    [centos@MHA ~ ]$ sudo chown -R centos:centos /var/log/masterha
    

    9、设置 MHA Manager 配置文件参数。

    使用文本编辑器创建配置文件:

    [centos@MHA ~ ]$ sudo gedit /etc/masterha/app1.cnf
    

    编辑或验证文件中的以下参数并保存:

    # 服务器通用参数。
    [server default]
    # 工作目录。
    manager_workdir=/var/log/masterha/app1
    # 日志目录。
    manager_log=/var/log/masterha/app1/manager.log
    
    # MySQL 管理用户账号。
    user=root
    # MySQL 管理用户口令。
    password=password
    # MySQL Replication 用户账号。
    repl_user=repl
    # MySQL Replication 用户口令。
    repl_password=password
    # SSH 远程控制端口号。
    ssh_port=22
    # SSH 远程控制用户账号。
    ssh_user=mha
    # 设置远端 MySQL 数据库保存 binlog 的位置。在 my.cnf 文件中使用 log-bin 参数设置,默认情况下在数据存储目录。
    master_binlog_dir=/data/mysql/data
    # 设置远端 MySQL 主库在发生切换时 binlog 的保存位置。
    remote_workdir=/tmp
    # 实现多路由监测备选主库的可用性。
    secondary_check_script= masterha_secondary_check -s 192.168.0.20 -s 192.168.0.21
    # 监控主库,设置发送 PING 包的时间间隔,默认是3秒,尝试3次不成功,则自动进行切换操作。
    ping_interval=3
    
    # 自动故障切换 VIP 时调用的脚本。(一般需要编辑该脚本实现 VIP 的漂移)
    master_ip_failover_script= /script/masterha/master_ip_failover
    # 人工切换 VIP 时调用的脚本。(可不指定)
    # master_ip_online_change_script= /script/masterha/master_ip_online_change
    # 设置故障发生后关闭故障主机时调用的脚本。(可不指定)
    # shutdown_script= /script/masterha/power_manager
    # 设置发生切换后发送的报警的脚本。(可不指定)
    # report_script= /script/masterha/send_report
    
    # MySQL节点配置-1
    [server1]
    # MySQL 实例的 IP或 DNS 。
    hostname=192.168.0.20
    # MySQL 实例的端口号。
    port=3306
    # 设置为 1 时,主库故障时,优先提升当前节点为新的主库。
    candidate_master=1
    # 默认情况下,如果当前从库落后主库 100M 的 relaylog 将不会提升当前从库作为一个新的主库,设置为 0 时,MHA触发切换时将会忽略复制延时,一般与 candidate_master=1 组合使用。
    check_repl_delay=0
    
    # MySQL节点配置-2
    [server2]
    hostname=192.168.0.21
    
    # MySQL节点配置≥3
    [server3]
    hostname=192.168.0.22
    # 设置为 1 时,不会提升当前节点为新的主库。
    no_master=1
    

    注意,MHA 管理端可以同时管理多个 MySQL 主备集群。每个集群需要配置单独的配置文件,如: "app1.cnf" 和 "app2.cnf" 。

    10、编辑 MHA Manager 自动故障切换 VIP 时调用的脚本。

    使用文本编辑器创建配置文件:

    [centos@MHA ~ ]$ sudo gedit /script/masterha/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 = '192.168.0.11/24';
    my $key = '0';
    my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
    my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$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 {
        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 -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
    }
    sub stop_vip() {
        `ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $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";
    }
    

    11、在 MySQL 主库节点上初始化绑定 VIP 。

    [centos@MHA ~ ]$ /script/masterha/master_ip_failover --command=start  --new_master_host=192.168.0.20 --ssh_user=mha
    

    12、检查 SSH 配置有效性。

    [centos@MHA ~ ]$ masterha_check_ssh --conf=/etc/masterha/app1.cnf
    

    13、检查 MySQL 配置有效性。

    [centos@MHA ~ ]$ masterha_check_repl --conf=/etc/masterha/app1.cnf
    

    14、启动 MHA Mnanger 。启动 MHA Manager 之前,应当保证在 MySQL 主备集群中的所有节点已准备就绪。

    [centos@MHA ~ ]$ masterha_manager --conf=/etc/masterha/app1.cnf
    

    或者后台运行

    [centos@MHA ~ ]$ nohup masterha_manager --conf=/etc/masterha/app1.cnf > /dev/null
    

    注意:不建议设置为开机自启动。

    15、检查 MySQL 配置有效性。

    [centos@MHA ~ ]$ masterha_check_status --conf=/etc/masterha/app1.cnf
    app1 (pid:3333) is running(0:PING_OK), master:192.168.0.20
    

    16、手工切换主节点。

    [centos@MHA ~ ]$ masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.0.21 --new_master_port=3306  --orig_master_is_new_slave --running_updates_limit=10000
    

    5.MHA 故障恢复

    1、查看新的主库节点配置信息。

    [centos@Slaver-1 ~]$ mysql -u root -p
    Enter password:
    mysql>use mysql;
    mysql>show master status\G;
    
    # 响应信息。其中 "File" 和 "Position" 字段的数据值在配置从库节点时需要使用。
    *************************** 1. row ***************************
                 File: binlog.000006
             Position: 812
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    

    2、查看故障主库节点配置信息。

    [centos@Master ~]$ mysql -u root -p
    Enter password:
    mysql>use mysql;
    mysql>show master status\G;
    
    # 响应信息。其中 "File" 和 "Position" 字段的数据值在配置从库节点时需要使用。
    *************************** 1. row ***************************
                 File: mysql-bin.000001
             Position: 155
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    

    3、修改故障主库的配置文件,追加只读设置。

    使用文本编辑器打开配置文件:

    [centos@Master ~]$ sudo gedit /etc/my.cnf
    

    追加或验证文件中的以下参数并保存:

    # 表示开启超级用户(如 root 用户)的数据库只读模式。
    super_read_only=on
    
    # 表示开启普通用户的数据库只读模式。
    read_only=on
    

    4、重新启动故障主库。

    [centos@Master ~]$ sudo systemctl restart mysqld.service
    

    5、将故障主库降级为从库。

    [centos@Master ~]$ mysql -u root -p
    Enter password:
    
    # 设置新主库的关联信息,注意"master_log_file"需要指定新主库的文件,"master_log_pos"需要指定故障主库的位置。
    mysql>change master to master_host='192.168.0.21',master_port=3306,master_user='repl',master_password='password',master_log_file='binlog.000006',master_log_pos=155
    
    # 启动从库同步。
    mysql>start slave;
    
    # 查看从库状态。
    mysql>show slave status\G;
    
    # 响应信息。正常情况下 "Slave_IO_Running" 和 "Slave_SQL_Running" 都应为 Yes 。
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.0.21
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: binlog.000006
              Read_Master_Log_Pos: 1205
                   Relay_Log_File: Master-relay-bin.000004
                    Relay_Log_Pos: 493
            Relay_Master_Log_File: binlog.000006
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ......
    

    相关文章

      网友评论

        本文标题:数据库架构之【MySQL8+MHA】RDBMS 主从库高可用方案

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