MHA工作原理
1、当master出现故障时,通过对比slave之间I/O线程读取master上的binlog的位置,选择最接近的slave做为新的slave(laster slave) 2、其它slave通过与laster slave对比,生成差异中继日志,并应用 3、在laster slave上应用master保存的binlog,同时将laster slave提升为master 4、最后在其它slave上应用相应的差异中继日志,并开始从新的master开始复制
MHA组件
MHA Manger(管理节点)
MHA Manger可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上
MHA Node(数据节点)
MHA Node运行在每台Mysql服务器上,MHA Manger会定时探测集群中的master节点,当master出现故障时,它可以自动将数据的slave提升为master,然后将所有其他的slave重新指向新的master。
MHA组件简介
MHA Manger
运行一些工具,比如masterha_manager工具实现自动监控MySQL Master和实现master故障切换,其它工具手动实现master故障切换,在线master转移,连接检查。一个manger可以管理多个master-slave集群
MHA Node
部署在所有运行的MySQL的服务器上,无论是master还是slave。有三个作用: 1、保存二进制日志 如果能够访问故障master,会拷贝master的二进制日志 2、应用差异中继日志 从拥有最新数据的slave上生成差异中继日志,然后应用差异日志 3、清除中继日志 在不停止sql线程的情况下删除中继日志
MHA中工具介绍
Manger工具 Node工具 MHA部署规划
搭建高可用架构
1、基本设置(四台服务器)
2、配置yum基础源和epel源
使用阿里云配置
3、配置ssh免密
在所有节点设置主机映射 vim /etc/hosts
192.168.156.10 mgr
192.168.156.20 master
192.168.156.30 slave1
192.168.156.40 slave2
配置免密
[root@mgr ~]
[root@mgr ~]
[root@mgr ~]
[root@mgr ~]
4、时间同步(四台服务器)
5、部署mysql主从复制环境
master端 vim mysql.sh 这个脚本文件要和MySQL安装包放在一起
#!/bin/bash
yum install libaio -y
tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
cd /usr/local/mysql
mkdir mysql-files
chown -R mysql:mysql /usr/local/mysql
chown 750 /usr/local/mysql
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
source /etc/profile
给脚本添加执行权限:chomd +x mysql.sh 设置my.cnf vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
character-set-server=utf8mb4
log-error=/usr/local/mysql/data/mysqld.log
log-bin=/usr/local/mysql/data/binlog
server-id=20
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
启动mysql:
[root@master ~]
进入mysql端(密码在/root/password.txt);
[root@master ~]
设置一个admin同步账号
修改root用户密码
mysql> set password=password('root');
创建一个admin同步账号,密码为admin
mysql> create user 'admin'@'192.168.156.%' identified by 'admin';
给admin账号复制权限
mysql> grant replication slave on *.* to 'slave'@'192.168.156.%';
刷新权限
mysql> flush privileges;
创建一个mha账号(用于后期的MHA监控)
mysql> create user 'mha'@'192.168.156.%' identified by 'mha';
mysql> grant replication slave on *.* to 'mha'@'192.168.156.%';
mysql> flush privileges;
停止mysql
[root@master ~]
slave1和slave2端 vim mysql.sh 这个脚本文件要和MySQL安装包放在一起
#!/bin/bash
yum install libaio -y
tar -xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown -R mysql:mysql /usr/local/mysql
chown 750 /usr/local/mysql
cp support-files/mysql.server /etc/init.d/mysqld
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
给脚本添加执行权限:chomd +x mysql.sh 设置my.cnf vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
character-set-server=utf8mb4
log-error=/usr/local/mysql/data/mysqld.log
relay-log=/usr/local/mysql/data/relaylog
server-id=30
log-bin=/usr/local/mysql/data/binlog
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
skip-slave-start
同步master于slave端数据一致性
[root@master ~]
[root@master ~]
[root@master ~]
在slave1和slave2端,修改用户权限,否则slave端不能启动mysql
在master、slave1、slave2上同时开启MySQL服务
在slave1和slave2端
mysql> change master to master_host='192.168.156.20',master_port=3306,master_user='admin',master_password='admin',master_auto_position=1;
mysql> start slave;
msyql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.156.20
Master_User: admin
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000006
Read_Master_Log_Pos: 234
Relay_Log_File: relaylog.000002
Relay_Log_Pos: 361
Relay_Master_Log_File: binlog.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
看到 Slave_IO_Running和Slave_SQL_Running都为yes表示成功
6、MHA端软件安装
mha-node与mha-manager软件 链接:https://pan.baidu.com/s/1PEZl3vdiu8spB4jq1DanSA 提取码:adbn
在所有节点安装mha-node软件包,在mha管理端安装mha-manager 安装依赖 在所有服务器端口
安装mha-node与mha-manager
[root@mgr ~]
[root@mgr ~]
[root@master ~]
[root@slave1 ~]
[root@slave2 ~]
7、配置admin用户ssh免密
在所有节点创建一个admin用户,密码为admin,用于mha的监控管理
设置mha主机与其他主机的admin用户互信免密 mha端
[root@mgr ~]
[admin@mgr ~]$ ssh-keygen
[admin@mgr ~]$ ssh-copy-id master
[admin@mgr ~]$ ssh-copy-id slave1
[admin@mgr ~]$ ssh-copy-id slave2
输入密码时,输入的时admin的密码
设置admin的sudo权限 master端
[root@master ~]
User_Alias MYSQL_USERS=admin
Runas_Alias MYSQL_RUNAS=root
Cmnd_Alias MYSQL_CMNDS=/sbin/ifconfig,/sbin/arping
MYSQL_USERS ALL=(MYSQL_RUNAS) NOPASSWD: MYSQL_CMNDS
分发slave1和slave2
[root@master ~]
[root@master ~]
在master挂载VIP
[root@master ~]
[root@master ~]
[root@master ~]
[root@master ~]
arping: 用来向局域网内的其它主机发送ARP请求的指令,可以用来测试局域网内某个IP是否已经被使用
-f 收到的第一个相应包后退出
-q quite模式,不显示输出
-c 发送指定的count个ARP REQUEST包后停止,如果指定了-w参数,会等待形同数量的ARP REQUEST包,直到超时为止
-w 指定一个超时时间,单位为秒。arping在到达指定时间后退出,无论期间发送或接收了多少包,在这种情况下,arping在发送指定的count(-c)个包后并不会停止,而是等待到超时或发送的count个包都进行了回应后才会退出
-I 指定设备名,用于发送ARP REQUEST包的网络设备的名称
-D 重复地址探测地址,用于检查有没有IP地址冲突,如果没有IP冲突则返回0
-s 设置发送ARP包的IP资源地址
-U 强制的ARP模式更新别的主机上的ARP CACHE列表的本机信息,不需要响应
-h 显示帮助
当看到网卡上出现了两个ip表示已经成功
创建mha相关配置文件 mgr端
[root@mgr admin]
[root@mgr admin]
[root@mgr admin]
设置mgr配置文件
[root@mgr admin]
[server default]
user=mha
password=mha
repl_user=admin
repl_password=admin
ssh_user=admin
ping_interval=5
manager_workdir=/data/mha/masterha/app
master_binlog_dir=/usr/local/mysql/data
master_pid_file=/usr/local/mysql/data/master.pid
remote_workdir=/data/mysql/mha
manager_log=/data/mha/masterha/app/app-mysql.log
secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.156.30 -s 192.168.156.40 --user=admin --port=22 --master_host=192.168.156.20 --master_port=3306
设置手动切换时候的切换脚本
master_ip_failover_script="/etc/mha/master_ip_failover.sh 192.168.156.200 1"
[server1]
hostname=192.168.156.20
port=3306
candidate_master=1
[server2]
hostname=192.168.156.30
port=3306
candidate_master=1
[server3]
hostname=192.168.156.40
port=3306
candidate_master=1
设置切换脚本
[root@mgr admin]
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 = shift;
my $interface = 'ens33';
my $key = shift;
my $ssh_stop_vip = "sudo /sbin/ifconfig $interface:$key down";
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 {
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" ) {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
};
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
chomp $bcast;
chomp $gateway;
my $netmask = `ssh $ssh_user\@$new_master_host sudo /sbin/ifconfig | grep 'Bcast' | head -1 | awk '{print \$4}' | awk -F":" '{print \$2}'`;
chomp $netmask;
my $ssh_start_vip = "sudo /sbin/ifconfig $interface:$key $vip broadcast $bcast netmask $netmask && sudo /sbin/arping -f -q -c 5 -w 5 -I $interface -s $vip -U $gateway";
print "=======$ssh_start_vip=================\n";
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
my $ssh_user = "admin";
print "=======$ssh_stop_vip==================\n";
`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";
}
给master_ip_failover.sh添加执行权限
[root@mgr mha]
检测ssh互信以及mysql主从状态 mgr端
[admin@mgr ~]$ masterha_check_ssh --conf=/etc/mha/app.conf
[admin@mgr ~]$ masterha_check_repl --conf=/etc/mha/app.conf
检查MHA状态,然后运行MHA mgr端
[admin@mgr ~]$ masterha_check_status --conf=/etc/mha/app.conf
app is stopped(2:NOT_RUNNING).
[admin@mgr ~]$ nohup masterha_manager --conf=/etc/mha/app.conf --remove_dead_master_conf --ignore_last_failover &
[1] 27534
[admin@mgr ~]$ masterha_check_status --conf=/etc/mha/app.conf
app (pid:27534) is running(0:PING_OK), master:192.168.156.20
1)、如果正常,会显示“NOT_RUNNING”,说明MHA监控开启,否则会显示“PING_OK” 2)、用admin用户启动监控,否则会权限拒绝 3)、手动停止监控命令:masterha_stop --conf=/etc/mha/app.conf
8、测试数据
master端
[root@master ~]
mysql> create database test charset utf8
mysql> grant all on *.* to 'mha'@'localhost' identified by 'mha';
mysql> flush privileges;
向数据库中插入1000条数据,测试数据库的健壮性
[root@master ~]
查看是否插入
mysql> select count(*) from test.sbtest1;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
9、模拟master服务器故障
mgr端:监控日志
[admin@mgr ~]$ tail -f /data/mha/masterha/app/app-mysql.log
master端:
[root@master ~]
查看mgr端日志输出: 故障切换 vip漂移 查看漂移到的服务端是否挂载vip 查看从服务端信息 master已经从192.168.156.20漂移到192.168.156.30且 Slave_IO_Running、Slave_SQL_Running都为ok
已经表示成功了
|