MySQL数据库高可用MHA故障切换

Posted 可乐卷儿

tags:

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

一、MHA概述

1、简介

  • 主要是为了解决msater只有一台,若master出现故障时就使用MHA解决单点故障问题
  • 一套优秀的mysql高可用环境下故障切换和主从复制的软件
  • MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换

2、MHA的组成(性能、组件)

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

主从复制架构:主从复制(一主多从) ; MHA架构(多主多从) ; MMM架构(双主多从)

3、特点

  • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
    • 自动故障切换过程的本质
      • 故障切换(本质VIP漂移)
      • 自动(使用脚本触发自动)
  • 使用半同步复制,可以大大降低数据丢失的风险

4、总结

MHA为了解决的是故障切换,数据尽可能的保存,以及所有节点日志的一致性
在这里插入图片描述
当主宕机,提升从服务器为master服务器的机制

  1. 先取出bin-log和relay-log相差的日志值,如上图是相差100M的日志;即预选
  2. 择优;mster 1000M多个slave 980 900 920;即优选

二、搭建MySQL-MHA实验

1、实验环境

MHA-manager:192.168.35.30 ##管理节点,安装manager组件与node组件
MySQL服务器:只要用来调控与调用

角色ip
MHA-manager192.168.35.30
master192.168.35.40
slave1192.168.35.10
slave2192.168.35.20

定义节点服务器名称
hostnamectl set-hostname manager
su
hostnamectl set-hostname master
su
hostnamectl set-hostname slave1
su
hostnamectl set-hostname slave2
su

2、mysql服务器配置

2.1、配置主从复制

详见上一篇文章,更改点是需要注视掉从服务器配置文件/etc/my.cnf内的character_set_server=utf8
在这里插入图片描述

2.2、所有库配置软链接

ln -s /usr/local/mysql/bin/mysql /usr/sbin   //优化管理;mysql命令
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin   //节点恢复

2.3、所有数据库提权

grant replication slave on *.* to 'myslave'@'192.168.35.%' identified by '123'; 
grant all privileges on *.* to 'mha'@'192.168.35.%' identified by 'manager';
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';
set global read_only=1;		##不会对超级管理员super生效,普通用户
flush privileges;

测试:验证从服务器只读功能

msater端创建数据表ss
use zyt
create table ss(id int);

在这里插入图片描述
只读功能验证
在slave1服务器上

mysql -umyslave -p123 -h 192.168.35.40 -P 3306

在这里插入图片描述
这时slave1创建数据库gggg,报错提示只读,无法创建

3、配置MHA

3.1、安装epel源

在所有服务器上安装MHA依赖环境,首先安装epel源,只有安装了源 perl才会有

yum install epel-release --nogpgcheck -y		##安装epel源,并且不进行gph检查
yum install -y perl-DBD-MySQL \\				##perl针对于mysql数据库
perl-Config-Tiny \\			###从配置文件中提拿其中的值
perl-Log-Dispatch \\			##log-日志
perl-Parallel-ForkManager \\		##子进程的函数,多线程管理模式
perl-ExtUtils-CBuilder \\			###扩展工具
perl-ExtUtils-MakeMaker \\		###扩展工具
perl-CPAN		##cpan perl中的数据库

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

3.2、所有服务器同步阿里云时间

[root@master bin]# ntpdate ntp.aliyun.com
20 Jul 19:34:27 ntpdate[60181]: adjust time server 203.107.6.88 offset 0.002699 sec
[root@master bin]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@master bin]# 
[root@master bin]# crontab -l
*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com

3.3、所有服务器安装node组件

上传node压缩包
tar zxvf /mnt/mha/mha4mysql-node-0.57.tar.gz -C /root
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

3.4、在MHA节点上安装manager组件

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

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

3.5、检测manager和node

  1. 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
  2. node 安装后也会在/usr/local/bin目录下生成几个脚本,需要进行检查,主要包括以下
    save_binary_logs #保存和复制master的二进制日志
    apply_diff_relay_logs #识别差异的中继日志时间,并将其差异的事件应用于其他的slave;filter:过滤
    filter_mysqlbinlog #去除不必要的ROLLBACK回滚事件(MHA 已不适用这个工具)
    purge_relay_logs #清除中继日志(不会阻塞 SQL线程)
    在这里插入图片描述
    master宕机之后,slave1主备顶上,实现方式:vip虚拟ip漂移到slave1

4、配置无密码认证

4.1、在mannager上配置到所有数据库节点的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.35.10
ssh-copy-id 192.168.35.20
ssh-copy-id 192.168.35.30
ssh-copy-id 192.168.35.40
在这里插入图片描述

4.2、配置MHA-manager服务器

cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin	##在MHA节点上复制相关脚本到/usr/local/bin目录
ll /usr/local/bin/scripts/		##拷贝后会有四个执行文件

-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容
-r: 递归

master_ip_failover #自动切换时 VIP管理的脚本
master_ip_online_change #在线切换时 VIP的管理
power_manager #故障发生后关闭主机的脚本
send_report #因故障切换后发送报警的脚本
在这里插入图片描述

4.3、使用脚本管理VIP

复制上述的master_ip_failover	到/usr/local/bin目录 这里使用脚本管理VIP
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

在这里插入图片描述

vim /usr/local/bin/master_ip_failover		##清空,并去除除第一行的所有注释#
#!/usr/bin/env perl 
use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '192.168.35.100';		##浮动IP
my $brdc = '192.168.35.255';	##广播地址
my $ifdev = 'ens33';		##基于master使用的网卡为ens33
my $key = '1';			##国际序列号;虚拟VIP的编号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";	##使用ifoconfig命令将其启动,同时设置浮动地址
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		##可以使用ifconfig命令将其down掉(关闭)
my $exit_code = 0;			##正常退出(返回状态码)
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label 	$ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";	##另一只实现方案,注释掉,即使用的ip addr 简写ipa 检测所有的网卡
GetOptions(
'command=s' => \\$command,
'ssh_user=s' => \\$ssh_user,
'orig_master_host=s' => \\$orig_master_host,
'orig_master_ip=s' => \\$orig_master_ip,
'orig_master_port=i' => \\$orig_master_port,
'new_master_host=s' => \\$new_master_host,
'new_master_ip=s' => \\$new_master_ip,
'new_master_port=i' => \\$new_master_port,
);

exit &main();		##主函数

sub main {		##子函数

print "\\n\\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\\n\\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \\n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {

my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \\n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \\n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\\@$new_master_host \\" $ssh_start_vip \\"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\\@$orig_master_host \\" $ssh_stop_vip \\"`;
}

sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\\n";
}

% s/^#// ###去除#开头的部分,PS:第一行添加#
在这里插入图片描述

4.4、创建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=/home/mysql
#故障转移切换的工具
#master_ip_failover_script=/usr/local/bin/master_ip_failover
#在线切换VIP工具管理
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
#以下是密码账号的管理配置
password=manager		##此处密码为之前创建监控用户的密码
user=mha		###设置监控用户
ping_interval=1		##设置监控主库,发送ping包的事件间隔,默认为3秒,尝试三次没有回应的时候自动进性failove		
remote_workdir=/tmp		##设置远端的MySQL在发生切换时binlog的保存位置
repl_password=123		##设置复制用户的密码;从和主授权的密码
repl_user=myslave		##设置复制用户的账户
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.35.10 -s 192.168.35.20		#设置检查从服务器的脚本
shutdown_script=""
ssh_user=root		##需要进行ssh检测,用户是root;前期做免交互的原因

[server1]
hostname=192.168.35.40
port=3306

[server2]
candidate_master=1	##设置候选msater,如果设置了此参数,发送主从切换后,会将此库提升为主库
hostname=192.168.35.10
check_repl_delay=0		##关闭复制的检查,默认情况下如果一个slave落后master 100M的relay-logs(中继日志)的话,MHA将不会选择该slave作为新的master,设置为0的话会忽略此规则
port=3306

[server3]
hostname=192.168.35.20
port=3306

4.5、测试无密码认证

如果正常会输出successfully

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

在这里插入图片描述

4.6、测试主从复制

可以尝试2次

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

在这里插入图片描述

5、测试

5.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 &
[2] 19926
[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 &

在这里插入图片描述
参数详解:
解释:
ohup ##选项
masterha_manager ##开启
–conf=/etc/masterha/app1.cnf ##指定配置文件
–remove_dead_master_conf ##当master服务器失效时,发生主从切换后,会把旧的master的ip从主配置文件删
–ignore_last_failover ##忽略故障转移,忽略掉总是宕机不够可靠的服务器
在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failove之所以这样限制是为了避免ping-pong效应。该参数代表忽略桑次MHA出发切换产生的文件,默认情况 MHA发生切换后会在日志记录下,也就是上面设置的日志app1.failover.complete文件,
下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件:为了方便,这里设为为–ianore_last_failover
< /dev/null> ##生成的所有信息会导到nul1下或者/var/log/masterha/app1/manager.log日志文件中
2>&1& ##把2错误性的输山从定向为标准性输出,"&"开启后台运行

5.2、查看到当前的master节点

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

在这里插入图片描述

5.3、模拟master宕机,查看master的变化

systemctl  stop mysqld		##msater服务器停止mysql服务
查看当前日志信息
tail -f /var/log/masterha/app1/manager.log

在这里插入图片描述

5.4、查看主从服务,master的变化

show slave status;		##在slave2上查询同步情况

在这里插入图片描述

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

MySQL MHA高可用集群部署及故障切换

MHA高可用集群部署及故障切换

数据库之MHA高可用集群部署及故障切换

Mha-Atlas-MySQL高可用

Mysql高可用MHA

MySQL高可用MHA集群