首页 > 数据库 >MySQL HA(High Availability) 数据库高可用工具Orchestrator 基本原理

MySQL HA(High Availability) 数据库高可用工具Orchestrator 基本原理

时间:2022-12-18 21:33:08浏览次数:63  
标签:Orchestrator 探测 High 故障 实例 && MySQL

目录

Orchestrator 是一款开源的MySQL数据库高可用HA工具。

它稳定可靠,通过分布式的集群部署模式,自身具备容灾能力。

它功能强大,通过周期执行探测SQL,抓取MySQL 实例的基本信息,包括配置信息、复制状态等,可以得到MySQL的拓扑结构topology。并且,可以根据拓扑结构诊断故障analysis failure。

目前,在Github开源社区已有star 4.7k+。

本文对Orchestrator的基本工作原理做简单介绍。

以个人的理解,从整体功能,Orchestrator 分 三大部分:

  • 实例探测 (instances discover/poll)
  • 故障分析(failure analysis)
  • 故障恢复(failure recovery)

下面对每一部分做下说明。

1.实例探测 (instances discover/poll)

Orchestrator会对托管的每个MySQL集群实例,进行周期探测。说探测,实际就是,在MySQL实例上执行探测SQL,抓取实例基本信息。例如,show slave statusshow slave hostsshow master statusshow global status like 'Uptime'等等。

实例探测周期由InstancePollSeconds定义,默认是5s。

在实现上,为了保证实例探测的及时性,采用队列 Queue + 生产者/消费者模式。
首先定义一个Queue用于需要探测的实例。

discoveryQueue = discovery.CreateOrReturnQueue("DEFAULT")

接着,将需要探测的实例push到队列,具体实现在onHealthTick()中。

最后,由消费者(一组goroutine) 进行探测 discovery。具体见handleDiscoveryRequests()

func handleDiscoveryRequests() {
	discoveryQueue = discovery.CreateOrReturnQueue("DEFAULT")

	// create a pool of discovery workers
	for i := uint(0); i < config.Config.DiscoveryMaxConcurrency; i++ {
		go func() {
			for {
				instanceKey := discoveryQueue.Consume()
				// Possibly this used to be the elected node, but has
				// been demoted, while still the queue is full.
				if !IsLeaderOrActive() {
					log.Debugf("Node apparently demoted. Skipping discovery of %+v. "+
						"Remaining queue size: %+v", instanceKey, discoveryQueue.QueueLen())
					discoveryQueue.Release(instanceKey)
					continue
				}

				DiscoverInstance(instanceKey)
				discoveryQueue.Release(instanceKey)
			}
		}()
	}
}

2.故障分析(failure analysis)

通过第一部分的实例周期探测,已经抓取到MySQL 集群的拓扑结构topology,实例之间的复制信息等。

接下来,基于这些信息,就可以诊断故障。
具体过程实现在GetReplicationAnalysis()

例如,根据主库存活情况、从库存活和复制状态,其中故障类型如下:

如果主库异常,并且没有从库,判定为DeadMasterWithoutReplicas

if a.IsMaster && !a.LastCheckValid && a.CountReplicas == 0 {
	a.Analysis = DeadMasterWithoutReplicas
	a.Description = "Master cannot be reached by orchestrator and has no replica"

如果主库异常,并且所有从库存活且复制异常,判定为DeadMaster

 if a.IsMaster && !a.LastCheckValid && a.CountValidReplicas == a.CountReplicas && a.CountValidReplicatingReplicas == 0 {
	a.Analysis = DeadMaster
	a.Description = "Master cannot be reached by orchestrator and none of its replicas is replicating"

如果主库异常,并且所有从库异常,且所有从库复制异常,判定为DeadMasterAndReplicas

if a.IsMaster && !a.LastCheckValid && a.CountReplicas > 0 && a.CountValidReplicas == 0 && a.CountValidReplicatingReplicas == 0 {
	a.Analysis = DeadMasterAndReplicas
	a.Description = "Master cannot be reached by orchestrator and none of its replicas is replicating"

如果主库异常,并且部分从库异常,且所有从库复制异常,判定为DeadMasterAndSomeReplicas

if a.IsMaster && !a.LastCheckValid && a.CountValidReplicas < a.CountReplicas && a.CountValidReplicas > 0 && a.CountValidReplicatingReplicas == 0 {
	a.Analysis = DeadMasterAndSomeReplicas
	a.Description = "Master cannot be reached by orchestrator; some of its replicas are unreachable and none of its reachable replicas is replicating"
}

3.故障恢复(failure recovery)

诊断出故障之后,对于可以进行恢复的,接下来就是故障恢复。
为什么说是,“可以恢复的”?
这是因为,对于某些场景,例如,主库故障,但没有存活从库的情况,是无法进行恢复的。

故障恢复的入口函数是executeCheckAndRecoverFunction()

故障恢复过程如下:

  • 停止所有从库的复制
  • 选出新主库
  • 重建拓扑
  • 提升新主库

每个步骤都可以展开一个小节,在这里就不具体阐述了,有兴趣的可以具体看下代码实现。

4.总结

本文主要介绍了Orchestrator基本工作原理,相信看完之后,一定会有所收获。如果想要了解更多关于Orchestrator的信息,可以前往该开源项目
Github地址 Orchestrator查看。

标签:Orchestrator,探测,High,故障,实例,&&,MySQL
From: https://www.cnblogs.com/lanyangsh/p/16990991.html

相关文章

  • 20篇MySQL文章,成体系跟新完毕,尽情学习吧!
    MySQL是对于数据分析师来说。很重要的一项技能。你可以不会python,但是你就是不能不会SQL,基本只要是招数据分析的岗位,就必须要你会使用SQL。基于此,我将自己的学习心得,整理成......
  • mysql count() 优化
    mysqlcount(*)优化通常情况下,分页接口一般会查询两次数据库,第一次是获取具体数据,第二次是获取总的记录行数,然后把结果整合之后,再返回。查询具体数据的sql,比如是这样的:......
  • 深入解读MySQL InnoDB存储引擎Update语句执行过程
    参考b站up戌米的论文笔记https://www.bilibili.com/video/BV1Tv4y1o7tA/书籍《mysql是怎样运行的》极客时间《mysql实战45讲》系列文章目录和关于我一丶Mysql整体架......
  • Mysql 中的升序、降序以及随机查询
    1.升序selecttime,Afromtable1orderbytimeasclimit10;+---------------------+---------+|time               |A      |+------......
  • docker启动mysql
    将docker启动,执行以下命令:dockerrun-p3306:3306--namemysql\-v/mydata/mysql/log:/var/log/mysql\-v/mydata/mysql/data:/var/lib/mysql\-v/mydata/mysql/c......
  • mysql>date用法
     ......
  • MySQL 卸载与安装(压缩包版)
    1.判断本地是否已经安装MySQL①在运行界面输入services.msc进入服务界面,查看是否有MySQL服务②进入任务管理器,点击服务看是否有MySQL服务2.安装MySQL(压缩包版)1.......
  • windows 本地搭建Mysql服务
    1.从服务器下载最新的版本https://downloads.mysql.com/archives/community/ 2.解压到本地文件 3.配置系统变量MYSQL_HOME值是本地的地址D:\Program\mysql-8.0.......
  • 7:数据库设计思维-MySQL
    (目录)7.1数据库设计的基本概要表结构就是定义数据表文件名,确定数据表包含哪些字段,各字段的字段名、字段类型、及宽度,并将这些数据输入到计算机当中关系型数据库:两张表......
  • mysql 8.0 递归实现菜单树
    mysql8.0递归实现菜单树WITHrecursiverec_menu(id,menu_id,sup_menu,menu_name,`level`,rownum,order_str)AS(SELECTT0.id,T0.menu_id,T0.sup_menu,T0.......