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

news2024/11/17 20:23:02

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

目录

前言:

正文:

MHA高可用  ****

1.MHA 架构软件结构说明

MHA Manager‌:

‌MHA Node‌:

2.节点规划

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

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

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

3. MHA 配置过程细节说明

3.1 修改配置文件

主库db01:

slave1(db02):

slave2(db03):

3.2 启动数据库

3.3 构建主从:

db01:

db02\db03:

3.4 互信

db01:

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

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

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

3.7  Manager软件安装(db03)

3.8 配置文件准备(db03)

-- 创建配置文件目录

-- 创建日志目录

-- 编辑mha配置文件

3.9 状态检查(db03)

4. MHA FailOver过程详解

4.1 什么是Failover?

4.2 Failover让你实现怎么做?

4.3 MHA的Failover如何实现?

5. MHA 应用透明(vip)

db03:

修改配置文件:

安装插件:

修改格式:

赋予权限:

 修改:

添加至第二行:

db01:手工添加vip

6. MHA 故障提醒

添加邮件脚本:

测试:

修改:

写入脚本:

测试:

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

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

(db03)

(2) 拉取主库binlog日志

(4) 重启MHA-manager 

8. 故障模拟及故障处理

8.1 宕掉 db01 数据库

在db03上查看日志:

8.2 恢复故障

(1) 启动故障节点

(2) 恢复1主2从(db01)

(3) 恢复配置文件(db03)

(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 &


期待您的关注~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2174763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS系统yum出现Could not retrieve mirrorlist问题

问题 yum search wget当使用yum命令来搜索或安装软件时&#xff0c;如果出现Could not retrieve mirrorlist&#xff0c;即无法检索镜像列表。出现的问题截图如下&#xff1a; 解决方法&#xff1a; 跳转到root用户 su - rootcd到/etc/yum.repos.d/目录下 cd /etc/yum.rep…

异步框架 fastapi -- 简单介绍

文章目录 fastapi 介绍restful接口设计简单应用Swagger风格的接口文档 fastapi 介绍 fastapi官方文档 fastapi 是现代化、高性能、基于python标准类型注释的异步web框架&#xff1b;基于python构建web APIs&#xff0c;性能可比go语言&#xff1b;高效编码&#xff0c;更少的…

大数据的挑战是小文件

小文件可能会给存储平台及其支持的应用程序带来大问题。在 Google 上搜索 “small files performance” 会产生 2M 的结果。这篇博文将更深入地研究小文件问题&#xff0c;深入研究其根源并总结解决方案。 问题陈述 出于本讨论的目的&#xff0c;小文件通常被视为小于 64 KB …

攻防世界---->happyctf

做题笔记。 下载 查壳。 32ida打开。 先运行一下&#xff1a; C写的。 追踪 good job 具体跟踪分析&#xff1a; 说白了&#xff0c;就是一个用于判断 flag key的。 往上走&#xff1a; 跟进。 打开 od吧。 锁定地址 追踪看看。&#xff08;此题&#xff0c;ida不能动态 od可以…

Hugging Face从命令行到桌面:Chat-macOS让AI互动更简单,关键还免费!

你是否曾经觉得,命令行操作虽然强大,但总是有些难以上手?或者,你是否希望和AI互动可以像日常使用macOS应用一样直观?那你一定要试试Chat-macOS,它让你从命令行走向桌面,体验更轻松的AI互动方式。 1. 什么是Chat-macOS? Chat-macOS是一个桌面应用程序,它能够将Hug…

Windows安全日志7关键事件ID分析

背景 Windows日志里的事件分析有助于在系统出现异常时分析出异常原因&#xff0c;利于针对问题做出系统的修复和预防。今天阿祥就整理出Windows常见的事件&#xff0c;分析这些事件的具体原因&#xff0c;希望对系统运维工程师们有一定的帮助&#xff01; 具体事件ID 1、事件ID…

MySQL—触发器详解

基本介绍 触发器是与表有关的数据库对象&#xff0c;在 INSERT、UPDATE、DELETE 操作之前或之后触发并执行触发器中定义的 SQL 语句。 触发器的这种特性可以协助应用在数据库端确保数据的完整性、日志记录、数据校验等操作。 使用别名 NEW 和 OLD 来引用触发器中发生变化的记…

JSR 303学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

fiddler抓包12_篡改请求(请求前断点)

课程大纲 原理 正常“客户端-服务器”通信&#xff0c;即发送请求&#xff0c;接收返回。 Fiddler抓包是「客户端-浏览器」进行交互时&#xff0c;请求和响应都会从Fiddler通过&#xff0c;Fiddler可以捕获并展示。 请求前断点&#xff08;BreakPoint Before Request&#xff0…

[论文阅读] ChartInstruct: Instruction Tuning for Chart Comprehension and Reasoning

原文链接&#xff1a;http://arxiv.org/abs/2403.09028 源码链接&#xff1a;https://github.com/vis-nlp/ChartInstruct 启发&#xff1a;本文构建的instruction-tuning数据集以及使用该数据集对模型进行微调的过程都值得学习。 Abstract 研究对象&#xff1a;图表 研究…

yakit使用教程(一,下载并进行基础配置)

一&#xff0c;yakit简介 YAKIT&#xff08;Yet Another Knife for IT Security&#xff09;是一款网络安全单兵工具&#xff0c;专为个人渗透测试员和安全研究人员设计。它整合了一系列实用的安全工具&#xff0c;例如密码破解工具、网络扫描器、漏洞利用工具等&#xff0c;帮…

空间复杂度动态顺序表

目录 1>>闲话 2>>空间复杂度 3>>顺序表&#xff01;&#xff01;&#xff08;有点难度&#xff09; 3.1>>静态顺序表 3.2>>动态顺序表 3.2.1>>初始化动态顺序表 3.2.2>>实现尾插 4>>结语 1>>闲话 感谢大家对小…

【YOLO目标检测反光衣数据集】共2388张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;2388 标注数量(txt文件个数)&#xff1a;2388 标注类别数&#xff1a;2 标注类别名称&#xff1a;reflective_clothes、other_clothes 数据集下载&#xff1a;反光衣数据集 图片示例 数据…

HJ50-四则运算:栈的运用、中缀表达式转后缀表达式并计算结果

文章目录 题目一、分析1.1表达式预处理1.2中缀表达式转后缀1.3 后缀表达式计算结果 二、答案 题目 一、分析 通过利用栈将中缀表达式转换为后缀表达式&#xff0c;在根据后缀表达式计算运算结果。由于包含负数操作数的情况&#xff0c;并且操作数位数不固定为1&#xff0c;因此…

【算法篇】二叉树类(3)(笔记)

目录 一、Leetcode 题目 1. 二叉树的最近公共祖先 2. 二叉搜索树的最近公共祖先 &#xff08;1&#xff09;递归法 &#xff08;2&#xff09;迭代法 3. 二叉搜索树中的插入操作 &#xff08;1&#xff09;递归法 &#xff08;2&#xff09;迭代法 4. 删除二叉搜索树中…

时间序列LSTM实现

这个代码参考了时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)_lstm预测模型-CSDN博客 结合我之前所学的lstm-seq2seq里所学习到的知识对其进行预测 import time import numpy as np import pandas as pd import torch import…

革命题材网络电影《突进夹金山》将于10月上线

“长征万里险&#xff0c;最忆夹金山”。这座雪山不仅见证了红军战士们的英勇与牺牲&#xff0c;也成为了中国革命历史上的一座重要里程碑。 革命题材网络电影《突进夹金山》&#xff0c;作为四川省2024年度重点影视剧项目以及纪念红军长征90周年献礼的红色作品&#xff0c;由谢…

死磕P7: JVM类加载那些事儿,一起探知类的前世今生(二)

这是「死磕P7」系列第 006 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 接上篇&#xff0c;上一篇介绍了 JVM 类加载过程及类的生命周期&#xff0c;回顾一下&#xff1a; 死磕P7: JVM类加载那些事儿&a…

周文强聚焦助学育人,爱心图书室项目圆满完成

日前&#xff0c;一场充满爱心与希望的公益活动在四川甘孜州乡城县尼斯寄宿制小学拉开帷幕。这次名为“520爱心图书室”的公益活动&#xff0c;旨在通过捐赠图书的方式&#xff0c;支持基层青少年的阅读成长。作为此次活动的积极参与者&#xff0c;周文强不仅向学校捐赠了价值1…

python 高效读取多个geojson 写入一个sq3(Sqlite) 、效率提高90%+

1.问题缘由&#xff1a; 由于工作需求&#xff0c;需要将多个&#xff08;总量10G&#xff09;geojson文件写入到sq3库&#xff0c;众所周知&#xff0c;sqlite 不支持多线程写入&#xff0c;那该怎么办呢&#xff0c;在网上也查了很多策略&#xff0c;都没有达到立竿见影的效果…