目录

  • 一、MHA的简介
  • 1.1、MHA的组成
  • 1.2、MHA特点
  • 二、MHA的案例
  • 2.1、案例需求
  • 2.2、案例实现思路
  • 2.3、案例环境
  • 三、具体搭建过程
  • 3.1、实现MySQL的一主两从
  • 3.2、安装 MHA
  • 3.3、配置无密码认证
  • 3.4、配置MHA
  • 四、实验验证


一、MHA的简介

目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本人youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。

在MySQL故障 切换过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能最大程度上保证数据库的一致性,以达到真正意义上的高可用。

当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。整个故障转移过程对应用程序是完全透明的。

1.1、MHA的组成

MHA Manager (管理节点):
Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
MHA Node (数据节点):
Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。

1.2、MHA特点

自动故障切换过程中,MHA试图从宕机的主服务器.上保存二进制日志,最大程度的保证数据的不丢失
使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险

二、MHA的案例

2.1、案例需求

本案例要求通过MHA监控MySQL数据库在故障时进行自动切换,不影响业务。

2.2、案例实现思路

1、 安装MySQL数据库
2、 配置MySQl一主两从
3、 安装MHA软件
4、 配置无密码认证
5、 配置MySQL MHA 高可用
6、 模拟 master 故障切换

2.3、案例环境

主机名

IP地址

角色

软件包

manager

10.0.0.40

manager管理节点

node数据节点软件包/manager管理节点软件包

master

10.0.0.10

主服务器

node数据节点软件包

slave1

10.0.0.20

主备/从服务器

node数据节点软件包

slave2

10.0.0.30

从服务器

node数据节点软件包

  • 操作系统:Cent0S7-6 版本, MHA版本是0.57版本, Mysql数据库安装的是5.7版本
  • 首先,先在三台服务器上安装 MYSQL 数据库。这里我就不再展示了,具体的搭建过程见之前的博客,链接为:MYSQL数据库安装步骤

三、具体搭建过程

这里建议实验主机用 hostnamectl 命令修改,方便实验

#将manager服务器的主机名改为manager
hostnamectl set-hostname manager
su
#修改服务器名称,将manster服务器的主机名改为manster
hostnamectl set-hostname manster
su
 #修改服务器名称,将slave1服务器的主机名改为slaveq
hostnamectl set-hostname slave1
 su
 #修改服务器名称,将slave2服务器的主机名改为slave2
hostnamectl set-hostname slave2
 su

3.1、实现MySQL的一主两从

一、MYSQL数据库已经安装完成,接下来是 Mysql 的一主两从部署。

  • 主服务器 master:
    1、mysql主服务器配置
vim /etc/my.cnf
server-id = 1               //指定id号,服务器的唯一标识,不能相同
log-bin=master-bin           //主服务器日志文件
log-slave-updates=true       //从服务器更新二进制日志

mysql的mha搭建 mysql mha架构_mysql


2、重启服务

systemctl restart mysqld
  • 从服务器slave1:
    1、修改配置文件
vim /etc/my.cnf

server-id = 2       
relay-log=relay-log-bin     //从主服务器上同步日志文件记录到本地  
relay-log-index=slave-relay-bin.index   //定义relay-log的位置和名称

mysql的mha搭建 mysql mha架构_服务器_02


注意:如果你的 mysql 手工编译安装的是 5.7 版本,从服务器一定要在client段把 utf-8 这行注释掉,否则在最后检查MHA健康状况时报错。

[client]
#default-character-set=utf8	  //注释掉此行代码

2、重启服务

systemctl restart mysqld

同样从服务器 slave2 修改id和日志,重启服务。

vim /etc/my.cnf
server-id = 3       
relay-log=relay-log-bin     //从主服务器上同步日志文件记录到本地  
relay-log-index=slave-relay-bin.index   //定义relay-log的位置和名称
#重启服务
systemctl restart mysqld

mysql的mha搭建 mysql mha架构_数据库_03


3、给master、slave1、slave2 分别建立软链接

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

4、数据库的授权。在所有的数据库节点上授权两个用户,一个是从库同步使用,另外一个是 manager 使用监控,即在master、slave1、slave2 上搭建。

mysql -u root -pabc123

grant replication slave on *.* to 'myslave'@'10.0.0.%' identified by '123456';
grant all privileges on *.* to 'mha'@'10.0.0.%' identified by 'manager';
flush privileges;      //刷新数据库的权限相关表

mysql的mha搭建 mysql mha架构_mysql的mha搭建_04


下面三条授权按理论是不用添加的,但是做案例实验环境时候通过MHA检查MySQL主从有报错,

报两个从库通过主机名连接不上主库,所以所有数据库要加上下面的授权。

grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
##不加这三条授权mha健康检查时会报错

在master服务器上查看二进制文件和位置,File和Position这两个值在后面配置从服务器的时候会用到。

show master status;

mysql的mha搭建 mysql mha架构_mysql_05


在slave1和slave2服务器上加权限。

#授权要根据在master上看到的日志文件和position填写,不能乱填
change master to master_host='10.0.0.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=1043;

mysql的mha搭建 mysql mha架构_服务器_06


5、启动同步,查看slave状态,确保以下两个值为YES

start slave;    //开启从服务       
show slave status\G;    //查看状态

mysql的mha搭建 mysql mha架构_服务器_07

必须设置两个从库slave为只读模式
set global read_only=1;

flush privileges;      //刷新数据库的权限相关表

mysql的mha搭建 mysql mha架构_数据库_08

3.2、安装 MHA

1.所有服务器上都安装MHA依赖的环境,首先安装epel源。

yum -y install epel-release --nogpgcheck

yum -y install perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

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

[root@master ~]# tar zxf mha4mysql-node-0.57.tar.gz
[root@master ~]# cd mha4mysql-node-0.57/
[root@master mha4mysql-node-0.57]# perl Makefile.PL
[root@master mha4mysql-node-0.57]# make
[root@master mha4mysql-node-0.57]# make install

3.在MHA-manager上安装manager组件(注意:一定要先安装node组件才能安装manager组件)

[root@manager ~]# tar zxf mha4mysql-manager-0.57.tar.gz
[root@manager ~]# cd mha4mysql-manager-0.57/
[root@manager mha4mysql-manager-0.57]# perl Makefile.PL
[root@manager mha4mysql-manager-0.57]# make
[root@manager mha4mysql-manager-0.57]# make install

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

masterha_conf_host

添加或删除配置的server信息

masterha_manager

启动manager的脚本

masterha_check_repl

检查MySQL复制状况

masterha_master_monitor

检测master是否宕机

masterha_check_ssh

检查MHA的SSH配置情况

masterha_master_switch

控制故障转移(自动或者手动)

masterha_check_status

检查当前MHA运行状态

masterha_stop

关闭manager

Manager的脚本触发,无需人为操作)主要如下:

apply_diff_relay_logs

识别差异的中继日志事件并将其差异的事件应用于其他的slave

filter_mysqlbinlog

去除不必要的rollback事件(MHA已不再使用这个工具)

purge_relay_logs

清除中继日志(不会阻塞SQL线程)

save_binary_logs

保存和复制master的二进制日志

3.3、配置无密码认证

(1)在manager上配置到所有数据节点的无密码认证
[root@manager ~]# ssh-keygen -t rsa   ##一直按回车
[root@manager ~]# ssh-copy-id 10.0.0.10
[root@manager ~]# ssh-copy-id 10.0.0.20
[root@manager ~]# ssh-copy-id 10.0.0.30
(2)在master上配置到slave1和slave2的无密码认证
[root@master ~]# ssh-keygen -t rsa   ##一直按回车
[root@master ~]# ssh-copy-id 10.0.0.20
[root@master ~]# ssh-copy-id 10.0.0.30
(3)在slave1上配置到master和slave2的无密码认证
[root@slave1 ~]# ssh-keygen -t rsa   ##一直按回车
[root@slave1 ~]# ssh-copy-id 10.0.0.10
[root@slave1 ~]# ssh-copy-id 10.0.0.30
(4)在slave2上配置到master和slave1的无密码认证
[root@lslave1 ~]# ssh-keygen -t rsa   ##一直按回车
[root@slave1 ~]# ssh-copy-id 10.0.0.10
[root@slave1 ~]# ssh-copy-id 10.0.0.20

3.4、配置MHA

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

cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

mysql的mha搭建 mysql mha架构_服务器_09

拷贝后会有四个执行文件:

master_ip_failover

自动切换时 VIP 管理的脚本

master_ip_online_change

在线切换时 vip 的管理

power_manager

故障发生后关闭主机的脚本

send_report

因故障切换后发送报警的脚本

2、复制上述的自动切换时VIP管理的脚本到/usr/local/bin 目录,这里使用脚本管理VIP

cp /usr/local/bin/scripts/master_ip_failover /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 = '10.0.0.200';
my $brdc = '10.0.0.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
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;
}
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/#/ 回车即可

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

mkdir /etc/masterha  #创建MHA目录
#复制配置文件到新建的MHA目录下
cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha  
vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
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
user=mha
ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script= /usr/local/bin/masterha_secondary_check -s 10.0.0.20 -s 10.0.0.30
shutdown_script=""
ssh_user=root

[server1]
hostname=10.0.0.10
port=3306

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

[server3]
hostname=10.0.0.30
port=3306
#############################配置文件解析###############################
 [server default]
 manager_log=/var/log/masterha/app1/manager.log #manager日志
 manager_workdir=/var/log/masterha/app1 #manager工作目录
 master_binlog_dir=/usr/local/mysql/data #master保存binlog的位置
 master_ip_failover_script=/usr/local/bin/master_ip_failover #设置自动failover时候的切换脚本
 master_ip_online_change_script=/usr/local/bin/master_ip_online_change #设置手动切换时的切换脚本
 password=manager #设置mysql中root用户的密码,这个密码是前面创建监控用户的密码
 ping_interval=1 #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
 remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置
 repl_password=123 #设置复制用户的密码
 repl_user=myslave #设置复制用户的账户
 report_script=/usr/local/send_report #设置发生切换后发送的报警的脚本
 secondary_check_script=/usr/local/bin/masterha_secondary_check -s 10.0.0.20 -s 10.0.0.30
 shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂)
 ssh_user=root #设置ssh的登录用户名
 user=mha #设置监控用户


4、在 manager服务器上测试ssh无密码认证,如果正常,最后会输出 successfully。

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

mysql的mha搭建 mysql mha架构_服务器_10


检查健康状况

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

mysql的mha搭建 mysql mha架构_数据库_11


5、在master上手动开启虚拟IP

/sbin/ifconfig ens33:1 10.0.0.200/24

mysql的mha搭建 mysql mha架构_数据库_12


6、启动MHA

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 &

7、查看MHA状态,可以看到当前的 master 是Mysqll 节点是 10.0.0.10

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

mysql的mha搭建 mysql mha架构_数据库_13


也可以通过查看MHA日志,显示当前的master 是10.0.0.10

cat /var/log/masterha/app1/manager.log

mysql的mha搭建 mysql mha架构_MySQL_14


2、在master上关闭mysql。

systemctl stop mysql

四、实验验证

将master数据库关闭,模拟宕机

[root@manager ~]# tail -f /var/log/masterha/app1/manager.log  #动态查看日志,准备观察变化
[root@master ~]# pkill -9 mysql                   
##将master数据库关闭,查看MHA中日志变化,如下所示主数据库成功移动到主备数据库上

Wed Nov  4 23:00:17 2020 - [info] Master failover to 10.0.0.20(10.0.0.20:3306) completed successfully.
Wed Nov  4 23:00:17 2020 - [info] Deleted server1 entry from /etc/masterha/app1.cnf .
Wed Nov  4 23:00:17 2020 - [info]

----- Failover Report -----

app1: MySQL Master failover 10.0.0.10(10.0.0.10:3306) to 10.0.0.20(14.0.0.20:3306) succeeded
#在主备数据库上查看网卡信息,发现虚拟IP也成功漂移
[root@slave1 ~]# ifconfig
...省略内容
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.200  netmask 255.255.255.0  broadcast 10.0.0.255
        ether 00:0c:29:34:57:c1  txqueuelen 1000  (Ethernet)