目录
5、进行一次软连接,方便后面的使用,所有服务器都一起做软连接
6、设置登录数据库的账户和密码,因为每台从服务器都是备用主服务器,所以所有服务器都开启一下授权
文章绝大部分都是都敲上去的,可能会有错一个字母之类的,见谅,谢谢
一、MHA的原理
1.MHA概述
一套优秀的mysql高可用环境下故障切换和主从复制的软件
MHA的出现就是解决mysql单点的问题
mysql故障过程中,MHA能做到0-30秒内自动完成故障切换
MHA再故障切换的过程中,最大程度上保证数据的一致性,以达到真正意义上的高可用
MHA的组成
MHA Manafer (管理节点)
MHA Node (数据节点)
2.MHA的特点与原理
自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。
使用把同步复制,可以大大降低数据丢失的风险
目前MHA支持一主多从架构,最少三台服务,即一主两从
MHA的工作原理
一个HMA服务架构,下面有多个主服务器,主服务器下面有多个从服务器
当其中一个主服务器宕机之后,该主服务器下的其中一个从服务器就会上去顶替主服务器的岗位,来负责转发等一系列工作。但是,在MHA中,原主服务器,就会被删除掉,新顶替上去的服务器会记录进去,就算是原主服务器恢复之后,也不再恢复岗位,只能再次配置。
在一个集群中,当一个主服务器宕机之后,会自动找到一个数据最新的从服务器1号,然后再根据这个从服务器,找到一个数据最新的从服务器2号,在进行对比,将从服务器2号跟从服务器1号进行对比,将从服务器2号没有的部分取过来,填补进来,达到跟从服务器1号相同。当两个从服务器数据一致之后,从服务器1号会跟宕机的主服务器进行对比,获取自己没有的数据,然后自己成为主服务器,再将自己的数据同步给从服务器2号
MHA同步数据的步骤是,当现在的主宕机之后,会自动寻找一个信息最新的从,找到这个从之后,再找一个相对最新的另外一个从服务器,找到两个从服务器,之后,信息最新的从服务器将自己的数据以差异备份的方式,备份到第二台从服务器,再将当前宕机的主服务器的信息以差异备份的方式,备份到最新的从服务器,从服务器自动升格为主服务器,同时,新的主服务器会将数据备份到之前找到的第二台从服务器
二、mysql搭建步骤
1、所有服务器都更改一下主机名字,方便后面查询
hostnamectl set-hostname mysql1
2、修改配置文件中的域名,方便后面连接
vim /etc/hosts
在配置文件尾添加下面三行,三台服务器都添加一下
192.168.75.61 mysql1
192.168.75.62 mysql2
192.168.75.63 mysql3
3.、进入配置文件添加文件
进入文件 vim /etc/my.cnf
在[mysqld]下面添加以下命令
log_bin = master-bin
log-slave-updates = true
添加完成之后,重启服务
systemctl restart mysqld.service
4、从服务器也进入配置文件进行
进入文件 vim /etc/my.cnf
在[mysqld]下面添加以下命令
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
剩下的几台从服务器,也是同样的步骤设置,改下id号即可,略
添加完成之后,重启服务
systemctl restart mysqld.service
5、进行一次软连接,方便后面的使用,所有服务器都一起做软连接
ln -s /usr/local/mysql/bin/{mysql,mysqlbinlog} /usr/sbin
6、设置登录数据库的账户和密码,因为每台从服务器都是备用主服务器,所以所有服务器都开启一下授权
grant replication slave on *.* to 'myslave'@'192.168.75.%' identified by '123123';
这个是需要先在主服务器上进入mysql,然后根据自己的网段进行设置,myslave是从服务器节点用于连接的名字,123123则是密码,后续需要用,根据自己习惯进行配置
7、对主从用户进行授权
grant all privileges on *.* to 'mha'@'192.168.75.%' identified by 'manager';
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,mysql1,这两个都是后面用于连接manager用的
flush privileges;
每个在配置完之后都用上面命令刷新一下
8、查看主库的状态
show master status;
9、从库上配置节点
change master to master_host='192.168.75.61',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1745;
需要注意的一点,配置节点的master_user是上面自己配置的主服务器名称,密码等等也是一样,都是需要指定主服务器,要根据自己的实际情况配置
10、设置从服务器只读模式
set global read_only=1;
设置从节点,只读模式,所有从节点都操作一遍
上面步骤搭建成功之后,主从就搭建成功,下面就进一步搭建MHA
三、MHA配置
1、安装依赖环境
yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
需要注意的一点是,如果用yum安装的时候,使用的是本地仓库,是不能全部安装的,会有部分缺失,推荐直接使用默认的网络源即可
2、解压MHA安装包并且编译安装
链接:https://pan.baidu.com/s/1IFvkA7qO2XpTgVn0n8Yvww
提取码:3323
这是需要用到的两个架构节点安装包,有需要的可以前去下载
mha4mysql-node-0.57.tar
先在所有服务器上都安装这个节点安装包,包括主从服务器
先移动到安装包存放的地址,然后解压
tar zxf mha4mysql-node-0.57.tar.gz
另外几台就略过了
再去进入解压后的文件中,逐个进行使用perl脚本进行解析
perl Makefile.PL
再接着进行make编译安装
make && make install
在所有服务器上编译安装完成之后,回到Manager节点服务器上编译安装Manager程序
tar zxf mha4mysql-manager-0.57.tar.gz
移动到文件加压后的位置内部,再用同样的步骤进行解析以及编译安装
用于作为主从的服务器不需要安装manager服务
3、安装完成之后,可以到日志文件中查看
上面两个程序安装成功之后,会产生日志文件,文件位置如下:
cd /usr/local/bin
上图分别是两个程序分别产生的文件
其中manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:
masterha_check_ssh 检查 MHA 的 SSH 配置状况
masterha_check_repl 检查 MySQL 复制状况
masterha_manger 启动 manager的脚本
masterha_check_status 检测当前 MHA 运行状态
masterha_master_monitor 检测 master 是否宕机
masterha_master_switch 控制故障转移(自动或者 手动)
masterha_conf_host 添加或删除配置的 server 信息
masterha_stop 关闭manager
node 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
4、在所有服务器上配置无密码认证
开启无密码登录
ssh-keygen -t rsa #默认即可,回车三次
ssh-copy-id 192.168.75.63 #其他所有服务器也需要再设置一遍,只需要改成目标的IP地址即可
例如:
mysql1:
ssh-copy-id 192.168.75.62
ssh-copy-id 192.168.75.63
mysql2:
ssh-copy-id 192.168.75.61
ssh-copy-id 192.168.75.63
mysql3:
ssh-copy-id 192.168.75.61
ssh-copy-id 192.168.75.62
manager:
ssh-copy-id 192.168.75.61
ssh-copy-id 192.168.75.62
ssh-copy-id 192.168.75.63
实际需求按照自己的实际IP地址搭配,上面是我自己根据自己的配置设置的
在输入建立连接的时候,先是需要输入yes,再输入目标超级管理员账户的密码
所有服务器全配置一遍,保证能够连接成功即可
5、在manager节点上操作
在manager节点上复制指定文件到/usr/local/bin 目录
cp -rp /mysql/mha4mysql-manager-0.57/samples/scripts/* /usr/local/bin/
注:mysql/mha4mysql-manager-0.57/是我自己创建的文件路径,实际根据自己的路径选择
共计复制过去四个脚本文件
master_ip_failover #自动切换时 VIP 管理的脚本
master_ip_online_change #在线切换时 vip 的管理
power_manager #故障发生后关闭主机的脚本
send_report #因故障切换后发送报警的脚本
6、修改自动切换VIP
文件就是上个步骤复制过去的文件其中第一个,用于管理自动切换VIP的脚本
vim master_ip_failover
#进入配置文件中,将原内容直接注释掉或者删除都行,再重新写入下面的新的
为了图个方便,直接将原文件中的数据删除,写入新的,比较方便,直接重新写入下面的命令即可
其中,下面这段需要特别注意一下,等下需要更改
my $vip = '192.168.75.188'; #指定vip的地址
#后面在配置决定谁是主服务器的决定性地址,在拥有这个虚拟IP的主服务器宕机的时候,该地址会自动找人继承
my $brdc = '192.168.75.255'; #指定vip的广播地址
my $ifdev = 'ens33'; #指定vip绑定的网卡
#指定开启虚拟IP的网卡是哪一块
my $key = '1'; #指定vip绑定的虚拟网卡序列号
#用于指定绑定的是该网卡下第几个虚拟IP
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #代表此变量值为ifconfig ens33:1 192.168.75.61
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #代表此变量值为ifconfig ens33:1 192.168.75.61 down
my $exit_code = 0; #指定退出状态码为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";
#!/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.75.188';
my $brdc = '192.168.75.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_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";
##################################################################################
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";
}
确定无误之后,保存退出即可
7、复制用于自动切换主从的文件
cd /mysql/mha4mysql-manager-0.57/samples/conf/ #自己解压后的文件路径
创建一个存放位置
mkdir /etc/masterha #为了好辨认,就直接命名为masterha
将配置切换功能的文件复制过去
cp app1.cnf /etc/masterha/
移动完成之后,直接进入文件所在目录
cd /etc/masterha
进入配置文件
vim app1.cnf #进入配置文件,可以将现有的注释或者删除
下面是一些需要注意的地方,以及每段的意义
[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里配置的binlog的路径一致,以便MHA能找到
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 192.168.*.* -s 192.168.*.* #指定检查的从服务器IP地址
shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root #设置ssh的登录用户名
user=mha #设置监控用户root
[server1]
hostname=192.168.75.61
port=3306
#server1默认为当前的主服务器
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.75.63
port=3306
#指定该服务器为主服务器备选,如果不指定,则是选取数据最新的一台作为主服务器
[server3]
hostname=192.168.75.63
port=3306
[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=123123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.75.62 -s 192.168.75.63
shutdown_script=""
ssh_user=root
user=mha
[server1]
hostname=192.168.75.61
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.75.63
port=3306
[server3]
hostname=192.168.75.63
port=3306
8、在主服务器上开启一个虚拟
ifconfig ens33:1 192.168.75.188/24
需要注意的是,这个是你在manager上面自己配置的虚拟IP地址
9、回到manager节点上测试ssh连接
masterha_check_ssh-conf=/etc/masterha/app1.cnf
最后出现下面字段,显示正常
masterha_check_ssh -conf=/etc/masterha/app1.cnf
Sun Dec 5 22:19:27 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
....................................................
Sun Dec 5 22:19:29 2021 - [debug] ok.
Sun Dec 5 22:19:30 2021 - [info] All SSH connection tests passed successfully.
10、继续测试连接mysql的测试
在做这个操作之前,需要先检查一下所有主从服务器,进入下面配置文件,将所有字符类型格式删除或者注释即可,因为英文跟中文可能会有冲突,导致测试失败,连接不上
vim /etc/my.cnf
都注释掉或者删除
删除之后并且重启服务,然后进行连接
masterha_check_repl -conf=/etc/masterha/app1.cnf
最后一行显示下列字样则是为正确
MySQL Replication Health is OK
11、启动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 &
上面命令的每段的意义
--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--manger_log:日志存放位置。
--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
12、查看当前主服务器的信息
masterha_check_status --conf=/etc/masterha/app1.cnf
就可以看到当前的连接情况,以及主服务器的IP地址
13、查看MHA日志
cat /var/log/masterha/app1/manager.log | grep "current master"
发现已经产生了主服务器的日志信息
现在自动切换系统就已经配置完毕
四、模拟故障并恢复
1、故障模拟
简单粗暴的模拟方法,直接将主服务器关闭
先在之前配置的备用主服务器看一下,是没有虚拟IP的存在
当前主服务器是存在这个虚拟IP的
先手动将服务关闭
systemctl stop mysqld.service
再去查看网卡配置,就会发下代表主服务器的虚拟IP已经消失
再到之前设置的备用主服务器上看一下
会发现,现在这个IP已经自动转移到这个服务器上了。
现在回到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 &
再查看一下服务日志,就会发现,现在主服务器位于一个新的位置
cat /var/log/masterha/app1/manager.log | grep "current master"
查看配置文件
vim /etc/masterha/app1.cnf
之前配置的server1已经被移除,现在server2已经作为主服务器“上任”了,就算故障的前主服务器回复正常,也不会自动回到这个架构中,只能自己手动添加
2、恢复方式
恢复方式较为简单
直接在当前配置文件中,插入一个server1
因为server1默认为主服务器,所以就将地址该为现在的主服务器地址,然后前主服务器的地址作为备用主服务器,添加到server2上即可。
再到当前的主服务器上,登录mysql,查看当前的master状态
show master status;
然后回到需要恢复的那台服务器上,进行添加从服务器节点
change master to master_host='192.168.75.62',master_user='myslave',master_password='123123',master_log_file='master-bin.000004',master_log_pos=154;
需要注意的是,当前主服务器的节点信息不能填写错误,需要一致
开启从服务器
start slave;
查看从服务器状态
show slave status\G
连接状态显示两个yes,证明已经配置完成,等待当前主服务器宕机之后,这台服务器就会自动回到主服务器位置
总结
MHA自动切换功能总体来说,没有什么太难得难点,只需要细心注意细节即可,每个节点之间别配置错误,文件位置不要存放错误,修改的文件别错乱,时刻注意防火墙等阻碍网络连通性的程序的开启状况即可。