数据库备份与恢复--06---MySQL集群高可用架构之MHA

news2024/11/20 1:27:21

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • MySQL集群高可用架构之MHA
    • 1.什么是MHA
        • MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下==故障切换和主从复制的软件== ,mha用于==解决mysql的单点故障问题==;
    • 2.MHA提供了什么功能:
    • 3. MHA 的组成
    • 4. MHA工作原理
    • 5.MHA故障转移过程:
  • 案例1


MySQL集群高可用架构之MHA

1.什么是MHA

MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件 ,mha用于解决mysql的单点故障问题
  • 出现故障时,mha能在0~30秒内自动完成故障切换;
  • 并且能在故障切换过程中,最大程度保证数据的一致性
  • 从而达到高可用

MHA的架构图如下:与MMM相似

在这里插入图片描述

2.MHA提供了什么功能:

  1. 可以监控Master节点是否可用
  2. 当Master不可用时,能在多个Slave中选举出新的Master
  3. 提供了主从切换和故障转移功能,MHA会尝试在宕机的Master上保存binlog,在最大程度上保证事务不丢失。但如果是Master所在的服务器已经无法访问,或硬件层面出现了问题,则无法成功保存binlog
  4. MHA可以与半同步复制结合,避免从库之间出现数据不一致的情况
  5. 支持MySQL基于GTID和基于日志点的两种复制方式

3. MHA 的组成

MHA由两部分组成: MHAManager (管理节点) 和 MHA Node (数据库节点),

MHA Node(数据节点)

  • MHA Node 运行在每台 MySQL 服务器上。

MHA Manager(管理节点)

  • MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。

  • MHA Manager 会定时探测集群中的 master 节点。

  • 当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave
    重新指向新的master。整个故障转移过程对应用程序完全透明。

4. MHA工作原理

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器,一主二从,即一台充当Master,台充当备用Master,另一台充当从库。

  1. MHA Node 运行在每台 MySQL 服务器上
  2. MHAManager 会定时探测集群中的master 节点
  3. 当master 出现故障时,它可以自动将最新数据的slave 提升为新的master
  4. 然后将所有其他的slave 重新指向新的master,VIP自动漂移到新的master。

整个故障转移过程对应用程序完全透明。

5.MHA故障转移过程:

  1. 尝试使用ssh登录到宕机崩溃的Master节点上保存二进制日志事件(binlog events);
  2. 从多个Slave中识别含有最新更新的Slave,将其作为备选的Master;
  3. 然后基于该Slave同步差异的中继日志(relaylog)到其他的Slave上;
  4. 接着同步从原Master上保存的二进制日志事件(binlog events);
  5. 将备选的Master提升为新的Master;
  6. 使其他的Slave连接新的Master进行复制;
  7. 在新的Master启动vip地址,保证前端请求可以发送到新的Master。

案例1

现模拟进行安装配置,略过Mysql相关安装步骤

  • 设计为一主双从一监控四机结构,分别为 Master1 Slave1 Slave2 Monitor
1.新增用户所有库中新增同一用户
	create user '${replicationUsername}'@'%' identified with mysql_native_password by '${replicationPassword}'
	grant replication slave on *.* to   '${replicationUsername}'@'%' 
	flush privileges
2.修改配置文件
	Master1:
		server_id=101
		log_bin=mysql_bin
		relay_log=relay_bin
		log_slave_updates=on
		gtid_mode=ON  #开启GTID模式
		enforce_gtid_consistency=1
	Slave1:
		...其他相同...
		server_id=102
	Slave2:
		...其他相同...
		server_id=103
3.主从设置
	Slave1
	change master to master_host=${master1IP},master_port=${masterPort},master_user=${replicationUsername},master_password=${replicationPassword}
	start slave
	Slave2
	change master to master_host=${master1IP},master_port=${masterPort},master_user=${replicationUsername},master_password=${replicationPassword}
	start slave
4.配置ssh免密登录
	ssh-keygen
	ssh-copy-id -i ${otherMachine}
5.节点安装Mha包(mha4mysql-node-0.58-0.el7.centos.noarch.rpm)
	yum -y install epel-release
	yum -y install perl-DBD-MySQL perl-DBI ncftp //安装依赖
	5.1监控节点需安装mha4mysql-manager包
	同样用yum安装依赖包 有:perl-Config-Tiny perl-Time-Hires perl-Parallel-ForkManager perl-Log-Dispatch perl-DBD-MySQL ncftp
6.配置MHAMonitor节点
	user=${mhaUsername}
	password=${mhaPassword}
	指定工作目录
	manager_workdir=/home/mysql_mha
	日志存放路径
	manager_log=/home/mysql_mha/manager.log
	远程节点工作目录
	remote_workdir=/home/mysql_mha
	ssh登录用户名
	ssh_user=root
	repl_user=${replicationUsername}
	repl_password=${replicationPassword}
	检查时间间隔
	ping_interval=1
	指定MasterBinlog目录
	master_binlog_dir=/var/lib/mysql
	指定飘逸脚本
	master_ip_failover_script=/usr/bin/master_ip_failover
	指定作用二次检查脚本
	secondary_check_script=/user/bin/masterha_secondary_check -s ${masterIp} -s ${slave1Ip} -s ${slave2Ip}
	配置节点信息
	[server1]
	hostname=${masterIp}
	candidate_master=1#运行选举
	[server2]
	hostname=${slave1Ip}
	candidate_master=1#运行选举
	[server3]
	hostname=${slave2Ip}
	candidate_master=1#运行选举
7.因VIP漂移脚本默认不提供,需手动改
	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='${IP}/24'; #设置网段
	my $key='1';
	#网卡名需根据实际 以下采用 networkName
	my $ssh_start_vip ="sudo /sbin/ifconfig newworkName:$key $vip";
	my $ssh_stop_vip ="sudo /sbin/ifconfig newworkName:$key down";
	my $ssh_Bcast_arp ="sudo /sbin/arping -I bond0 -c 3 -A $vip";
	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,
	'new_master_host=s' =>\$new_master_host,
	'orig_master_ssh_port=i' =>\$orig_master_ssh_port,
	'new_master_ip=s' =>\$new_master_ip,
	'new_master_port=1' =>\$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:${sshUserName};
	print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_top_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;
	
	
	}elseif($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";
		

}
}
-----------end---------------
chmod 设置权限
新建配置文件中用于监控的用户
	create user '${mhaUsername}'@'%' identified with mysql_native_password by '${mhaPassword}'
	grant all privileges  on *.* to   '${mhaUsername}'@'%' 
	flush privileges
8.检查链路是否正常并启动
	masterha_check_ssh --conf=/${配置文件}
	masterha_check_repl --conf=/${配置文件}
	
	masterha_manager --conf=/${配置文件}
9.Master手动设置虚拟IP
	ifconfig ${networkName}:${key} ${Vip}/24
10.自我测试
11.优缺点
	优
	使用Perl脚本语言开发并且完全开源,开发者可以根据自己的需求进行二次开发
	能够支持基于GTID和基于日志点的复制模式
	MHA在进行故障转移时更不易产生数据丢失
	在一个监控节点上可以监控多个Replication集群
	缺
	MHA默认不提供虚拟IP功能,需要自行编写脚本或利用第三方工具来实现虚拟IP的配置
	MHA启动后只会对Master进行监控,不会对Slave进行监控,也无法监控复制链路的情况
	集群环境需要能够通过ssh免密登录,存在一定的安全隐患
	MHA没有提供对Slave的读负载均衡功能,需要通过第三方工具来实现

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

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

相关文章

基于springboot实现疾病防控综合系统项目【项目源码+论文说明】

基于springboot实现疾病防控综合系统演示 摘要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以&…

HCIP的学习(OSPF总篇)

HCIA的复习 这边可以与我之前写的HCIA博客结合起来一起看,效果更好 HCIA的学习(6) OSPF状态机 down—关闭-----一旦启动OSPF进程,并发出hello报文,则进入下一个状态init----初始化状态------当收到的hello报文中存在…

EMAP的简单开发(单表)

注意框架版本选择SPA_v1 一个数据源代表一个业务,选择一个就会产生对应的应用 index.jsp是展示的页面 conifg.js是index.jsp引用渲染的一个js文件 index.jsp中的全局变量中有一个pageMeta和contaextPath: pageMeta:是一个对象,…

【Linux】从零开始认识动静态库 - 静态库

送给大家一句话: 永不言弃,就是我的魔法! ——阿斯塔《黑色四叶草》 ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ 从零…

ADS基础教程11 - TouchStone文件的导出及导入

目录 一、 T o u c h S t o n e 介绍 \color{#4285f4}{ \mathbf{ 一、TouchStone介绍}} 一、TouchStone介绍 二、文件导出、导入方式 \color{#4285f4}{ \mathbf{ 二、文件导出、导入方式}} 二、文件导出、导入方式1.原理图操作1)原理图中导出2.原理图中导入 3.DDW中…

Leetcode—796. 旋转字符串【简单】

2024每日刷题(132) Leetcode—796. 旋转字符串 实现代码 class Solution { public:bool rotateString(string s, string goal) {return ((s.length() goal.length()) && (s s).find(goal) ! string::npos);} };运行结果 之后我会持续更新&am…

蓝桥杯成绩已出

蓝桥杯的成绩早就已经出来了,虽然没有十分惊艳 ,但是对于最终的结果我是心满意足的,感谢各位的陪伴,关于蓝桥杯的刷题笔记我已经坚持更新了49篇,但是现在即将会告别一段落,人生即将进入下一个规划。我们一起…

3---Linux编译器gcc/g++

一、程序的翻译过程:ESc->iso 1.1预处理:c->c 主要功能:宏替换、头文件的展开、条件编译、去注释;目的是让代码变得纯粹。条件编译,可以实现对代码的裁剪。比如对于不同用户,设置不同的宏常量&…

【知识碎片】2024_05_10

每日代码 至少是其他数两倍的最大数 . - 力扣&#xff08;LeetCode&#xff09; int dominantIndex(int* nums, int numsSize) {int max_num 0;int next_max 0;int pos 0;for(int i 0; i < numsSize; i){if(nums[i] > max_num) {pos i;next_max max_num;max_num…

【Linux】简易进度条的实现

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中进度条的实现的相关内容。 如果看到最后您觉得这篇文章写得…

LeetCode算法题:7. 整数反转

给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&#xff1a; 输…

QML配合VTK基本实现

采用 QT5.15 VTK9.2.0 建立QT QUICK项目 部分方法来源于 QML加载VTK main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine>#include <QQuickVTKRenderWindow.h> #include <QQuickVTKRenderItem.h> #include <vtkPolyDataMapp…

使用2G内存求20亿个数字中出现次数最多的N个

又是一个TOP -N的题目 我看了一下CSDN上大多数人的回答和GPT说的差不多&#xff0c;都是说使用哈希之类的&#xff1b; 我今天说一下我的解法&#xff0c;首先说一下不太快的基础解法 20亿数字使用uint32需要80GB&#xff0c; &#xff08;1&#xff09;分为40块读取&#…

百面算法工程师 | 传统图像处理——OpenCV

本文给大家带来的百面算法工程师是传统图像处理的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们将介绍一些集几何变换和图像平滑处理&#xff0c;并提供参考的回答及其理论基础&…

中国地面气候资料日值数据获取方式

数据简介 环境气象数据服务平台提供了全国大约2100个点位&#xff0c;2000年至2023年的逐日数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF reanalysis-era5-land、reanalysis-era5-single-levels 以及中国2100站点地面气候资料日值观测数据&#xff0c;使用机器…

深入Android ViewModels:Dos和Don‘ts

深入Android ViewModels&#xff1a;Dos和Don’ts 若你正使用ViewModels&#xff0c;务记以下几点以提升代码质量。本系列文章深入探讨了利用Android ViewModels的最佳实践&#xff0c;强调必须遵循和避免的关键点&#xff0c;以提升代码质量。我们将讨论ViewModels在管理UI状…

HarmonyOS开发案例:【生活健康app之编写通用工具类】(5)

本节将介绍日志打印、时间换算等通用工具类的编写和使用&#xff0c;工具类可以简化应用代码编写和业务流程处理。 日志类 日志类Logger旨在提供一个全局的日志打印、日志管理的地方&#xff0c;既可以规范整个应用的日志打印&#xff0c;也方便日后对日志工具类进行修改&…

CV每日论文--2024.5.9

1、Tactile-Augmented Radiance Fields 中文标题&#xff1a;触觉增强的辐射场 简介&#xff1a;我们提出了一种新的场景表示方法,称为"触觉增强的辐射场(Tactile-Augmented Radiance Fields, TaRF)"。这种方法将视觉和触觉信息融合到一个共享的三维空间中。通过拍摄…

【Vue2】关于response返回数据的错误小记

关于Vue2中response返回数据的一个错误小记 如图&#xff0c;在这里返回的时候&#xff0c;后端是通过List< String >返回的&#xff0c;response接收到的实际上是一个Array数组&#xff0c;但是赋值给searchedTaskList的时候&#xff0c;需要在.then包括的范围里面赋值给…

2024年心理健康与人文发展国际学术会议(ICPHHD 2024)

2024年心理健康与人文发展国际学术会议(ICPHHD 2024) 2024 International Conference on Psychological Health and Humanistic Development 一、【会议简介】 2024年心理健康与人文发展国际学术会议&#xff0c;将汇集全球的心理学家和导师、学者。 在这个盛大的学术会议上&am…