MySQL8.0.27 MHA架构部署

发布于:2024-11-02 ⋅ 阅读:(93) ⋅ 点赞:(0)

一.简介

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 为从库