MHA高可用配置及故障切换

Posted 水木,年華

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MHA高可用配置及故障切换相关的知识,希望对你有一定的参考价值。

一.MHA概述

1.1MHA简介

MHA (Master High Availability)目前在mysql高可用方面是一个相对成熟的解决方案,MHA是由日本人开发,是一套优秀的MysQL故障切换和主从复制的高可用软件
在MysQL故障切换的过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能够最大程度上保证数据库的一致性,以达到真正意义上的高可用
MHA由perl语言编写,该工具仅仅使用于MySQLReplication坏境,目的在于维持Master主库的高可用性
MHA是基于标准的MySQL主从复制(异步/半同步)
MHA由两部分组成管理节点(MHA manager)和数据节点(MHA Node)两部分组成MHA manager 可以单独部署在一台服务器上,可以部署在一台slave上面
主从复制架构:主从复制(一主多从) ;MHA架构(多主多从)﹔MMM架构(3主多从)

1.2MHA特点

自动故障切换过程中,MHA总会试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
但这并不总是可行,例如如果主服务器硬件故障或者无法通过ssh访问,MHA则无法保存二进制日志,只能进行故障转移而丢失了最新的数据
使用MySQL5.5的半同步复制,可以大大降低数据去失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性,有时候可故意设置从节点慢于主节点,当发生意外删除数据库倒是数据丢失时可从从节点二进制日志中恢复。

1.3MHA的作用

为了解决故障切换,数据尽可能的保存,以及所有节点日志的一致性

1.4MHA的组成(组件)

MHA Manager(管理节点)
Manager作用:可以借助于node组件,实现健康检查(ssh,主从复制),故障切换功能
MHA Node(数据节点):部署在所有mysql服务器
node组件的作用:
1.定时汇报给主manager节点mysql服务的状态
2.监控本地mysql服务功能

1.4当mstaer服务器故障,提升从服务器为master服务器的机制

1.预选:先去除binlog和relay log相差100M的日志
2.优选:再从服务器选择同步数据量较多的从服务器

二.配置MHA

基于上一篇博文MySQL主从复制,本篇来配置MHA

2.1配置环境

MySQL服务器
master:192.168.80.2     安装node组件
slave1:192.168.80.3     安装node组件
slave2:192.168.80.4     安装node组件
MHA-manager 
192.168.80.1  管理节点,安装 manager 组件与node组件

定义节点服务器名称

hostnamectl set-hostname manager;

安装编译依赖环境(三台MySQL服务器)

yum -y install ncurses-devel gcc-c++ perl-Module-Install

2.2配置软链接

master、slave1、slave2分别做两个软链接 第一个是mysql命令
第二个mysqlbinlog是节点恢复

ln -s /usr/local/mysql/bin/mysql /usr/sbin
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin

2.3给所有数据库提权

配置MySQL 一主两从
⭐⭐在所有数据库节点上授权两个用户,一个是从库同步使用,另一个是manager使用

grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '123456'; 
grant all privileges on *.* to 'mha'@'192.168.80.%' identified by 'manager';

⭐⭐下面三条授权理论上不用添加,但是实验环境通过MHA检查MySQL主从报错,
报两个从库通过主机名连接不上主库,所以所有数据库都需要添加以下授权
通过mha检查的时候,是通过主机名的形式进行监控,这种情况会容易报错

grant all privileges on *.* to 'mha'@'master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';

所有从库开启只读功能(不会对超级管理员super生效,只会对普通用户)

set global read_only=1;

只读功能验证
在master服务器上远程登录slave1

mysql -umyslave -p123456 -h 192.168.80.3-P 3306

创建一个表,发出报错信息

2.4Mysql刷新权限

flush privileges;

在master上查看二进制文件和同步点

show master status;

2.5两台节点服务器进行同步

change master to master_host='192.168.80.2',master_user='myslave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=3018;
start slave;
show slave status\\G;

2.6配置MHA

在所有服务器上安装MHA依赖环境,首先安装epel源,只有安装了源 perl才会有
安装epel源,并且不进行gph检查

yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL \\    #perl针对于mysql数据库
perl-Config-Tiny \\                 #从配置文件中提拿其中的值 
perl-Log-Dispatch \\                #log-日志
perl-Parallel-ForkManager \\        #多线程管理
perl-ExtUtils-CBuilder \\           
                                   #扩展工具CBuilder  MakeMaker
perl-ExtUtils-MakeMaker \\
perl-CPAN                          #cpan perl中的数据库

注意:MHA 软件包对于每个操作系统版本不一样,这里Centos7.4必须选择0.57版本
在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装manager组件
因为manager依赖node组件,

2.7同步阿里云时间服务器

ntpdate ntp.aliyun.com

上传mha4mysql-node-0.57.tar.gz 至/opt目录,解压

tar zxf mha4mysql-node-0.57.tar.gz -C /root 
cd /root
cd  mha4mysql-node-0.57
perl Makefile.PL
make && make install

注意:以上操作在四台服务器上都要一起做

2.8在MHA节点上安装manager组件

必须先安装node才能安装manager组件

上传mha4mysql-manager-0.57.tar.gz 至manager服务器的/opt目录下解压

tar zxf  mha4mysql-manager-0.57.tar.gz -C /root
cd /root/mha4mysql-manager-0.57
perl Makefile.PL
make && make install

manager 安装后在/usr/local/bin目录下会生成几个工具,主要包括以下:

masterha-check_ssh  		检查MHA的SSH配置状况(免交互)
masterha_check_repl  		检查MySQL复制状况
masterha_manager 			启动manager的脚本
masterha_check_status 		检查当前MHA运行状态
masterha_master_monitor 	检查master是否宕机
masterha_master_switch 		控制故障转移(自动或者手动)
masterha_conf_host 			添加或删除配置的server信息
masterha_stop  				关闭manager

node 安装后也会在/usr/local/bin目录下生成几个脚本,需要进行检查,主要包括以下

save_binary_logs			#保存和复制master的二进制日志
apply_diff_relay_logs 		#识别差异的中继日志时间,并将其差异的事件应用于其他的slave
filter_mysqlbinlog			#去除不必要的ROLLBACK回滚事件(MHA 已不适用这个工具)
purge_relay_logs			#清除中继日志(不会阻塞 SQL线程)

2.9配置无密码认证

在四台服务器上都配置无密码认证

ssh-keygen -t rsa           #一路回车
ssh-copy-id 192.168.80.1
ssh-copy-id 192.168.80.2
ssh-copy-id 192.168.80.3
ssh-copy-id 192.168.80.4

2.10配置MHA

1、在MHA节点上复制相关脚本到/usr/local/bin目录

cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin
#-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容
#-r: 递归

拷贝后会有四个执行文件

#去除#开头的部分,PS:第一行添加#

% s/^#//

创建MHA软件目录并拷贝配置文件

mkdir /etc/masterha
cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
vim /etc/masterha/app1.cnf
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.3 -s 192.168.80.4
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=192.168.80.2
port=3306

[server2]
candidate_master=1
hostname=192.168.80.3
check_repl_delay=0
port=3306

[server3]
hostname=192.168.80.4
port=3306

2.12测试主从复制

masterha_check_repl -conf=/etc/masterha/app1.cnf

三.测试

3.1后台启动MHA

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
[1] 52037
[root@manager ~]# jobs
[1]+  运行中               nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
[root@manager ~]# 

3.2查看当前的mastera节点

[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:52037) is running(0:PING_OK), master:192.168.80.2
[root@manager ~]# 

3.3模拟故障查看master变化

[root@manager ~]# tail -f /var/log/masterha/app1/manager.log  #实时监控日志

此时将master停止,slave1称为新的master

后台重新启动MHA后,

[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:52937) is running(0:PING_OK), master:192.168.80.3   #虚拟IP变成192.168.80.3

3.4查看主从复制

3.5修复原master

3.5.1启动数据库

3.5.2 将其改为slave,加入主从

 change master to master_host='192.168.80.3',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2891;
;
start slave;


3.5.3修改mha主配置文件

[root@manager ~]#  vim /etc/masterha/app1.cnf  //插入记录,因为在其失效时,会自动删除
[server1]
hostname=192.168.80.2
port=3306

3.6测试主从复制

masterha_check_repl -conf=/etc/masterha/app1.cnf


查看到当前的master节点

masterha_check_status --conf=/etc/masterha/app1.cnf


总结:
MHA 故障转移
以本质而言分为两部分
①bin-log尽可能的save (抢救)并保存在/tmp目录,同时将master 的VIP(192.168.80.20)“飘逸”到主-备节点,并起起来
②新master 的bin-log会与master的bin-log,进行同步检测,尽量趋于一致,同时其他的slave服务器会变更master,指向新master(slavel 192.168.80.3 change master to new_master);最后进行主从复制check

以上是关于MHA高可用配置及故障切换的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之MHA高可用配置及故障切换

Linux——MySQL MHA高可用配置及故障切换以及修复

Linux——MySQL MHA高可用配置及故障切换以及修复

MHA你难道不了解一下?mysql数据库MHA高可用配置及故障切换!

MySQL------MHA高可用配置及故障切换

MySQL MHA高可用配置及故障切换