数据库高可用-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 。对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地应用后提升为主节点。

image.png

        由上图我们可以看出,每个复制组内部和 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、工作原理

image.png

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

(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);

(2) 识别含有最新更新的 slave ;

(3) 应用差异的中继日志(relay log) 到其他 slave ;

(4) 应用从 master 保存的二进制日志事件(binlog events);

(5) 提升一个 slave 为新 master ;


三、实现过程

环境准备:

主机名称IP服务角色备注
manager192.168.11.11manager控制器用于监控管理
master192.168.11.22
数据库主服务器开启bin-log,relay-log,关闭relay-log-purge
slave1192.168.11.23数据库从服务器开启bin-log,relay-log,关闭relay-log-purge
slave2192.168.11.24数据库从服务器开启bin-log,relay-log,关闭relay-log-purge

所有节点进行初始化关闭防火墙,关闭selinux

更改主机名:

hostnamectl  --static  set-hostname  manager

hostnamectl  --static  set-hostname  master

hostnamectl  --static  set-hostname  slave1

hostnamectl  --static  set-hostname  slave2


----------部署过程----------

1、配置本地解析hosts文件,便于之后操作

四台节点机器同时做:

vim   /etc/hosts

192.168.11.11   manager.hj.com   manager

192.168.11.22   master.hj.com   master

192.168.11.23   slave1.hj.com   slave1

192.168.11.24   slave2.hj.com   slave2


wq退出保存


2、安装mariadb源,装mariadb,初始化数据库

四台节点机器同时做:

vim   /etc/yum.repos.d/mariadb.repo

[mariadb]
name = MariaDB 
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos7-amd64 
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB 
gpgcheck=1

wq退出保存


安装mariadb-client和mariadb-server:

yum  -y  install  MariaDB-server  MariaDB-client


三台节点机器做:

开启mariadb服务:systemctl  start   mariadb

初始化数据库:mysql_secure_installation

        直接回车-->n-->y-->设置你的密码(我设置为0)-->y-->y-->y-->y


3、修改数据库配置文件对其进行初始化配置

192.168.11.22上面做:

vim   /etc/my.cnf.d/server.cnf

    [mysqld]
    server-id = 1               //复制集群中的各节点的id均必须唯一
    log-bin = master-log        //开启二进制日志
    relay-log = relay-log       //开启中继日志
    skip_name_resolve           //关闭名称解析(非必须)

wq保存退出

image.png

重启mariadb服务:systemctl   restart   mariadb


192.168.11.23上面做:

vim   /etc/my.cnf.d/server.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       //使得更新的数据写进二进制日志中

wq保存退出

image.png

重启mariadb服务:systemctl   restart   mariadb


192.168.11.24上面做:

vim   /etc/my.cnf.d/server.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       //使得更新的数据写进二进制日志中

wq保存退出

image.png

重启mariadb服务:systemctl   restart   mariadb


4、配置一主多从复制架构

master节点上:

[root@master ~]# mysql -uroot -p         #输入你设置的密码登录

MariaDB [(none)]> grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer';    #授权主从账号

MariaDB [(none)]> flush privileges;    #刷新权限表,使设置生效

[root@master ~]# mysqldump -uroot -p --all-databases > `date +%F`-mysql-all.sql    #备份数据保存到从库

[root@master ~]# scp 2019-04-25-mysql-all.sql 192.168.11.23:/root/       #传数据到两个从上面

[root@master ~]# scp 2019-04-25-mysql-all.sql 192.168.11.24:/root/

image.png


MariaDB [(none)]> show master status;

image.png


slave节点上(两台slave都要做):

[root@slave1 ~]# mysql -uroot -p < 2019-04-25-mysql-all.sql     #导入数据

[root@slave1 ~]# mysql -uroot -p    #输入密码登录mysql

MariaDB [(none)]> help  change master to;     #获得帮助配置主从复制

image.png


修改完成后粘贴进mariadb:

MariaDB [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='192.168.11.22',
    ->   MASTER_USER='slave',
    ->   MASTER_PASSWORD='keer',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='master-log.000001',
    ->   MASTER_LOG_POS=666;

image.png


MariaDB [(none)]> start slave;

MariaDB [(none)]> show slave status\G

image.png


5、安装配置MHA

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

在master节点上面进行授权:

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

MariaDB [(none)]> flush privileges;

image.png


准备ssh互通环境:

四台节点机器同时做:

ssh-keygen       #一路回车

manager上面做:ssh-copy-id   192.168.11.11       #将公钥传给自己

master上面做:ssh-copy-id   192.168.11.11       #将公钥传给manager

slave上面做:ssh-copy-id   192.168.11.11       #将公钥传给manager

slave上面做:ssh-copy-id   192.168.11.11       #将公钥传给manager


manager上面做:scp  .ssh/authorized_keys   192.168.11.22:/root/.ssh      #传公钥给其他节点,做双机互信

manager上面做:scp  .ssh/authorized_keys   192.168.11.23:/root/.ssh

manager上面做:scp  .ssh/authorized_keys   192.168.11.24:/root/.ssh


安装mha包:

我的mha网盘分享安装包,大家可以自己访问下载
链接:https://pan.baidu.com/s/1royHPWKgWBtWeBDYAHqKug 
提取码:hf3q

复制这段内容后打开百度网盘手机App,操作更方便哦

四个节点都需安装:mha4mysql-node-0.56-0.el6.norch.rpm

Manager 节点另需要安装:mha4mysql-manager-0.56-0.el6.noarch.rpm


四台节点机器同时安装:yum  -y  install  mha4mysql-node

manager节点还需安装:yum  -y  install  mha4mysql-manager


初始化MHA:

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


定义MHA管理配置文件:

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

[root@manager ~]# mkdir /etc/mha_master

[root@manager ~]# 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=keer        //数据库密码
ping_interval=1   
//ping间隔时长
[server1]                   //节点2
hostname=192.168.11.22     //节点2主机地址
ssh_port=22                 //节点2的ssh端口
candidate_master=1          //将来可不可以成为master候选节点/主节点
[server2]
hostname=192.168.11.23
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.11.24
ssh_port=22
candidate_master=1

image.png


6、对四个节点进行检测

[root@manager ~]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf      #检测ssh互信是否ok

image.png

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


[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/mha.cnf     #检测mysql的主从复制是否ok

image.png


如果检测主从复制无法通过,则重新授权一下主从复制账号:

MariaDB [(none)]> grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer';    #授权主从账号

MariaDB [(none)]> flush privileges;    #刷新权限表,使设置生效


7、启动MHA

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

image.png


[root@manager ~]# masterha_check_status -conf=/etc/mha_master/mha.cnf    #查看master节点的状态

image.png


#停止MHA的命令:

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

我就没有执行了,因为我后面还有操作


8、测试MHA故障转移

去master上面关闭mariadb服务:

[root@master ~]# systemctl stop mariadb


在manager节点查看日志:

[root@manager ~]# tail -200 /etc/mha_master/manager.log

image.png


9、恢复原来拓机的master到新的主从集群中

#在slave1[新的master]上面,备份库传给旧的master

[root@slave1 ~]# mkdir /backup

[root@slave1 ~]# mysqldump --all-databases > /backup/`date +%F-%T`-myql-all.sql

[root@slave1 ~]# scp /backup/2019-04-25-22\:57\:13-myql-all.sql   192.168.11.22:/root/


#在master节点进行数据恢复

[root@master ~]# systemctl restart mariadb     #启动mariadb数据库服务

[root@master ~]# mysql_secure_installation     #重新初始化数据库

[root@master ~]# mysql < 2019-04-25-22\:57\:13-myql-all.sql      #还原数据


#重新配置主从,照例查看现在的主的二进制日志和位置

[root@slave1 ~]# mysql   -uroot    -p    #输入密码登录

image.png


[root@master ~]# mysql   -uroot   -p     #输入密码登录

CHANGE MASTER TO
  MASTER_HOST='192.168.11.23',
  MASTER_USER='slave',
  MASTER_PASSWORD='keer',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master-log.000001',
  MASTER_LOG_POS=483331;

image.png


MariaDB [(none)]> start slave;      #开启从功能

MariaDB [(none)]> show slave status\G      #显示从状态


image.png

到此,旧master已经重新加入到mysql主从集群中了


10、新节点提供后再次进行检测操作

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

image.png


#启动MHA

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

image.png


#再次查看master节点的状态

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

image.png


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

  1)在生产环境中, 当你的主节点挂了后, 一定要在从节点上做一个备份, 拿着备份文件把主节点手动提升为从节点, 并指明从哪一个日志文件的位置开始复制

  2)每一次自动完成转换后, 每一次的(replication health )检测不ok始终都是启动不了必须手动修复主节点, 除非你改配置文件

  3)手动修复主节点提升为从节点后, 再次运行检测命令

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

            检测主master节点:masterha_check_status -conf=/etc/mha_master/mha.cnf