目录
一、概述
(一)概念
(二)组成
(三)特点
(四)工作原理
二、实验要求
三、构建MHA
(一)ssh免密登录
(二)安装mariadb数据库并启动
1、配置 master 机器
2、配置 slave1 机器
3、配置 slave2 机器
4、分别重启服务和设置开机自启
5、分别赋予权限
6、启动从数据库,进行主从数据库同步
6.1、进入数据库
6.2、停止从库
6.3、进行数据同步
(三)MHA安装
(四)停用master的mariadb服务
(五)故障恢复
一、概述
(一)概念
MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。
MHA 的出现就是解决MySQL 单点的问题。
MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。
MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。
(二)组成
MHA manager 管理节点
MHA node 数据节点,每个节点上都需要安装
(三)特点
自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
目前MHA支持一主多从架构,最少三台服务,即一主两从
(四)工作原理
从宕机崩溃的master 保存二进制日志事件(binlog events);
识别含有最新的更新slave日志
应用差异的中继日志(relay log)到其他的slave
应用从master保存的二进制日志事件
提升一个slave为新的master
使其他的slave连接新的master进行复制
二、实验
(一)实验介绍
1、实验环境
manager、monitor、master和slave
IP地址 | 搭建 | 主机名 |
192.168.11.111/24 | manager节点 monitor | mgt( managerment ) |
192.168.11.112/24 | node节点 master | master |
192.168.11.113/24 | node节点 slave | slave1 |
192.168.11.114/24 | node节点 slave | slave2 |
2、实验拓补图
3、实验介绍
本实验要求通过 MHA 监控 MySQL 数据库在master故障时进行自动切换到master salve,不影响业务。
4、配置过程
4.1、配置 MySQL 一主两从
4.2、安装 MHA 软件
4.3、配置无密码认证
4.4、配置 MySQL MHA 高可用
4.5、模拟 master 故障切换
(二)实验基础配置
关闭防火墙、关闭SELinux、关闭图形化网络、配置静态IP地址
1、配置各台主机的主机名
hostnamectl set-hostname mgt
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
2、刷新主机命令
bash
3、分别为四台虚拟机添加本地缓存
vim /etc/hosts
内容:
192.168.11.111 mgt
192.168.11.112 master
192.168.11.113 slave1
192.168.11.114 slave2
scp /etc/hosts 192.168.11.113:/etc/
scp /etc/hosts 192.168.11.113:/etc/
scp /etc/hosts 192.168.11.114:/etc/
三、构建MHA
(一)ssh免密登录
mgt 端 192.168.11.111 需进行的操作
ssh-keygen
ssh-copy-id mgt
查看是否创建成功
注:余下三台机器均将生成密钥对上传至192.168.11.111服务端上,而后进行密钥文件回传,保证互为免密登录
master端 192.168.11.112 需进行的操作
ssh-keygen
ssh-copy-id mgt
slave1 端 192.168.11.113 需进行的操作
ssh-keygen
ssh-copy-id mgt
slave2 端 192.168.11.114 需进行的操作
ssh-keygen
ssh-copy-id mgt
此时我们去IP地址为111的服务端查看密钥对是否接收到
将生成的密钥文件分别在四台机器上进行一次互传
for i in 2 3 4;do scp /root/.ssh/authorized_keys root@192.168.11.11$i:/root/.ssh/;done
注:此时需要在四台主机上分别进行一次免密登录,从而避免后续使用脚本时发生故障问题。(包括自己本身也需进行一次免密登录)
这里演示一台机器,其余机器同理
(二)安装mariadb数据库并启动
yum install -y mariadb mariadb-server
启动服务
systemctl start mariadb
配置流程
1、配置 master 机器
vim /etc/my.cnf
插入内容:
server-id = 20
log-bin = master-bin
log-slave-updates = true
2、配置 slave1 机器
vim /etc/my.cnf
插入内容:
server-id=30
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index
3、配置 slave2 机器
vim /etc/my.cnf
插入内容:
server-id=40
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index
4、分别重启服务和设置开机自启
systemctl restart mariadb
systemctl enable mariadb
5、分别赋予权限
master端
mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.113' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.114' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave1' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave2' identified by '123123';"
注:本来只需赋予第一条命令即可使用,为了防止出现异常,指定后续三个ip段。
slave1端
mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.112' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.114' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'master' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave2' identified by '123123';"
slave2端
mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.112' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.113' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'master' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave1' identified by '123123';"
6、启动从数据库,进行主从数据库同步
6.1、进入数据库
mysql
6.2、停止从库
stop slave;
exit
6.3、进行数据同步
主库查看文件编号,pos值
mysql -e "show master status;"
从库输入命令:(两个从库都是一样的)
mysql -e "change master to master_host='192.168.11.112',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1159;"
分别进入两个从库启动slave
mysql
进入MySQL数据库
start slave;
启动从服务
show slave status\G;
exit
查看状态
主库创建数据库,从库进行查看
mysql -e "create database zn;"
从:(两个从数据库都是一样的命令,在此不过多追述)
mysql -e "show databases;"
此时基本的主从复制已经搭建完成
(三)MHA安装
所有节点安装perl环境(使用此命令两次,升级到最新的epel源)
yum install -y epel-release
下载后续使用安装包缺失的依赖
yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-CPAN
node节点
node节点是计算机网络中的一个设备或主机
所有节点安装node
tar xf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57/
perl Makefile.PL && make && make install
在一台机器上远程将tar包传给其余三台机器
for i in master slave1 slave2;do scp mha4mysql-node-0.57.tar.gz $i:/root/;done
步骤同上,进行安装
验证:看到脚本就OK
cd /usr/local/bin
ls
manager
tar xf mha4mysql-manager-0.57.tar.gz
cd /root/mha4mysql-manager-0.57
perl Makefile.PL && make && make install
cp /root/mha4mysql-manager-0.57/samples/scripts/master_ip_failover /usr/local/bin/
cp /root/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change /usr/local/bin/
脚本说明
cd /root/mha4mysql-manager-0.57/samples/scripts
master_ip_failover 自动切换时 VIP 管理的脚本
master_ip_online_change 在线切换时 vip 的管理
power_manager 故障发生后关闭主机的脚本
send_report 因故障切换后发送报警的脚本
注:master_ip_failover安装包自带的配置文件有问题,脚本没有写全,需重新进行编辑
这里使用以下命令将其备份
mv master_ip_failover master_ip_failover_bak
然后创建新的文件,并赋予权限
vim 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.11.100'; #指定vip的地址 my $brdc = '192.168.11.255'; #指定vip的广播地址 my $ifdev = 'ens33'; #指定vip绑定的网卡 my $key = '1'; #指定vip绑定的虚拟网卡序列号 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #代表此变量值为ifconfig ens33:1 192.168.11.100 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #代表此变量值为ifconfig ens33:1 192.168.11.100 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"; ################################################################################## 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"; }
赋予权限:
chmod 755 master_ip_failover ll
创建配置文件
mkdir /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=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=123123
ping_interval=1
remote_workdir=/tmp
repl_password=123123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.11.113 -s 192.168.11.114
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=192.168.11.112
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.11.113
port=3306[server3]
hostname=192.168.11.114
port=3306
文件内容解析:
manager_log
:MHA管理器的日志文件路径。manager_workdir
:MHA管理器的工作目录。master_binlog_dir
:MySQL主服务器的二进制日志目录。master_ip_failover_script
:用于执行IP故障切换的脚本路径。master_ip_online_change_script
:用于执行在线IP更改的脚本路径。password
:MySQL的密码。ping_interval
:MHA管理器检测服务器存活状态的时间间隔。remote_workdir
:远程主机的工作目录。repl_password
:复制用户的密码。repl_user
:复制用户的用户名。secondary_check_script
:用于检查从服务器的脚本路径。shutdown_script
:关机时执行的脚本路径。ssh_user
:用于通过SSH连接到服务器的用户名。user
:MHA管理器的用户名。接下来是每个服务器的具体配置:
server1
:主服务器的配置。
hostname
:服务器的主机名或IP地址。
port
:MySQL服务的端口号。
server2
:备选主服务器的配置。
candidate_master
:指示该服务器是否可以成为主服务器的标志。1表示是,0表示否。
check_repl_delay
:检查复制延迟的时间(以秒为单位)。
server3
:从服务器的配置。
hostname
:服务器的主机名或IP地址。
port
:MySQL服务的端口号。
mkdir /var/log/masterha/app1 -p
测试MHA
masterha_check_ssh --conf=/etc/masterha/app1.cnf
显示ok即为成功,没有错误
masterha_check_repl --conf=/etc/masterha/app1.cnf
启动命令
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 &
命令解析:
nohup
: 这是一个命令,用于在后台运行指定的命令,并忽略挂起信号。这意味着即使关闭终端也不会停止该进程。masterha_manager
: 这是要运行的命令或可执行文件的名称,即masterha_manager。--conf=/etc/masterha/app1.cnf
: 这是指定masterha_manager的配置文件路径和名称。--remove_dead_master_conf
: 这是masterha_manager的一个选项,用于在故障转移后自动删除已死亡主节点的配置。--ignore_last_failover
: 这是masterha_manager的一个选项,用于忽略最后一次故障转移。< /dev/null
: 这是将空设备/dev/null作为masterha_manager的输入。这意味着不会从标准输入读取任何输入。> /var/log/masterha/app1/manager.log
: 这是将masterha_manager的输出重定向到指定的日志文件,即/var/log/masterha/app1/manager.log。2>&1
: 这是将标准错误输出也重定向到与标准输出相同的位置,即将错误信息写入到manager.log中。&
: 这是一个特殊符号,表示将命令放入后台运行。因此,这段命令的意思是以后台模式运行masterha_manager,并将其输出重定向到指定的日志文件中。同时,还忽略了最后一次故障转移的记录,自动删除已死亡主节点的配置,并且不从标准输入读取任何输入。
查看
jobs
启动时masterIP异常
需要工程手动配置VIP
(四)停用master的mariadb服务,模拟故障
systemctl stop mariadb
在slave1里查看
ip a
注:服务在完成以后自动回掉,此时需手动重启
停止命令
jobs
fg 1
将后台进程掉到前台,ctrl+c进行打断即可
(五)故障恢复
在停掉master以后,配置文件中内容回消失
vim /etc/masterha/app1.cnf
修改app1.cnf启动配置,添加master主机配置信息
将内容添加进去即可
[server1]
hostname=192.168.11.112
port=3306
分别在slave上重新指定master主机及binlog日志同步信息
master 端进行操作
启动服务
systemctl start mariadb
进入数据库
mysql
停止从库
stop slave;
exit
查看状态
mysql -e "show master status;"
slave1 、2端进行操作
重启服务
systemctl restart mariadb
进入数据库
mysql
停止从服务
stop slave;
exit
同步数据
mysql -e "change master to master_host='192.168.11.112',master_user='myslave',master_password='123123',master_log_file='master-bin.000003',master_log_pos=245;"
分别从两个从库进入数据库
mysql
启动
start slave;
查看状态并退出
show slave status\G;
exit
主库创建内容
mysql -e "create database zm;"
从库进行查看
mysql -e "show databases;"
这样可以看到主从复制又恢复原有了
注:但是有一点需要注意,在恢复完毕后,在主的机器上还是看不见设置的虚IP地址。如果想看见的话,就关闭主的服务,然后去从上进行查看!!!感觉不是很灵活的样子,做完还得重新进行配置然后再给改回来,然后还是看不见。。。陷入了俄罗斯套娃。。。。