MHA:
Masterhight availabulity:基于主库的高可用环境下:主从复制 故障切换
MHA主从的架构:最少要一主两从
Mysql的单点故障问题,一旦主库崩溃,MHA可以在0-30秒内自动完成故障切换
MHA使用的是半同步复制,只要有一台从服务器写入数据,就会自动提交给客户端。
****原理:****如果master崩溃,slave就会从主的二进制日志保存文件
Slave会识别最新更新的日志
差异部分同步到slave
提升一个新的slave作为master
其他的slave继续和新的master同步
实验准备:
1.MHA架构搭建
2.模拟故障
3.故障恢复
MHA manger 192.168.120.110
Master 192.168.120.80
Slave1 192.168.120.90
slave2 192.168.120.100
node组件------>需要部署在所有服务器上,manger组件依赖于node组件,node组件监控mysql的状态。
node组件靠ssh来进行通信
实验过程
1、 搭建MHA架构
2、 模拟故障
3、 故障恢复
实验准备:
MHA manger 192.168.120.110
Master 192.168.120.80
Slave1 192.168.120.90
slave2 192.168.120.100
node组件:需要部署在所有服务器上。因为manager组件依赖于node组件。node组件就是用来监控MySQL的状态的。
node组件靠ssh远程连接服务来进行通信。
开始实验
修改从主机名192.168.120.90
hostnamectl set-hostname slave1
修改从主机名192.168.120.100
hostnamectl set-hostname slave2
修改主主机名192.168.120.80
hostnamectl set-hostname master
su一下让他们都生效
修改完成后ping一下主机名看一下能不能通
先实现主从复制
配置主MySQL
vim /etc/my.conf
server-id=1
log_bin=master-bin
log-slave-updates=ture
配置从MySQL1
server-id=2
log_bin=master-bin
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
配置从MySQL2
server-id=3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
重启三台MySQL
在主和从服务器上创建软连接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin
三台主机上都要创建软连接
mysql -u root -p123456
#进入数据库
三台服务器同时操作
从数据库同步使用
grant replication slave on *.* to 'myslave'@'192.168.120.%' identified by '123456'; 给mha权限能访问主从的权限
#manager 使用
grant all privileges on *.* to 'mha'@'192.168.120.%' 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';
flush privileges;
#刷新其权限
在 Master 节点查看二进制文件和同步点
show master status;
在 Slave1、Slave2 节点执行同步操作
change master to master_host='192.168.120.80',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1747;
start slave;
#打开两个从的slave
show slave status\G;
#查看两个从的slave的状态都是yes表示成功
必须要把两个从库都设为只读模式
set global read only=1
#把两个从库都设为只读模式
打开工具测试一下主从复制是否成功
create database kgc;
#创建一个库
进入MHA的配置
所有的服务器都需要安装MHA的依赖环境必须要有epel源
开始安装
yum install epel-release --nogpgcheck -y
#epel源
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
#MHA依赖环境
先安装node组件,再安装manager组件
每台服务器上都需要部署node节点
cd /opt
tar -xf mha4mysql-node-0.57.tar.gz
#解压文件
perl Makefile.PL
#编译
make $$ make install
回到mha服务器
解压高可用节点
tar -xf mha4mysql-manager-0.57.tar.gz
#解压
cd mhamanager
perl Makefile.PL
make $$ make install
cd /usr/local/bin/
#查看一下重要组件
ll -h
master的组件:
masterha_check_ssh
#检查MHA的ssh的配置情况
masterha_check_repl
#检查MySQL的复制情况
masterha_manager
#启动manger的脚本
masterha_check_status
#检测MHA的运行状态
masterhaha_master_monitor
#检测master主机的情况,masters是否宕机
masterha_master_switch
#控制故障转移
masterha_conf_host
#添加或者删除配置的server信息
masterha_stp
#停止MHA的脚本
重要的node组件:
save_binary_logs
#保存和复制master的二进制日志
apply_diff_relay_logs
#识别二进制日志当中的差异事件,然后发送给其他的slave
filter_mysqlbinlog
#去除不必要的回滚(MHA已经不用了)
purge_relay_logs
#同步之后清除中继日志(不会阻塞sql的限制)
开始实现ssh免密登录
在MHA主机上操作
ssh-keygen -t rsa
#选择加密方式
一路回车
ssh-copy-id 192.168.120.80
输入密码和yes
ssh-copy-id 192.168.120.90
输入密码和yes
ssh-copy-id 192.168.120.100
输入密码和yes
回到master主机
ssh-keygen -t rsa
#选择加密方式
ssh-copy-id 192.168.120.90
输入密码和yes
ssh-copy-id192.168.120.100
输入密码和yes
回到slave1主机
ssh-keygen -t rsa
#选择加密方式
ssh-copy-id 192.168.120.80
输入密码和yes
ssh-copy-id 192.168.120.100
输入密码和yes
回到slave2主机
ssh-keygen -t rsa
#选择加密方式
ssh-copy-id 192.168.120.80
输入密码和yes
ssh-copy-id 192.168.120.90
输入密码和yes
在 manager 节点上配置 MHAcd /usr/loacl/bin
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,
这里使用master_ip_failover脚本来管理 VIP 和故障切换
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
拷贝后会有四个执行文件
master_ip_failover
#自动切换时管理VIP的脚本
master_ip_online_change
#在线切换时的vip管理脚本
power_manger
#如果故障发生之后关闭master脚本
send_report
#发送故障时的告警脚本
vim master_ip_failover
除了第一行全部删除
添加控制脚本
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.120.120';
#设定vip地址
my $brdc = '192.168.120.255';
#设定VIP的广播地址
my $ifdev = 'ens33';
#VIP绑定的网卡
my $key = '1';
#ifcong ens33:1 192.168.120.120/24 key是1,网卡的编号就是1
my ssh_start_vip = "/sbin/ifconfig ens33:key $vip";
#key:ens33:1 192.168.120.120 up
my ssh_stop_vip = "/sbin/ifconfig ens33:key down";
#ens33:1 192.168.120.120 down
my $exit_code = 0;
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 {
"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";
}
#master宕机之后,VIP地址切换到新的主库
创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器
mkdir /etc/masterha
cp /opt/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的管理日志
manager_workdir=/var/log/masterha/app1
#manager的工作目录
master_binlog_dir=/usr/local/mysql/data
#保存master的二进制的位置,必须要和master保存的路径一致
master_ip_failover_script=/usr/local/bin/master_ip_failover
#设置自动切换脚本
master_ip_online_change_script=/usr/local/bin/master_ip_onli
ne_change
#手动切换脚本
password=manager
ping_interval=1
#监控主库发送ping包的时间间隔 1代表1秒 工作中一般3-6秒。会尝试3次之后会切换到failover脚本进行自动切换
remote_workdir=/tmp
#mysql在发生切换时,binlog的保存位置
repl_password=123456
#登录主库和从库的用户密码
repl_user=myslave
#用户名
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.120.90 -s 192.168.120.100
#从和主之间互相监听,主服务器无需声明,但是从服务器需要在check之后声明
#从对主监听
shutdown_script=""
#设置切换时告警的脚本
ssh_user=root
#远程登录的用户名
user=mha
[server1]
hostname=192.168.120.80
#主服务器
port=3306
[server2]
candidate_master=1
#设置后选的master主库崩溃会切换到server2
check_repl_delay=0
#即使设置了权重,但是从服务器的relay_logs落后master100M,即使设置了权重也不会切换。通过设置0会忽略设置延迟复制,直接升为主.强制切换到设定为候选master的服务器。
hostname=192.168.120.90
#备用主服务器
port=3306
[server3]
hostname=192.168.120.100
#从服务器2
port=3306
测试ssh通信是否正常
masterha_check_ssh -conf=/etc/masterha/app1.cnf
#测试ssh通信主从之间免密登录是否正常
测试主从连接情况是否正常
masterha_check_repl-conf=/etc/masterha/app1.cnf
#测试主从连接情况是否正常
都显示ok表示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地址会从文件中删除
/var/log/masterha/app1/manager.log
#MHA的管理日志
-ignore_last_failover
#如果检测到连续发生宕机,而且宕机的事件间隔不足8小时,不会进行自动切换。忽略时间间隔只要发生故障,就会切换
cat /var/log/masterha/app1/manager.log | grep "current master"
在开一个20主机监控一下管理日志
tail -f /var/log/masterha/app1/manager.log
这时候停掉主MySQL
systemctl stop mysqld
然后到20查看日志
查看一下vip地址还在不在主库192.168.120.80上如果已经转移到主库192.168.120.90上代表切换成功。
开始故障恢复
进入MySQL1的my.cnf文件进行配置
vim /etc/my.conf
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
#将MySQL1设为从
再进入MySQL2的my.cnf文件进行配置
vim /etc/my.conf
log_bin = master-bin
log-slave-updates=ture
#将MySQL2设置为新的主
进入manager主机
配置文件进行配置
vim /etc/masterha/app1.cnf
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.120.80 -s 192.168.120.100
#声明从库的ip将192.168.120.90修改为192.168.120.80
[server1]
hostname=192.168.120.80
port=3306
#server1的ip改为80
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.120.90
port=3306
#复制一个server2出来将ip改为90
修改完成后重启启动一下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 &
然后回到新的主MySQL192.168.12.90
重启MySQL服务
systemctl restart mysqld
进入MySQL
mysql -u root -p
查看一下偏移点
show master status;
再回到MySQL1
启动MySQL服务
进入MySQL
先停止slave服务
stop slave
进行配置
change master to master_host='192.168.120.90',
master_user='myslave',master_password='123456',
master_log_file='master-bin.000002',
master_log_pos=154;
#绑定新的主MySQL的ip和日志文件和偏移点
配置完成后
reset slave
start slave
#启动slave服务
查看一下slave的状态
show slave status\G
此时出现两个yes代表实验成功
进入新的主MySQL192.168.120.90
创建一个库
create database kgc2;
三台MySQL都能查看到代表实验成功
故障修复步骤:
1.修复mysql
systemctl restart mysqld
2.修复主从
#在现主库服务器 Mysql2 查看二进制文件和同步点
show master status;
#在原主库服务器 mysql1 执行同步操作
change master to master_host='192.168.120.90',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1747;
stop slave;
reset slave;
#一定要重置服务。
start slave;
修改原主的配置文件和新主的配置文件:
原主库修改:
server-id = 1
log_bin=master-bin
relay-log = relay-log_bin
relay-log-index = slave-relay_bin.index
新主库:
server-id = 2
log_bin=master-bin
log-slave-updates=true
systemctl restart mysqld
3.在 manager 节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
vim /etc/masterha/app1.cnf
......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.120.80 -s 192.168.120.100
......
[server1]
hostname=192.168.120.80
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.120.90
port=3306
[server3]
hostname=192.168.120.100
port=3306
- 重启manager:
masterha_stop --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 &