解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署

  • 作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  • 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  • 个人主页: 团儿.-CSDN博客

目录

前言:

正文:

[MHA高可用 ****](#MHA高可用 ****)

[1.MHA 架构软件结构说明](#1.MHA 架构软件结构说明)

[MHA Manager‌:](#MHA Manager‌:)

[‌MHA Node‌:](#‌MHA Node‌:)

2.节点规划

2.1MHA软件的构成(perl语言)

Manager工具包主要包括以下几个工具:

Node工具包主要包括以下几个工具:

[3. MHA 配置过程细节说明](#3. MHA 配置过程细节说明)

[3.1 修改配置文件](#3.1 修改配置文件)

主库db01:

slave1(db02):

slave2(db03):

[3.2 启动数据库](#3.2 启动数据库)

[3.3 构建主从:](#3.3 构建主从:)

db01:

db02\db03:

[3.4 互信](#3.4 互信)

db01:

各节点验证(三台均验证)

[3.5 安装软件包(所有节点)](#3.5 安装软件包(所有节点))

[3.6 在db01主库中创建mha需要的用户](#3.6 在db01主库中创建mha需要的用户)

[3.7 Manager软件安装(db03)](#3.7 Manager软件安装(db03))

[3.8 配置文件准备(db03)](#3.8 配置文件准备(db03))

[-- 创建配置文件目录](#-- 创建配置文件目录)

[-- 创建日志目录](#-- 创建日志目录)

[-- 编辑mha配置文件](#-- 编辑mha配置文件)

[3.9 状态检查(db03)](#3.9 状态检查(db03))

[4. MHA FailOver过程详解](#4. MHA FailOver过程详解)

[4.1 什么是Failover?](#4.1 什么是Failover?)

[4.2 Failover让你实现怎么做?](#4.2 Failover让你实现怎么做?)

[4.3 MHA的Failover如何实现?](#4.3 MHA的Failover如何实现?)

[5. MHA 应用透明(vip)](#5. MHA 应用透明(vip))

db03:

修改配置文件:

安装插件:

修改格式:

赋予权限:

修改:

添加至第二行:

db01:手工添加vip

[6. MHA 故障提醒](#6. MHA 故障提醒)

添加邮件脚本:

测试:

修改:

写入脚本:

测试:

[7. 额外的数据补偿(binlog_server)](#7. 额外的数据补偿(binlog_server))

(1)找一台额外的机器,必须要有5.6以上的版本,支持gtid并开启,我们直接用的第二个slave

(db03)

[(2) 拉取主库binlog日志](#(2) 拉取主库binlog日志)

[(4) 重启MHA-manager](#(4) 重启MHA-manager)

[8. 故障模拟及故障处理](#8. 故障模拟及故障处理)

[8.1 宕掉 db01 数据库](#8.1 宕掉 db01 数据库)

在db03上查看日志:

[8.2 恢复故障](#8.2 恢复故障)

[(1) 启动故障节点](#(1) 启动故障节点)

[(2) 恢复1主2从(db01)](#(2) 恢复1主2从(db01))

[(3) 恢复配置文件(db03)](#(3) 恢复配置文件(db03))

[(4) 启动MHA](#(4) 启动MHA)

(5)恢复binlogserver


前言:

在当今的数据驱动时代,数据库的稳定性和高可用性是企业业务连续性的基石。MySQL,作为最流行的开源关系型数据库管理系统之一,广泛应用于各种规模的企业和项目中。然而,随着业务量的不断增长和数据重要性的日益凸显,MySQL单点故障的问题逐渐显现,成为制约系统稳定性和可靠性的关键因素。

为了应对这一挑战,业界提出了多种高可用性和故障转移的解决方案,其中MHA(Master High Availability)以其高效、灵活和自动化的特点脱颖而出。MHA是由日本的一位MySQL专家采用Perl语言编写的一套脚本管理工具,专为MySQL Replication环境设计,旨在维持Master主库的高可用性。

MHA的核心优势在于其自动的master故障转移和Slave提升功能。当Master节点出现故障时,MHA能够迅速识别并自动将具有最新数据的Slave提升为新的Master,同时确保所有其他Slave重新指向新的Master,整个过程对应用程序几乎透明,从而最大限度地减少服务中断和数据丢失的风险。

此外,MHA还支持多种高级特性,如binlog server、半同步复制等,这些特性不仅提高了数据传送的效率,还进一步增强了数据的一致性和安全性。通过MHA,企业可以构建出更加健壮、可靠的MySQL高可用架构,为业务的持续稳定运行提供有力保障。

本文将深入探讨MHA的架构、工作原理、安装配置以及在实际应用中的最佳实践。通过本文的学习,您将能够全面了解MHA在MySQL高可用环境中的重要作用,并掌握如何利用MHA来构建和维护一个高效、稳定的数据库系统。


正文:

MHA高可用 ****

1.MHA 架构软件结构说明

MHA Manager‌:

负责监控和管理MySQL主从复制集群。它可以单独部署在一台独立的机器上,管理多个master-slave集群,也可以部署在一台slave节点上。MHA Manager会定时探测集群中的master节点,当master出现故障时,MHA Manager能够自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

‌MHA Node‌:

运行在每台MySQL服务器上,负责数据的复制和同步。MHA Node是数据节点,它参与主从复制过程,确保数据的一致性和可用性。

MHA的设计目标是解决MySQL的高可用性问题,特别是在主服务器宕机的情况下,能够迅速将最新的数据从一个slave服务器提升为新的master,从而最大程度地减少服务中断的时间。此外,MHA还支持半同步复制,以降低数据丢失的风险,并保证所有节点的数据一致性。MHA主要支持一主多从的架构,要求至少三台服务器:一台作为master,其余作为slave。这种架构对应用程序透明,意味着在故障转移过程中,应用程序无需进行任何配置更改即可继续无缝运行‌。

2.节点规划

manager端: db03

node端: db01,db02,db03

1主2从,独立数据库实例

2.1MHA软件的构成(perl语言)

Manager工具包主要包括以下几个工具:

mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

masterha_manger 启动MHA

masterha_check_ssh 检查MHA的SSH配置状况

masterha_check_repl 检查MySQL复制状况

masterha_master_monitor 监控master是否宕机

masterha_check_status 检测当前MHA运行状态

masterha_master_switch 控制故障转移(自动或者手动)

masterha_conf_host 添加或删除配置的server信息

Node工具包主要包括以下几个工具:

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

这些工具通常由MHA Manager的脚本触发,无需人为操作

save_binary_logs 保存和复制master的二进制日志

apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的

purge_relay_logs 清除中继日志(不会阻塞SQL线程)

3. MHA 配置过程细节说明

3.1 修改配置文件

主库db01:
复制代码
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
server_id=1
port=3306
secure-file-priv=/tmp
autocommit=1
log_bin=mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01>
EOF
slave1(db02):
复制代码
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
server_id=2
port=3306
secure-file-priv=/tmp
autocommit=1
log_bin=mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02>
EOF
slave2(db03):
复制代码
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
server_id=3
port=3306
secure-file-priv=/tmp
autocommit=1
log_bin=mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03>
EOF

3.2 启动数据库

复制代码
systemctl restart mysqld

3.3 构建主从:

master:db01

slave:db02,db03

db01:
复制代码
grant replication slave  on *.* to repl@'192.168.8.%' identified by '123';
db02\db03:
复制代码
change master to 
master_host='192.168.8.9',
master_user='repl',
master_port=3306,
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;

3.4 互信

db01:
复制代码
ssh-keygen
cd /root/.ssh 
mv id_rsa.pub authorized_keys
复制代码
scp  -r  /root/.ssh  192.168.8.10:/root 
scp  -r  /root/.ssh  192.168.8.11:/root 
各节点验证(三台均验证)
复制代码
ssh 192.168.8.9 hostname
ssh 192.168.8.10 hostname
ssh 192.168.8.11 hostname

3.5 安装软件包(所有节点)

通过网盘分享的文件:mha-node.zip

链接: node包提取码: 3mkq

3.6 在db01主库中创建mha需要的用户

复制代码
grant all privileges on *.* to mha@'192.168.8.%' identified by 'mha';

3.7 Manager软件安装(db03)

通过网盘分享的文件:mha-manager.zip

链接: manager包 提取码: agqk

3.8 配置文件准备(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        
manager_workdir=/var/log/mha/app1            
master_binlog_dir=/usr/local/mysql/data       
user=mha                                   
password=mha                               
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root                               
[server1]                                   
hostname=192.168.8.9
port=3306                                  
[server2]            
hostname=192.168.8.10
port=3306
[server3]
hostname=192.168.8.11
port=3306
EOF

3.9 状态检查(db03)

复制代码
masterha_check_ssh  --conf=/etc/mha/app1.cnf 
masterha_check_repl  --conf=/etc/mha/app1.cnf 

4. MHA FailOver过程详解

4.1 什么是Failover?

故障转移.

主库宕机一直到业务恢复正常的处理过程(自动)

4.2 Failover让你实现怎么做?

(1) 快速监控到主库宕机

(2) 选择新主

(3) 数据补偿

(4) 解除从库身份

(5) 剩余从库和新主库构建主从关系

(6) 应用透明

(7) 故障节点自愈(待开发...)

(8) 故障提醒

4.3 MHA的Failover如何实现?

从启动--->故障--->转移--->业务恢复

(1) MHA通过masterha_manger脚本启动MHA的功能.

(2) 在manager启动之前,会自动检查ssh互信(masterha_check_ssh)和主从状态(masterha_check_repl)

(3) MHA-manager 通过 masterha_master_monitor脚本(每隔ping_interval秒)

(4) masterha_master_monitor探测主库3次无心跳之后,就认为主库宕机了.

(5) 进行选主过程 ***
算法一:

读取配置文件中是否有强制选主的参数?

candidate_master=1

check_repl_delay=0
扩展一下:

candidate_master=1 应用场景?

(a) MHA+KeepAlive VIP(早期MHA架构)

(b) 多地多中心

算法二:

自动判断所有从库的日志量.将最接近主库数据的从库作为新主.

算法三:

按照配置文件先后顺序的进行选新主.

(6) 数据补偿

判断主库SSH的连通性

情况一: SSH能连

调用 save_binary_logs脚本,立即保存缺失部分的binlog到各个从节点,恢复

情况二: SSH无法连接

调用 apply_diff_relay_logs 脚本,计算从库的relaylog的差异,恢复到2号从库

(6.1) 提供额外的数据补偿的功能@@

(7) 解除从库身份

(8) 剩余从库和新主库构建主从关系

(9) 应用透明 @@

(10) 故障节点自愈(待开发...)@@

(11) 故障提醒@@

5. MHA 应用透明(vip)

db03:

通过网盘分享的文件:master_ip_failover.txt

链接: 文件 提取码: 1qas

复制代码
mv master_ip_failover.txt /usr/local/bin/
cd /usr/local/bin/
mv master_ip_failover.txt master_ip_failover
修改配置文件:
复制代码
vim /usr/local/bin/master_ip_failover
安装插件:
复制代码
yum install -y  dos2unix
修改格式:
复制代码
dos2unix /usr/local/bin/master_ip_failover
赋予权限:
复制代码
chmod +x /usr/local/bin/master_ip_failover
修改:
复制代码
vim /etc/mha/app1.cnf 
添加至第二行:
复制代码
master_ip_failover_script=/usr/local/bin/master_ip_failover

db01:手工添加vip

6. MHA 故障提醒

复制代码
systemctl stop postfix
systemctl disable postfix

添加邮件脚本:

复制代码
vim /etc/mail.rc 

set from=1119898630@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=1119898630@qq.com
set smtp-auth-password=eufnwvekwqnlhdch
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

测试:

复制代码
echo 111 | mail -s test 1119898630@qq.com

修改:

复制代码
vim /etc/mha/app1.cnf

添加第三行:

复制代码
report_script=/usr/local/bin/send

保存退出

写入脚本:

复制代码
cat >> /usr/local/bin/send << EOF
#!/bin/bash
echo "mha is failover,hehe" | mail -s mha_alert 1119898630@qq.com
EOF

chmod +x /usr/local/bin/send

测试:

7. 额外的数据补偿(binlog_server)

(1)

找一台额外的机器,必须要有5.6以上的版本,支持gtid并开启,我们直接用的第二个slave

(db03)
复制代码
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/mysql

vim /etc/mha/binlogserver.cnf 

添加:

复制代码
[binlog1]
no_master=1
hostname=192.168.8.11
master_binlog_dir=/data/mysql/binlog/

(2) 拉取主库binlog日志

复制代码
cd /data/mysql/binlog    
mysqlbinlog  -R --host=192.168.8.9 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

注意:
拉取日志的起点,需要按照目前主库正在使用的binlog为起点.

(4) 重启MHA-manager

复制代码
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

8. 故障模拟及故障处理

8.1 宕掉 db01 数据库

复制代码
systemctl stop mysqld 

在db03上查看日志:

复制代码
tailf /var/log/mha/app1/manager
grep "CHANGE MASTER TO"  /var/log/mha/app1/manager

第二台查看漂移地址

第三台查看主从

8.2 恢复故障

(1) 启动故障节点
复制代码
systemctl start mysqld
(2) 恢复1主2从(db01)
复制代码
CHANGE MASTER TO MASTER_HOST='192.168.8.10', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';
start slave;
(3) 恢复配置文件(db03)
复制代码
vim /etc/mha/app1.cnf

将8.9重新添加至配置文件:

复制代码
[server1]
hostname=192.168.8.9
port=3306
[server2]
hostname=192.168.8.10
port=3306
[server3]
hostname=192.168.8.11
port=3306
(4) 启动MHA
复制代码
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 &
(5)恢复binlogserver
复制代码
cd /data/mysql/binlog  
mv mysql-bin.*  /tmp
mysqlbinlog  -R --host=192.168.8.10 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

期待您的关注~

相关推荐
Lee川14 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
勤劳打代码14 小时前
Flutter 架构日记 — 状态管理
flutter·架构·前端框架
随风飘的云14 小时前
MySQL的慢查询优化解决思路
数据库
IvorySQL18 小时前
PostgreSQL 技术日报 (3月7日)|生态更新与内核性能讨论
数据库·postgresql·开源
赵渝强老师18 小时前
【赵渝强老师】金仓数据库的数据文件
数据库·国产数据库·kingbase·金仓数据库
子兮曰19 小时前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构
随逸1771 天前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
卓卓不是桌桌1 天前
如何优雅地处理 iframe 跨域通信?这是我的开源方案
javascript·架构
Qlly1 天前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构
神秘的猪头1 天前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm