MySQL8.0.27 MHA架构部署
一.简介
MHA架构 Master High Availability
目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器 ,一主二从,即一台master,一台充当备用master,另外一台充当从库。
MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master,整个故障转移过程对应用程序完全透明。
二.环境准备
操作系统 CentOS Linux release 7.9.2009
MySQL数据库 8.0.27
ip地址和角色名
172.20.10.10 master
172.20.10.11 slave1
172.20.10.12 slave2/manager
提前关闭防火墙和selinux
配置三台服务器的hosts文件
172.20.10.10 master
172.20.10.11 slave1
172.20.10.12 slave2
MySQL数据库安装过程省略,由于我三台MySQL是克隆出来的 先删除数据文件存放目录下的auto.cnf文件 以免之后报错uuid冲突
先配置mysql配置文件 开启gtid模式 开启binlog日志 binlog日志格式设置为row 并分别配置唯一的server-id
8.0版本mysql 默认密码规则变了 需要在配置文件中加下面参数 默认调成跟5.7一样的密码策略
default_authentication_plugin = ‘mysql_native_password’
三.配置主从
主库节点创建主从复制用的账号
create user repl@'%' identified WITH mysql_native_password by '000000';
grant REPLICATION SLAVE on *.* to repl@'%';
两个从库节点都进行主从配置
change master to
master_host='172.20.10.10',
master_port=3306,
master_user='repl',
master_password='000000',
master_auto_position=1;
start slave;
配置完成后查看主从复制状态 确认无误
四.部署MHA
先配置三台服务器的免密 三台服务器都做下面操作
生成免认证密码文件 一直按回车即可
ssh-keygen
拷贝免登录文件到当前Linux服务器和另外两台Linux服务器
ssh-copy-id -i /root/.ssh/id_rsa root@172.20.10.10
ssh-copy-id -i /root/.ssh/id_rsa root@172.20.10.11
ssh-copy-id -i /root/.ssh/id_rsa root@172.20.10.12
配置免密后进行测试 免密直连其他节点
ssh root@172.20.10.10
ssh root@172.20.10.11
ssh root@172.20.10.12
安装MHA
先配置epel源 三台服务器都进行配置
wget http://mirrors.sohu.com/fedora-epel/epel-release-latest-7.noarch.rpm
yum install -y epel-release-latest-7.noarch.rpm
修改 /etc/yum.repos.d/epel.repo 文件参数
操作服务器:所有Linux服务器
把 /etc/yum.repos.d/epel.repo 文件中的 gpgcheck 参数值设置成 0
安装所需要的依赖包 三台都安装
yum install -y perl-DBD-MySQL ncftp perl-DBI
安装监控服务器依赖包 我任选的slave2节点 生产环境中最好单独在一个服务器上部署 和db节点分开
yum install -y perl-Config-Tiny.noarch perl-Time-HiRes.x86_64 perl-Parallel-ForkManager perl-Log-Dispatch.noarch
安装MHA软件包
这个包三个节点都需要上传 安装
rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
在监控节点安装监控软件包 还是slave2节点
rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm
配置MHA 主库创建用户
create user dba_mha@'%' identified WITH mysql_native_password by '000000';
grant all privileges on *.* to dba_mha@'%';
三个节点创建mha目录
mkdir -p /data/mha
管理节点(slave2)创建mha服务目录
mkdir -p /home/mha
配置管理节点的配置文件
vim /data/mha/mysql-mha.conf
[server default]
user=dba_mha
password=000000
manager_workdir=/home/mha
manager_log=/home/mha/manager.log
remote_workdir=/home/mha
ssh_user=root
repl_user=repl
repl_password=000000
ping_interval=1
master_binlog_dir=/data/mysql
ssh_port=22
master_ip_failover_script = /usr/bin/master_ip_failover
secondary_check_script = /usr/bin/masterha_secondary_check -s 172.20.10.11 -s 172.20.10.12
[server1]
hostname=172.20.10.10
candidate_master=1
[server2]
hostname=172.20.10.11
candidate_master=1
[server3]
hostname=172.20.10.12
no_master=1
配置管理节点的vip飘逸文件
vim /usr/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $orig_master_host, $orig_master_ip,$ssh_user,
$orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
$orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);
my $vip = '172.20.10.15/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens32:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens32:$key down";
my $ssh_Bcast_arp= "/sbin/arping -I ens32 -c 3 -A 172.20.10.15";
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,
'orig_master_ssh_port=i' => \$orig_master_ssh_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
'new_master_ssh_port' => \$new_master_ssh_port,
'new_master_user' => \$new_master_user,
'new_master_password' => \$new_master_password
);
exit &main();
sub main {
$ssh_user = defined $ssh_user ? $ssh_user : 'root';
print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();
&start_arp();
$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 \"`;
}
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub start_arp() {
`ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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 +x /usr/bin/master_ip_failover
在主库手动执行vip添加命令
/sbin/ifconfig ens32:1 172.20.10.15/24
利用脚本检查ssh互信配置
masterha_check_ssh --conf=/data/mha/mysql-mha.conf
最后出现 All SSH connection tests passed successfully. 成功
检查主从配置
masterha_check_repl --conf=/data/mha/mysql-mha.conf
最后出现 MySQL Replication Health is OK. 成功!
启动MHA
masterha_manager --conf=/data/mha/mysql-mha.conf &
查看MHA状态
masterha_check_status --conf=/data/mha/mysql-mha.conf
可以看到当前master是主节点 172.20.10.10
也可以查看日志
tail -2 /home/mha/manager.log
故障模拟 停掉主库mysql
systemctl stop mysqld
查看mha日志
tail -f /home/mha/manager.log
发现slave1已经变成新的主库
查看slave2的主从状态 发现所属主也已经变成slave1
show slave status\G
查看原主库的vip 发现已经没有
在新主库slave1查看 发现vip已经漂移到了这里
管理节点查看集群状态 发现MHA已经停止失效
恢复MHA
将停机的旧主启动 配置主从 主库为刚才的新主库
change master to
master_host='172.20.10.11',
master_port=3306,
master_user='repl',
master_password='000000',
master_auto_position=1;
start slave;
检查集群节点状态
masterha_check_repl --conf=/data/mha/mysql-mha.conf
最后出现OK
启动MHA集群
masterha_manager --conf=/data/mha/mysql-mha.conf &
查看MHA集群状态
masterha_check_status --conf=/data/mha/mysql-mha.conf
完成修复 11为主 10 12 为从库