MariaDB高可用架构之MHA

声明:本次实验使用的是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。

MariaDB高可用架构之MHA_第1张图片

本次操作也是按照上图架构,操作系统CentOS7.4 ,数据库Mariadb ,一主一备主一从 模式。

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进行复制。
MariaDB高可用架构之MHA_第2张图片

实验配置

一、准备实验MYSQL Replication环境:

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

有时候,我们希望将 MySQL 的 relay log 多保留一段时间,比如用于高可用切换后的数据补齐,于是就会设置 relay_log_purge=0,禁止 SQL 线程在执行完一个 relay log 后自动将其删除。

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

    node1:MariaDB master    192.168.166.31

    node2:MariaDB slave1    192.168.166.32

    node3:MariaDB slave2、MHA Manager    192.168.166.33

1、安装Mariadb数据库

# yum install mariadb*   python2-PyMySQL

2、初始主节点master配置:
[root@CentOS7-master ~]# vim /etc/my.cnf
[mysqld]
server-id = 1
log-bin = master-log
relay-log = relay-log
skip_name_resolve = ON
3、所有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
4、启动各项服务于进程

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

启动mysql,这里就设置开机自启动。

#systemctl  start mariadb

#systemctl  enable  mariadb

删除mysql无用账户

#select user,host,password from mysql.user;

#delete from mysql.user where user='';

#delete from mysql.user where host <>'localhost';

#set password for root@'localhost' = password('XXXXXX');

master节点上:

MariaDB [(none)]>GRANT ALL PRIVILEGES ON *.* TO 'repl'@'192.168.166.%' IDENTIFIED BY 'repl';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]>MariaDB [(none)]> SHOW MASTER STATUS;

MariaDB高可用架构之MHA_第3张图片

各slave节点上:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.166.31', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='master-log.000004', MASTER_LOG_POS=1866;
MariaDB [(none)]> 
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> 
MariaDB [(none)]> SHOW SLAVE STATUS\G;

二、安装配置MHA

1、权限设置

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

mysql> GRANT ALLON*.*TO'mhaadmin'@'192.168.166.%' IDENTIFIED BY'XXXXX';

2、准备基于SSH互信通信环境:

MHA集群中的各节点彼此之间均需要基于ssh互信通信,以实现远程控制及数据管理功能。简单起见,可在

Manager节点生成密钥对儿,并设置其可远程连接本地主机后,将私钥文件及authorized_keys文件复制给

余下的所有节点即可。

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

[root@manager ~]# ssh-keygen -t rsa
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.166.32
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.166.33
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
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=Redhat //数据库密码 
ping_interval=1 // ping间隔时长 

[server1] //节点1,[server1]节点必须设置成master 
hostname=192.168.166.31 //节点1主机地址 
ssh_port=22 //节点1的ssh端口 
candidate_master=1 // 将来可不可以成为master候选节点/主节点 

[server2] //节点2
hostname=192.168.166.32 //节点2主机地址 
ssh_port=22 //节点2的ssh端口 
candidate_master=1 // 将来可不可以成为master候选节点/主节点 

[server3] //节点3
hostname=192.168.166.33
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

MariaDB高可用架构之MHA_第4张图片

如果测试时会报错,可能是从节点上没有账号,因为这个架构,任何一个从节点,将有可能成为主节点,所以也需要创建账号;若是报错,则要检查MySQLy用户是否授权! 还有一种可能是主从状态异常,需要检查下。

因此,这里只要在各节点上执行以下操作,对manager进行授权即可:

MariaDB [(none)]>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.166.%' IDENTIFIED BY 'repl';
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:192.168.166.31

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

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

四、测试MHA测试故障转移

1、在master节点关闭mariadb服务,模拟主节点数据崩溃
[root@master ~]# systemctl  stop mariadb

2、在manager节点查看日志:

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

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

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

MariaDB高可用架构之MHA_第5张图片

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

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

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

4、新节点提供后再次执行检查操作
[root@manager ~]# masterha_check_ssh -conf=/etc/mha_master/app1.cnf
[root@manager ~]# masterha_check_repl -conf=/etc/mha_master/app1.cnf
切换过后注意几点

1、管理节点需要在 /etc/mha_master/app1 目录下清除app1.failover.complete 这个文件

2、备主节点需要配置 mysql> show variables like '%read_only%';     mysql>set global read_only=on;

3、切换过后MHA失效,需要按照上面的步骤,重新检测、启动



参看文章:

mha0.56版本安装使用排错


你可能感兴趣的:(『,数据库知识,』)