一、简介

  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 的数据库配置文件来对其进行初始化配置:

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

本步骤完成。

3.1.3 所有 slave 节点依赖的配置

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

[root@slave1 ~]# 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       //使得更新的数据写进二进制日志中
[root@slave1 ~]# systemctl restart mariadb
[root@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           //关闭名称解析(非必须)log_slave_updates = 1       //使得更新的数据写进二进制日志中
[root@slave2 ~]# 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文件复制给余下的所有节点即可。
  下面操作在所有节点上操作:

[root@manager ~]# ssh-keygen -t rsa
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1

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

[root@manager ~]# cd .ssh/
[root@manager .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@manager .ssh]# cat authorized_keys 

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

[root@manager .ssh]# scp authorized_keys root@node2:~/.ssh/
[root@manager .ssh]# scp authorized_keys root@node3:~/.ssh/
[root@manager .ssh]# scp authorized_keys root@node4:~/.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安装即可。

[root@manager ~]# rz
[root@manager ~]# 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
[root@manager ~]# yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@manager ~]# 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 机器上输入下述命令来检测:

[root@manager ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf

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

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

[root@manager ~]# 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;

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

[root@manager ~]# 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.

3.3 启动 MHA

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

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

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

[root@manager ~]# 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 命令:

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

3.4 测试 MHA 故障转移

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

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

3.4.2 在 manger 节点查看日志

  我们来查看日志:

[root@manager ~]# 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 命令检测将会遇到错误提示, 如下所示:

[root@manager ~]# 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 已经成为了新的主机器,所以,我们对其进行完全备份,而后把备份的数据发送到我们新添加的机器上:

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

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

[root@master ~]# 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 eventMaster_Host: 192.168.37.133Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000006Read_Master_Log_Pos: 925Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 529Relay_Master_Log_File: mysql-bin.000006Slave_IO_Running: YesSlave_SQL_Running: Yes

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

  我们来再次检测状态:

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

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

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

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

[root@manager ~]# 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)手动修复主节点提升为从节点后, 再次运行检测命令

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

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

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

作者:珂儿吖

出处:http://www.cnblogs.com/keerya/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Spring - MySql实现高可用架构之MHA相关推荐

  1. Mysql的高可用架构搭建(MHA)

    文章目录 Mysql高可用架构(MHA)简介 MySQL高可用系统 MHA技术介绍 MHA提供了如下功能 MHA工作原理 MHA的优点 MHA组件介绍 Manager工具包主要包括以下工具 Node工 ...

  2. 探索MySQL高可用架构之MHA(6)

    探索MySQL高可用架构之MHA(6) -----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构的Atlas读写分离! 本篇文章主要介绍本次架构中的keepalive部分! 什么是Kee ...

  3. 【稳定性day10】美团MySQL的高可用架构 - 对标业内的一些解决方案

    本文来自美团蔡金龙老师的分享,介绍了最近几年美团点评MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我 ...

  4. MySQL(10)数据库实现高可用架构之MHA

    文章目录 一.MySQL MHA介绍 1.1 什么是 MHA? 1.2 MHA 的组成 1) MHA Node(数据节点) 2) MHA Manager(管理节点) 1.3 MHA 的特点 二.MyS ...

  5. ES+Redis+MySQL,高可用架构设计太牛了!(至尊典藏版)

    目录 前言 一.ES 高可用方案 1.1.ES 双中心主备集群架构 1.2.ES 流量隔离三集群架构 1.3.ES 集群深度优化提升 二.会员 Redis 缓存方案 2.1. ES 近一秒延时导致的 ...

  6. MySQL 高可用架构 之 MHA (Centos 7.5 MySQL 5.7.18 MHA 0.58)

    目录 简介 环境准备 秘钥互信 安装基础依赖包 安装MHA组件 安装 MHA Node组件 安装 MHA Manager 组件 建立 MySQL 一主三从 初始化 MySQL 启动MySQL 并简单配 ...

  7. docker mysql高可用_Docker下Ubuntu系统编译安装HAprox+Keepalived+MySQL负载高可用架构

    系统环境:Ubuntu16.04(Docker容器) 架构环境: Keepalived/HAproxy MASTER: 172.17.0.4 Keepalived/HAproxy BACKUP: 17 ...

  8. mysql复制架构迁移到pxc_mysql复制(高可用架构方案的基础)

    mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程 特点: 1.没有改变就无所谓复制 ;改变是复制的根本与数据源 2.所有的改变:是指可以复制全部改变,也可以复制部分改变 ...

  9. MySQL高可用架构InnoDB Cluster (和NDB Cluster是两码事)

    MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如MMM, MHA, NDB Cluster, Galera Cluster, InnoDB Cluste ...

最新文章

  1. 什么是导师负责制_为什么一个导师是不够的
  2. HTML5的新特性----拖放功能
  3. XtraBackup出现 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
  4. UA MATH567 高维统计I 概率不等式4 亚高斯分布
  5. 总有一些人在祖国需要的时候挺身而出
  6. 读取和修改caffemodel文件里的参数
  7. A-Deeper-Understanding-of-Spark-Internals(Spark内核深入理解)
  8. java语言就业方向_2019年汉语言专业最全就业方向
  9. 我来做百科(第七天)
  10. 高德地图提前上线多条重要道路预通车机制不断成熟
  11. 微信小程序开发的基本流程__BaiMoci
  12. 机器人编程常用语言汇总(WeDo/EV3/Arduino/Scratch)
  13. 深度学习(增量学习)——ICCV2021:SS-IL: Separated Softmax for Incremental Learning
  14. 英语名词复数s的发音规则
  15. 亚马逊 Alexa skill开发
  16. CAN总线通信原理分析
  17. 微码汇:从O2O的前世今生看接下来该如何“O”
  18. Verilog初级教程(5)Verilog中的多维数组和存储器
  19. 大青云不显示服务器,37大青云1月4日合服公告
  20. HTTP协议基本原理

热门文章

  1. word文档图片显示不全,显示一部分,图片在文字下面怎么办?
  2. iCollections for Mac(桌面文件整理软件)
  3. python 温度转换、货币转换
  4. 迁移学习系列--领域泛化
  5. 力扣(350.121)补9.3
  6. Android逆向之旅—Hook神器Cydia Substrate使用详解
  7. Wireshark-----抓包分析
  8. 什么是Anti-DDoS流量清洗?
  9. HTB靶场系列 linux靶机 Sense靶机
  10. 【Re-ID】现有方法调研 - 无监督/半监督方法 - 其他方法