目录
[1、配置 master 机器](#1、配置 master 机器)
[2、配置 slave1 机器](#2、配置 slave1 机器)
[3、配置 slave2 机器](#3、配置 slave2 机器)
一、概述
(一)概念
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地址。如果想看见的话,就关闭主的服务,然后去从上进行查看!!!感觉不是很灵活的样子,做完还得重新进行配置然后再给改回来,然后还是看不见。。。陷入了俄罗斯套娃。。。。