一、准备环境:
1、mysql版本:8.0.26
2、3台服务器(一主两从)
3、MHA高可用软件:
MHA Manager(管理节点)
可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave上。
MHA Node(数据节点)
运行在每台MySQL服务器上
二、搭建步骤:
清理环境
pkill mysql
\rm -rf /data/3306/data/*
编写配置文件
主节点配置
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=51
port=3306
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01 [\\d]>
EOF
从节点配置:
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=52
port=3306
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02 [\\d]>
EOF
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=53
port=3306
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03 [\\d]>
EOF
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
步骤三:配置主从架构(主库执行)
create user repl@'10.0.0.%' identified with mysql_native_password by '123456';
grant replication slave on *.* to repl@'10.0.0.%';
//从库执行
change master to
master_host='10.0.0.51',
master_user='repl',
master_password='123456',
master_auto_position=1;
start slave;
步骤四:实现主从节点之间的SSH互信
# 配置各节点互信
\rm -rf /root/.ssh
ssh-keygen
cd /root/.ssh
mv id_rsa.pub authorized_keys
scp -r /root/.ssh 10.0.0.52:/root
scp -r /root/.ssh 10.0.0.53:/root
//验证是否互信
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
步骤五:MHA高可用软件安装部署:
///usr/local/mysql/bin/ 这个目录是mysql的安装目录,下面两个语句的作用是创建软连接,方便到mha某些脚本调用mysql,mysqlbinlog 命令,主节点操作
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
-- 所有节点安装Node软件依赖包
yum install perl-DBD-MySQL -y
//事先准备好软件包
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
-- Manager软件安装(db03)
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
//事先准备好软件包
yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
-- 在主库上创建
create user mha@'10.0.0.%' identified with mysql_native_password by 'mha';
grant all privileges on *.* to mha@'10.0.0.%';
# Manager配置文件准备(db03)
mkdir -p /etc/mha -- 创建配置文件目录
mkdir -p /var/log/mha/app1 -- 创建日志目录
-- 编辑mha配置文件
cat > /etc/mha/app1.cnf <<EOF
[server default]
manager_log=/var/log/mha/app1/manager
-- MHA的工作日志设置
manager_workdir=/var/log/mha/app1
-- MHA的工作目录
master_binlog_dir=/data/3306/data
-- 主库的binlog目录
user=mha
-- 监控用户,利用此用户连接各个节点,做心跳检测(主要是检测主库的状态)
password=mha
-- 监控密码
ping_interval=2
-- 心跳检测的间隔时间
repl_password=123456
-- 复制密码
repl_user=repl
-- 复制用户(用于告知从节点通过新主同步数据信息的用户信息)
ssh_user=root
-- ssh互信的用户(可以利用互信用户从主库scp获取binlog日志信息,便于从库进行数据信息补偿)
[server1]
-- 节点信息....
hostname=10.0.0.51
port=3306
[server2]
hostname=10.0.0.52
port=3306
#candidate_master=1
[server3]
hostname=10.0.0.53
port=3306
EOF
# MHA状态检查(db03)
masterha_check_ssh --conf=/etc/mha/app1.cnf
Wed Dec 28 20:54:42 2022 - [info] All SSH connection tests passed successfully.
-- 在MHA管理节点,进行ssh互信功能检查,并且显示成功表示检查通过
masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
-- 在MHA管理节点,检查主从关系与配置文件信息是否正确
# 开启MHA-manager
开启MHA(db03):
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
# 查看MHA状态
masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:30770) is running(0:PING_OK), master:192.168.30.101
-- 显示以上提示信息,表示MHA基础环境搭建成功了,但还不能在生产环境使用,还需要有后续的操作配置
MHA功能应用介绍:
在熟悉高可用服务工作原理前,可以先思考下应用高可用服务可以解决哪些需求,或者也可以理解为解决哪些痛点:
① 如何在高可用架构中,当主库宕机异常后,使之及时的发现主库服务程序产生了运行异常?
解决此痛点问题,需要实现高可用的监控需求;
② 如何在高可用架构中,当主库宕机异常后,可以找到可以替代主库的服务器主机进行切换?
解决此痛点问题,需要实现高可用的选主功能;(并且选择数据量越接近主库的从库成为新主)
③ 如何在高可用架构中,当主库宕机异常后,新的主库接管后可以保证与原有主库数据一致?
解决此痛点问题,需要实现高可用的数据补偿;
④ 如何在高可用架构中,当主库宕机异常后,将应用程序的读写请求对接切换到新的主库上?
解决此痛点问题,需要实现高可用的应用透明;(VIP技术)
⑤ 如何在高可用架构中,当主库宕机异常后,能够及时向管理员发起告知提醒使之进行修复?(MHA切换是一次性的)
解决此痛点问题,需要实现高可用的报警功能;
⑥ 如何在高可用架构中,当主库宕机异常后,当整体主库系统环境都异常时实现数据的补偿?
解决此痛点问题,需要实现高可用的额外补偿;
⑦ 如何在高可用架构中,当主库宕机异常后,根据主库服务器的异常情况进行原有主库修复?
解决此痛点问题,需要实现高可用的自愈功能;(待开发,只有云平台RDS具有此功能)
三、MHA应用透明
配置mha高可用的vip地址功能
cd /usr/local/bin/
chmod +x /usr/local/bin/*
dos2unix /usr/local/bin/*
vim master_ip_failover
13 my $vip = '10.0.0.50/24';
14 my $key = '1';
15 my $if = 'ens33';
16 my $ssh_start_vip = "/sbin/ifconfig $if:$key $vip";
17 my $ssh_stop_vip = "/sbin/ifconfig $if:$key down";
18 my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.50";
vim /etc/mha/app1.cnf
master_ip_failover_script=/usr/local/bin/master_ip_failover
masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
masterha_check_status --conf=/etc/mha/app1.cnf
第一次启动MHA,需要在主节点手工添加vip地址:
ifconfig ens33:1 10.0.0.50/24
//设置错了可以用:ifconfig ens33:1 down 这个关闭,然后重新设置
07 MHA故障报警
当mha进行故障切换后,需要邮件通知
vim send_report
28 my $smtp='smtp.qq.com';
-- smtp服务器地址域名
29 my $mail_from='xxx@qq.com';
-- 发件箱信息配置
30 my $mail_user='xxx';
-- 用户名 QQ号
31 my $mail_pass='xxx';
-- 邮箱授权码
32 my $mail_to='xxx@qq.com';
or
my $mail_to=['xxx@qq.com','xxx@qq.com','xxx@139.com','xxx@qq.com'];
-- 收件箱信息配置
# vim /etc/mha/app1.cnf
report_script=/usr/local/bin/send_report
masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
masterha_check_status --conf=/etc/mha/app1.cnf
08 mha数据额外补偿
-- 在mha管理节点进行操作
mkdir -p /data/binlog_server/
chown -R mysql.mysql /data/*
cd /data/binlog_server
mysqlbinlog -R --host=10.0.0.51 --user=mha --password=mha --raw --stop-never binlog.000001 &
vim /etc/mha/app1.cnf
[binlog1]
no_master=1
-- 不存于竞选
hostname=10.0.0.53
-- 将日志额外补偿到哪个主机上
master_binlog_dir=/data/binlog_server/
-- 日志额外补偿的存储目录
masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
masterha_check_status --conf=/etc/mha/app1.cnf
四、MHA故障切换实践
1)故障切换后的应用透明
关闭主库数据库后,navicat仍可以继续链接数据库
2)故障切换后实现主从重构
3)故障切换后实现数据补充机制
4)故障切换后的选主过程
5)故障切换后的报警功能