美文网首页mysql
Mysql数据库MariaDB数据库MHA高可用程序

Mysql数据库MariaDB数据库MHA高可用程序

作者: yichen_china | 来源:发表于2018-12-20 19:36 被阅读4次

    声明:本次实验使用的是MariaDB数据库,所以本文中所出现的MariaDB与MySQL都是指的是MariaDB!!!

    MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL主从复制架构提供 了 automating master failover 功能。MHA 在监控到master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。

    MHA是由日本人yoshinorim(原就职于DeNA现就职于FaceBook)开发的比较成熟的MySQL高可用方案。MHA能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品TMHA,目前已支持一主一从。

    下图是MHA的架构图:


    image

    MHA介绍:
    MHA 服务有两种角色,MHA Manager(管理节点)和 MHA Node(数据节点):

    MHA Manager:
    通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个master/slave 集群称作一个 application,用来管理统筹整个集群。

    MHA node:
    运行在每台 MySQL 服务器上(master/slave/manager),它通过监控具备解析和清理 logs 功能的脚本来加快故障转移。主要是接收管理节点所发出指令的代理,代理需要运行在每一个mysql节点上。

    简单讲node就是用来收集从节点服务器上所生成的bin-log。对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地应用后提升为主节点。

    MHA常用工具:
    MHA会提供诸多工具程序,其常见的如下所示

    Manager节点:

        masterha_check_ssh :MHA依赖的ssh环境监测工具
        masterha_check_repl: MYSQL复制环境检测工具;
        masterga_manager: MHA 服务主程序
        masterha_check_status: MHA 运行状态探测工具;
        masterha_master_monitor:MYSQL master节点可用性监测工具;
        masterha_master_swith:master节点切换工具;
        masterha_conf_host:添加或删除配置的节点;
        masterha_stop:关闭MHA服务的工具。
    

    Node节点:

        save_binary_logs:保存和复制master的二进制日志;
        apply_diff_relay_logs:识别差异的中继日志事件并应用于其他slave;
        purge_relay_logs:清除中继日志(不会阻塞SQL线程);
    

    自定义扩展:

        secondary_check_script:通过多条网络路由检测master的可用性;
        master_ip_failover_script:更新application使用的masterip;
        report_script:发送报告
        init_conf_load_script:加载初始配置参数;
        master_ip_online_change_script:更新master节点ip地址;
    

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

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

    实验配置
    一、准备实验MYSQL Replication环境:
    MHA对MYSQL复制环境有特殊要求,例如各节点都要开启二进制日志及中继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等,这里对配置做事先说明。

    本实验环境共有四个节点,其角色分配如下:

    node1:MariaDB master
    node2: MariaDB slave1
    node3: MariaDB slave2
    node4: MHA Manager
    

    各节点的/etc/hosts文件配置内容中添加:

    172.17.254.76     manager.wereal.top  manager
    172.17.250.230    master.wereal.top   master
    172.17.254.165    slave1.wereal.top   slave1
    172.17.254.180    slave2.wereal.top   slave2 
    

    1、初始主节点master配置:

    [root@CentOS7-master ~]# vim /etc/my.cnf
    [mysqld]
    server-id = 1
    log-bin = master-log
    relay-log = relay-log
    skip_name_resolve = ON
    

    2、所有slave节点依赖的配置:

    [root@CentOS7-slave1 ~]# vim /etc/my.cnf
    [mysqld]
    server-id = 2  #复制集群中的各节点的id均必须唯一;
    relay-log = relay-log  #开启中继日志;
    log-bin = master-log   #开启二进制日志,因为每一台slave都可能会变成master;
    read_only = ON  #开启只读权限;
    relay_log_purge = 0 #是否自动清空不再需要的中继日志;
    skip_name_resolve = ON  #不进行域名解析
    
    [root@CentOS7-slave2 ~]# vim /etc/my.cnf
    [mysqld]
    server-id = 3 #复制集群中的各节点的id均必须唯一;
    relay-log = relay-log
    log-bin = master-log
    read_only = ON
    relay_log_purge = 0 #是否自动清空不再需要中继日志
    skip_name_resolve = ON
    

    3、启动各项服务于进程
    按上述要求分别配置好主从节点之后,按MYSQL复制配置架构的配置方式将其配置完成并启动master节点和各slave节点,以及为各slave节点启动其IO和SQL线程,确保主从复制运行无误。操作如下:


    image.png

    master节点上:

    MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave@172.17.%.%' IDENTIFIED BY 'wereal';
    MariaDB [(none)]>
    MariaDB [(none)]> FLUSH PRIVILEGES;
    MariaDB [(none)]>
    MariaDB [(none)]> SHOW MASTER STATUS;
    

    各slave节点上:

    MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.17.250.230', MASTER_USER='slave', MASTER_PASSWORD='wereal', MASTER_LOG_FILE='master-log.000003', MASTER_LOG_POS=498;
    MariaDB [(none)]> 
    MariaDB [(none)]> START SLAVE;
    MariaDB [(none)]> 
    MariaDB [(none)]> SHOW SLAVE STATUS\G;
    

    二、安装配置MHA
    1、权限设置
    在所有MYSQL节点授权拥有管理权限的用户可在本地网络中有其他节点上远程访问。当然,此时仅需要且只能在master节点运行类似如下SQL语句即可。

    mysql> GRANT ALL ON *.* TO 'mhaadmin'@'172.17.%.%' IDENTIFIED BY 'mhapass';
    

    2、准备基于SSH互信通信环境:
    MHA集群中的各节点彼此之间均需要基于ssh互信通信,以实现远程控制及数据管理功能。简单起见,可在Manager节点生成密钥对儿,并设置其可远程连接本地主机后,将私钥文件及authorized_keys文件复制给余下的所有节点即可。

    下面操作在Manager 节点上操作(其余机器上的操作也是一样的!!! ):

    [root@manager ~]# ssh-keygen -t rsa
    [root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.17.254.76
    [root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.17.250.230
    [root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.17.254.165
    [root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.17.254.180
    

    3、 进行MHA安装包安装
    Manager 节点(安装会报缺少依赖包):

    yum install mha4mysql-manager-0.56-0.el6.noarch.rpm
    
    wget ftp://ftp.muug.mb.ca/mirror/centos/7.4.1708/os/x86_64/Packages/perl-5.16.3-292.el7.x86_64.rpm
    wget ftp://ftp.muug.mb.ca/mirror/centos/7.4.1708/os/x86_64/Packages/compat-db47-4.7.25-28.el7.x86_64.rpm
    wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
    wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm  
    wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/perl-Mail-Sender-0.8.23-1.el7.noarch.rpm  
    wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
    wget http://mirror.centos.org/centos/7.4.1708/os/x86_64/Packages/perl-Time-HiRes-1.9725-3.el7.x86_64.rpm
    

    所有节点,包括Manager:

    yum install mha4mysql-node-0.56-0.el6.norch.rpm
    

    说明:在manager上若是选择本地安装,则最好将两个包全都下载下来,然后执行以下指令,将两个包一起安装! 命令如下:

    yum -y localinstall mha4mysql-*
    

    4、初始化MHA,进行配置
    Manager 节点需要为每个监控的master/slave集群提供一个专用的配置文件,而所有的master/slave集群也可共享全局配置。全局配置文件默认为/etc/masterha_default.cnf,其为可选配置。如果仅监控一组master/slave集群,也可直接通过application的配置来提供各服务器的默认配置信息。而每个application的配置文件路径为自定义。

    5、 定义MHA管理配置文件
    在manager上为MHA专门创建一个管理用户,方便以后使用,在mysql的主节点上,三个节点自动同步 。

    [root@manager ~]# mkdir /etc/mha_master 
    [root@manager ~]# vim /etc/mha_master/app1.cnf
    
    • 配置文件内容如下(下面配置的注释内容是无效的,使用时要去掉!):*
    [server default] //适用于server1,2,3个server的配置 
    user=mhaadmin //mha管理用户 
    password=mhapass //mha管理密码 
    manager_workdir=/etc/mha_master/app1 //mha_master自己的工作路径 
    manager_log=/etc/mha_master/manager.log // mha_master自己的日志文件
    remote_workdir=/mydata/mha_master/app1 //每个远程主机的工作目录在何处
    ssh_user=root // 基于ssh的密钥认证 
    repl_user=slave//数据库用户名 
    repl_password=magedu //数据库密码 
    ping_interval=1 // ping间隔时长 
    
    [server1] //节点1,[server1]节点必须设置成master 
    hostname=172.17.250.230 //节点1主机地址 
    ssh_port=22 //节点1的ssh端口 
    candidate_master=1 // 将来可不可以成为master候选节点/主节点 
    
    [server2] //节点3 
    hostname=172.17.254.165 //节点1主机地址 
    ssh_port=22 //节点1的ssh端口 
    candidate_master=1 // 将来可不可以成为master候选节点/主节点 
    
    [server3] //节点2
    hostname=172.17.254.180
    ssh_port=22 
    candidate_master=1
    

    节点设置,有几台主从机器,就要设置几个[serverX]([server default]除外,[server default]是必须要有的!“X”为具体的数字!),节点设置必须要从[server1]开始!!

    6、进行节点检测
    首先检测各节点间ssh互信通信配置是否Ok:

    [root@nmanager ~]# masterha_check_ssh -conf=/etc/mha_master/app1.cnf 
    

    输出信息最后一行类似如下信息,表示其通过检测。
    [info]All SSH connection tests passed successfully.
    若是报错,则要检查几台机器的ssh设置是否都可以实现无秘钥访问!
    检测各节点权限设置是否生效:

    [root@manager ~]# masterha_check_repl -conf=/etc/mha_master/app1.cnf
    
    image.png

    如果测试时会报错,可能是从节点上没有账号,因为这个架构,任何一个从节点,将有可能成为主节点,所以也需要创建账号;若是报错,则要检查MySQLy用户是否授权!
    因此,这里只要在各节点上执行以下操作,对manager进行授权即可:

    MariaDB [(none)]>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave@172.17.%.%' IDENTIFIED BY 'wereal';
    MariaDB [(none)]> 
    MariaDB [(none)]> FLUSH PRIVILEGES;
    

    在Manager节点上再次运行,就显示Ok了。

    三、启动MHA

    [root@manager ~]#nohup masterha_manager -conf=/etc/mha_master/app1.cnf &> /etc/mha_master/manager.log &
    

    启动成功后,可用过如下命令来查看master节点的状态:

    [root@manager ~]# masterha_check_status -conf=/etc/mha_master/app1.cnf
    

    执行上面指令后,显示如下的信息app1 (pid:4978)is running(0:PING_OK),表示MHA服务运行OK,否则,则会显示为类似app1 is stopped(1:NOT_RUNNINg).

    app1 (pid:4978)is running(0:PING_OK),master:172.17.250.230 
    

    如果要停止MHA,需要使用master_stop命令。

    [root@manager ~]# masterha_stop -conf=/etc/mha_master/app1.cnf
    

    四、测试MHA测试故障转移
    1、在master节点关闭mariadb服务,模拟主节点数据崩溃

    [root@master ~]# killall -9 mysqld mysqld_safe
    [root@master ~]# rm -rf /var/lib/mysql/*
    

    2、在manager节点查看日志:
    /etc/mha_master/app1/manager.log 日志文件中出现如下信息,表示manager检测到172.17.250.230节点故障,而后自动执行故障转移,将172.17.254.180提升为主节点。注意,故障转移完成后,manager将会自动停止,此时使用masterha_check_status 命令检测将会遇到错误提示,如下所示:

    [root@manager ~]# masterha_check_status –conf=/etc/mha_master/app1.cnf
    

    提示信息:app1 is stopped(2:NOT_RINNING).


    image.png

    3、提供新的从节点以修复复制集群
    原有 master 节点故障后,需要重新准备好一个新的 MySQL 节点。基于来自于master 节点的备份恢复数据后,将其配置为新的 master 的从节点即可。

    注意,新加入的节点如果为新增节点,其 IP 地址要配置为原来 master 节点的 IP,否则,还需要修改 app1.cnf 中相应的 ip 地址。随后再次启动 manager,并再次检测其状态。

    4、新节点提供后再次执行检查操作

    [root@manager ~]# masterha_check_status -conf=/etc/mha_master/app1.cnf
    [root@manager ~]# masterha_check_repl -conf=/etc/mha_master/app1.cnf
    

    检查无误,再次运行,这次要记录日志

    [root@manager ~]# masterha_manager -conf=/etc/mha_master/app1.cnf > /etc/mha_master/manager.log 2>&1
    

    五、新节点上线,故障转换恢复注意事项
    1、在生产环境中,当你的主节点挂了后,一定要在从节点上做一个备份,拿着备份文件把主节点手动提升为从节点,并指明从哪一个日志文件的位置开始复制。
    2、每一次自动完成转换后,每一次的(replication health )检测不ok始终都是启动不了必须手动修复主节点,除非你改配置文件
    3、手动修复主节点提升为从节点后,再次运行检测命令

    [root@manager ~]# masterha_check_repl --conf=/etc/mha_master/app1.cnf
    app1 (pid:3211) is running(0:PING_OK), master:172.17.254.165
    

    4、再次运行起来就恢复成功了

    [root@manager ~]# masterha_manager -conf=/etc/mha_master/app1.cnf
    

    相关文章

      网友评论

        本文标题:Mysql数据库MariaDB数据库MHA高可用程序

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