mysql实现高可用架构之MHA

一、简介

  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 服务

2.1 服务角色

  MHA 服务有两种角色, MHA Manager(管理节点)和 MHA Node(数据节点):
MHA Manager:
  通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个 master/slave 集群称作一个 application,用来管理统筹整个集群。
MHA node:
  运行在每台 MySQL 服务器上(master/slave/manager),它通过监控具备解析和清理 logs 功能的脚本来加快故障转移。
  主要是接收管理节点所发出指令的代理,代理需要运行在每一个 mysql 节点上。简单讲 node 就是用来收集从节点服务器上所生成的 bin-log 。对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地应用后提升为主节点。

  由上图我们可以看出,每个复制组内部和 Manager 之间都需要ssh实现无密码互连,只有这样,在 Master 出故障时, Manager 才能顺利的连接进去,实现主从切换功能。

2.2提供的工具

  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节点:(这些工具通常由MHA Manager的脚本触发,无需人为操作)
  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地址。

2.3工作原理


MHA工作原理总结为以下几条:
(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);
(2) 识别含有最新更新的 slave ;
(3) 应用差异的中继日志(relay log) 到其他 slave ;
(4) 应用从 master 保存的二进制日志事件(binlog events);
(5) 提升一个 slave 为新 master ;
(6) 使用其他的 slave 连接新的 master 进行复制。

三、实现过程

3.1 准备实验 Mysql 的 Replication 环境

3.1.1 相关配置

  MHA 对 MYSQL 复制环境有特殊要求,例如各节点都要开启二进制日志及中继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等,这里对配置做事先说明。
  本实验环境共有四个节点, 其角色分配如下(实验机器均为centos 7.3):

  为了方便我们后期的操作,我们在各节点的/etc/hosts文件配置内容中添加如下内容:

192.168.37.111 node1.keer.com node1
192.168.37.122 node2.keer.com node2
192.168.37.133 node3.keer.com node3
192.168.37.144 node4.keer.com node4


  这样的话,我们就可以通过 host 解析节点来打通私钥访问,会方便很多。
  本步骤完成。
  

3.1.2 初始主节点 master 的配置

  我们需要修改 master 的数据库配置文件来对其进行初始化配置:

[[email protected] ~]# vim /etc/my.cnf
    [mysqld]
    server-id = 1               //复制集群中的各节点的id均必须唯一
    log-bin = master-log        //开启二进制日志
    relay-log = relay-log       //开启中继日志
    skip_name_resolve           //关闭名称解析(非必须)
[[email protected] ~]# systemctl restart mariadb


  本步骤完成。
  

3.1.3 所有 slave 节点依赖的配置

  我们修改两个 slave 的数据库配置文件,两台机器都做如下操作:

[[email protected] ~]# vim /etc/my.cnf
    [mysqld]
    server-id = 2               //复制集群中的各节点的id均必须唯一;
    relay-log = relay-log       //开启中继日志
    log-bin = master-log        //开启二进制日志
    read_only = ON              //启用只读属性
    relay_log_purge = 0         //是否自动清空不再需要中继日志
    skip_name_resolve           //关闭名称解析(非必须)
    log_slave_updates = 1       //使得更新的数据写进二进制日志中
[[email protected] ~]# systemctl restart mariadb
[[email protected] ~]# 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           //关闭名称解析(非必须)
    log_slave_updates = 1       //使得更新的数据写进二进制日志中
[[email protected] ~]# systemctl restart mariadb

  本步骤完成。
  

3.1.4 配置一主多从复制架构

  下面只会给出命令,具体的知识及过程详解见我的上一篇博客——实战项目——mysql主从架构的实现
master 节点上:

MariaDB [(none)]>grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer';
MariaDB [(none)]> show master status;

slave 节点上:

MariaDB [(none)]> change master to master_host='192.168.37.122',
    -> master_user='slave',
    -> master_password='keer',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=415;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;

  本步骤完成。
  

3.2 安装配置MHA

3.2.1 在 master 上进行授权

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

MariaDB [(none)]> grant all on *.* to 'mhaadmin'@'192.168.%.%' identified by 'mhapass';

  本步骤完成。
  

3.2.2 准备 ssh 互通环境

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

[[email protected] ~]# ssh-keygen -t rsa
[[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]


  当四台机器都进行了上述操作以后,我们可以在 manager 机器上看到如下文件:

[[email protected] ~]# cd .ssh/
[[email protected] .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[[email protected] .ssh]# cat authorized_keys 


  四台机器的公钥都已经在authorized_keys这个文件中了,接着,我们只需要把这个文件发送至另外三台机器,这四台机器就可以实现 ssh 无密码互通了:

[[email protected] .ssh]# scp authorized_keys [email protected]:~/.ssh/
[[email protected] .ssh]# scp authorized_keys [email protected]:~/.ssh/
[[email protected] .ssh]# scp authorized_keys [email protected]:~/.ssh/

  当然,我们也可以在机器上实验一下,看看 ssh 是否还需要输入密码。
  本步骤完成。

3.2.3 安装 MHA 包

  在本步骤中, Manager节点需要另外多安装一个包。具体需要安装的内容如下:

四个节点都需安装:mha4mysql-node-0.56-0.el6.norch.rpm
Manager 节点另需要安装:mha4mysql-manager-0.56-0.el6.noarch.rpm

  需要安装的包我已经上传至百度云盘,密码:mkcr,大家需要的自行下载使用~
  我们使用rz命令分别上传,然后使用yum安装即可。

[[email protected] ~]# rz
[[email protected] ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg                     Pictures
Desktop          mha4mysql-manager-0.56-0.el6.noarch.rpm  Public
Documents        mha4mysql-node-0.56-0.el6.noarch.rpm     Templates
Downloads        Music                                    Videos
[[email protected] ~]# yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
[[email protected] ~]# yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm 

  其余机器也分别进行安装,就不一一举例了。
  本步骤完成。
  

3.2.4 初始化 MHA ,进行配置

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

3.2.5 定义 MHA 管理配置文件

  为MHA专门创建一个管理用户, 方便以后使用, 在mysql的主节点上, 三个节点自动同步:

    mkdir /etc/mha_master
    vim /etc/mha_master/mha.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]                   //节点2
hostname=192.168.37.133     //节点2主机地址
ssh_port=22                 //节点2的ssh端口
candidate_master=1          //将来可不可以成为master候选节点/主节点
[server2]
hostname=192.168.37.133
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.37.144
ssh_port=22
candidate_master=1

  本步骤完成。

3.2.6 对四个节点进行检测

1)检测各节点间 ssh 互信通信配置是否 ok
  我们在 Manager 机器上输入下述命令来检测:

[[email protected] ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf

  如果最后一行显示为[info]All SSH connection tests passed successfully.则表示成功。

2)检查管理的MySQL复制集群的连接配置参数是否OK

[[email protected] ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf


  我们发现检测失败,这可能是因为从节点上没有账号,因为这个架构,任何一个从节点, 将有可能成为主节点, 所以也需要创建账号。
  因此,我们需要在master节点上再次执行以下操作:

MariaDB [(none)]> grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer';
MariaDB [(none)]> flush privileges;

  执行完这段操作之后,我们再次运行检测命令:

[[email protected] ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
Thu Nov 23 09:07:08 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Nov 23 09:07:08 2017 - [info] Reading application default configuration from /etc/mha_master/mha.cnf..
Thu Nov 23 09:07:08 2017 - [info] Reading server configuration from /etc/mha_master/mha.cnf..
……
MySQL Replication Health is OK.

  可以看出,我们的检测已经ok了。
  此步骤完成。

3.3 启动 MHA

  我们在 manager 节点上执行以下命令来启动 MHA:

[[email protected] ~]# nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
[1] 7598

  启动成功以后,我们来查看一下 master 节点的状态:

[[email protected] ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:7598) is running(0:PING_OK), master:192.168.37.122

  上面的信息中“mha (pid:7598) is running(0:PING_OK)”表示MHA服务运行OK,否则, 则会显示为类似“mha is stopped(1:NOT_RUNNING).”
  如果,我们想要停止 MHA ,则需要使用 stop 命令:

[[email protected] ~]# masterha_stop -conf=/etc/mha_master/mha.cnf

3.4 测试 MHA 故障转移

3.4.1 在 master 节点关闭 mariadb 服务,模拟主节点数据崩溃

[[email protected] ~]# killall -9 mysqld mysqld_safe
[[email protected] ~]# rm -rf /var/lib/mysql/*

3.4.2 在 manger 节点查看日志

  我们来查看日志:

[[email protected] ~]# tail -200 /etc/mha_master/manager.log
……
Thu Nov 23 09:17:19 2017 - [info] Master failover to 192.168.37.133(192.168.37.133:3306) completed successfully.

  表示 manager 检测到192.168.37.122节点故障, 而后自动执行故障转移, 将192.168.37.133提升为主节点。
  注意,故障转移完成后, manager将会自动停止, 此时使用 masterha_check_status 命令检测将会遇到错误提示, 如下所示:

[[email protected] ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha is stopped(2:NOT_RUNNING).

3.5 提供新的从节点以修复复制集群

  原有 master 节点故障后,需要重新准备好一个新的 MySQL 节点。基于来自于master 节点的备份恢复数据后,将其配置为新的 master 的从节点即可。注意,新加入的节点如果为新增节点,其 IP 地址要配置为原来 master 节点的 IP,否则,还需要修改 mha.cnf 中相应的 ip 地址。随后再次启动 manager ,并再次检测其状态。
  我们就以刚刚关闭的那台主作为新添加的机器,来进行数据库的恢复:
  原本的 slave1 已经成为了新的主机器,所以,我们对其进行完全备份,而后把备份的数据发送到我们新添加的机器上:

[[email protected] ~]# mkdir /backup
[[email protected] ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql
[[email protected] ~]# scp /backup/mysql-backup-2017-11-23-09\:57\:09-all.sql [email protected]:~

  然后在 node2 节点上进行数据恢复:

[[email protected] ~]# mysql < mysql-backup-2017-11-23-09\:57\:09-all.sql

  接下来就是配置主从。照例查看一下现在的主的二进制日志和位置,然后就进行如下设置:

MariaDB [(none)]> change master to master_host='192.168.37.133',  master_user='slave',  master_password='keer', master_log_file='mysql-bin.000006', master_log_pos=925;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.37.133
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 925
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                            ……                          

  可以看出,我们的主从已经配置好了。
  本步骤完成。

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

  我们来再次检测状态:

[[email protected] ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf

  如果报错,则再次授权(详见上文)。若没有问题,则启动 manager,注意,这次启动要记录日志

[[email protected] ~]# masterha_manager -conf=/etc/mha_master/mha.cnf > /etc/mha_master/manager.log 2>&1 &
[1] 10012

  启动成功以后,我们来查看一下 master 节点的状态:

[[email protected] ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:9561) is running(0:PING_OK), master:192.168.37.133

  我们的服务已经成功继续了。
  本步骤结束。

3.7新节点上线, 故障转换恢复注意事项

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

[[email protected] ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:9561) is running(0:PING_OK), master:192.168.37.133

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

[[email protected] ~]# masterha_manager --conf=/etc/mha_master/mha.cnf


  以上。我们的实验已经圆满完成。
  如有疑问或者建议大家可以多多讨论呐~(~ ̄▽ ̄)~

时间: 2024-10-13 04:14:32

mysql实现高可用架构之MHA的相关文章

MySQL之高可用架构—MHA

MySQL高可用目前有heartbeat+drbd.MHA.MySQL复制等几种较成熟的方案,heartbeat+drbd的方案可扩展性较差,而且读写都由主服务器负责,从库并不提供读功能,适合于数据增长量不大.一致性要求很高的环境,如银行.金融业等.今天重点讲下MHA的高可用架构. MHA是一款优秀的高可用环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到0-30秒之内自动完成数据库的故障切换,并且在切换的过程中,最大限度的保证数据的一致性,以达到真正意义上的高可用.

MySQL高可用架构之MHA (未完,待续)

MySQL高可用架构之MHA 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. 该软件由两部分组成:

mysql复制(高可用架构方案的基础)

mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以在全部改变中根据业务需求选择部分库和部分表的复制复制的场景: 1.数据库容灾 2.需求:创建一个从数据服务器,做数据的测试和分析 3.负载均衡 4.复制时高可用架构方案的基础 mysql高可用架构特点1.数据库故障的检测与排除2.主从数据库的切换3.数据的备份和保护 mysql高可用架构常用方案1.

Oracle Compute云快速搭建MySQL Keepalived高可用架构

最近有个客户在测试Oracle Compute云,他们的应用需要使用MySQL数据库,由于是企业级应用一定要考虑高可用架构,因此有需求要在Oracle Compute云上搭建MySQL高可用集群.客户根据自身的技术储备想要使用Keepalived组件来配合MySQL实现.今天结合Oracle Compute刚刚宣布terraform支持的架构即代码方式,交付给客户一个快速搭建MySQL+Keepalived高可用架构,来帮助他们快速搭建测试环境甚至将来使用到正式环境. MySQL主主复制模式 M

企业中MySQL主流高可用架构实战三部曲之MHA

老张最近两天有些忙,一些老铁一直问,啥时更新博文,我可能做不到天天更新啊,但保证以后一有空就写一些干货知识分享给大家. 我们如果想要做好技术这项工作,一定要做到理论与实践先结合.我一个曾经被数据库虐得体无完肤的过来人给大家一些建议:就是只看书,背理论真的行不通,到时遇到棘手的问题,你还是一样抓瞎.一定要在理论理清的基础上多做实验. 给自己定个目标,3个月做够100-500个实验.然后整理在做实验过程中的各种报错,认真解读分析报错原理,做好笔记.最后再拿起书,重新阅读之前有些可能理解不了的理论知识

MySQL高可用架构之MHA

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

mysql数据库高可用架构-----MHA-0.56的详解

大家都知道,任何线上环境,都必须搭载高可用架构,是web的,也要是数据库的,严格来说更是整个架构的高可用. mysql作为时下比较热的数据库,高可用架构更加需求大.不过,以前老旧那一套已经不合时宜,现在用的比较多的就是MHA和PXC了. PXC的优势是做到同写同回滚,达到数据高度一致性,通过一些程序和代码来做第三方分发,可以做到一定程度的读写分离,是个相当不错的高可用解决方案,不过对网络要求比较高,配置也略复杂一些,最好是同一个机房里面做,不过这并不是本文重点,后面找时间再写相关的文章. 本文要

探索MySQL高可用架构之MHA(7)

-----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构的keepalive读写分离! 本篇文章主要介绍本次架构中的mha安装部分! 关于MHA MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于 Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在 0~30秒之内自动完成数据库的故

探索MySQL高可用架构之MHA(4)

-----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构中的Mysql源码安装.本篇文章主要介绍本次架构中的ABBB复制. 首先我们先介绍什么是MySql AB复制???? AB复制又称主从复制,实现的是数据同步.如果要做MySQL AB复制,数据库版本尽量保持一致.如果版本不一致,从服务器版本高于主服务器,但是版本不一致不能做双向复制. MySQL AB复制有什么好处呢? a.解决宕机带来的数据不一致,因为MySQL AB复制可以实时备份数据. b.减轻数据库服务器压力,这点很容