TMHA高可用方案:淘宝双十一背后的数据库切换黑科技,设计思路至今无人超越

MySQL LVS+Keepalived+MHA 高可用群集 应用部署操作手册 MySQL LVS+Keepalived+MHA 高可用群集 阅读详情

上一篇聊了NDB Cluster这种特种武器,有读者说:"前面几篇把开源方案讲遍了,能不能讲讲大厂自己玩的那一套?"

这个话题我确实想聊很久了。我研究过不少大厂的高可用方案,淘宝的TMHA(Taobao Master High Availability)是我觉得设计最精巧的一个。它出现在MHA还没普及的年代,双十一交易主库都敢在当天做切换,这份底气背后是一整套严密的设计。

今天这篇,我把TMHA的整体架构、异常切换、数据一致性保障、自动切换机制拆开来聊。就算你不打算自研,这些设计思路也能帮你把开源方案用得更明白。

图片

一、先搞清楚:大厂面临的高可用难题和我们不一样

我们在小公司碰到的主库故障,一年没几次。淘宝那个体量,服务器以万台计,按硬件厂商给的MTBF数据推算,机器故障是天天有的事。

所以淘宝要解决的问题,不是"主库挂了怎么办"这种偶发事件,而是"主库挂是常态,怎么让切换像呼吸一样自然"。

具体拆解下来,难题有这么几个:

主库挂了,从哪个从库选新主?数据还没同步完怎么办?切换动作怎么让应用知道?老主库修好了,怎么把它塞回集群?一套库好办,几百套库同时切怎么办?

开源方案里,MHA解决了前两个问题的一半,应用感知和批量切换基本没管。这就是淘宝自己造轮子的原因。

二、TMHA的整体架构:决策和执行分离

TMHA的架构里有四个关键角色,我把它们的分工讲清楚,你就明白这套设计的精妙之处了。

图片

Agent:每台MySQL服务器上部署一个,负责干两件事:盯着本机的MySQL状态,跟ZooKeeper保持心跳。

ZooKeeper:分布式协调服务,存集群状态,靠Watcher机制给关注者推送事件。

SwitchManager:切换决策中心,多机房部署,无状态,支持幂等操作。它接收ZooKeeper的事件,确认故障后执行切换。

TDDL:淘宝的分布式数据中间层,应用不直连数据库,全部走TDDL。切换时TDDL拿到新配置,自动把流量导过去。

这套架构最妙的地方是决策和执行分开了。MHA的Manager又当裁判又当运动员,它自己就是单点。TMHA里,Agent只负责上报状态,SwitchManager只负责决策,TDDL只负责执行路由,每个角色都可以水平扩展,没有单点。

三、异常检测:所有故障都抽象成"节点消失"

这是我觉得TMHA设计里最有智慧的部分。

主库故障千奇百怪:MySQL进程崩了、机器死机了、网卡坏了、机房断电了。要是每种故障都写一套检测逻辑,系统会复杂到没法维护。

TMHA的做法是:把所有故障抽象成一个信号,ZooKeeper上的Agent节点消失。

你看这个映射关系多干净:

MySQL进程崩了,Agent检测到后主动删除自己在ZK上的节点。机器死机了,Agent跟着死,ZK上的临时节点超时后自动消失。网络断了,Agent和ZK的心跳断了,同样是节点超时消失。整个机房断电,还是节点消失。

SwitchManager不用关心到底是什么故障,它只需要处理"节点消失"这一种事件。这就是抽象的力量。

还有个细节值得学:二次确认。Agent2收到Agent1消失的事件后,不会立刻切换,而是创建异常节点记录下来,SwitchManager拿到异常节点后再确认一次,真的异常才推切换。网络抖动造成的误判,在这一层就被过滤掉了。

主库选举用的也是ZK的经典玩法:每个客户端在/lock下创建带序号的临时节点,序号最小的当主。主库挂了节点消失,剩下的节点重新抢锁,抢到锁的就是新主。这套写锁机制保证了任何时刻只有一个主库。

四、数据一致性:rSQL回滚机制

切换最怕的不是服务中断,是数据错乱。TMHA把可能丢的数据分成两类,分别给出了解法。

Δ2:从库的Relay Log损坏。这个好办,比对Exec和Read的位置,不相等说明有丢失,reset slave重新拉取就行。

Δ1:挂掉的主库上还有Binlog没传到从库。这个麻烦。主库都挂了,数据拿不回来,直接切换就会和从库产生差异。

TMHA的处理策略分两步走:

如果老主库能抢救回来,就让Δ1继续同步,不切换,等数据追平再说。

如果决定切换,老主库后来起来了,就要把Δ1回滚掉。怎么回滚?这里用了一个很骚的操作:把Binlog倒序解析,生成逆向SQL。主库执行了INSERT,回滚就执行对应的DELETE。这个机制叫rSQL,前提是Binlog必须是ROW模式,因为只有ROW模式才能精确还原每一行的变化。

配套的还有个Replay机制:回滚之后,把回滚掉的SQL在新主库上重放一遍,业务数据能救回来多少算多少,中间靠冲突检测机制兜底。

我第一次看到这个设计的时候挺震撼的。大部分人想到的都是"怎么把数据补全",淘宝的思路是"补不全就回滚到一致状态,再想办法重放"。方向反过来了,但工程上更可行。

五、自动切换:白名单加人工兜底

TMHA的切换分好几种类型,对应不同场景。

正常切换:机器维修、扩容这类计划内操作,慢慢来,数据追平再切。

强制切换:主库load飙高扛不住了,比如双十一流量洪峰,不等了,直接切。

自动切换:主库真挂了,走前面说的检测流程,但只对白名单里的库开放。白名单这个设计很务实,核心库才敢开自动切换,边缘库宁可人工介入。

批量切换:机房级别的操作,几十套库一起切。这个场景开源工具根本不支持,只能自研。

有一点我很认同:故障自动切换和人工强制切换是兼容的,两条腿走路。全自动听起来美好,真出了事你就知道,能把决策权收回到人手里有多重要。

六、主备延迟的解法:数据复制中心DRC

主备延迟是异步复制的娘胎病,TMHA的解法是搞了个数据复制中心(DRC)。

DRC的思路是把复制这件事从MySQL手里拿出来,由专门的系统负责。它多线程往目的端写,支持事务,还能顺便把数据dump给搜索之类的下游系统用。

这个设计后来演化成了很多大厂的通用数据同步平台,思路都是一样的:MySQL原生复制不够用,就自己造一条更快、更可控的管道。

七、TMHA给我们什么启发?

TMHA我们抄不走,它和TDDL、ZK体系、淘宝的基础设施深度绑定的。但它的设计思路,每一条都能用到我们自己的系统里。

故障检测要抽象。别给每种故障写一套逻辑,找到它们的共同表现形式,统一处理。

决策要留余地。二次确认、白名单、人工兜底,这些机制让系统在面对异常时更谨慎。

数据一致性要想清楚兜底方案。补不齐就回滚,回滚完再重放,保证任何时刻集群状态是可解释的。

切换不是数据库自己的事。数据库切完了,应用没切过去,等于没切。TMHA的总结里有句话说得很到位:APP切换才意味着整体的切换完毕。

八、面试题拆解

题1:TMHA和MHA有什么区别?

MHA是单Manager架构,Manager既做检测又做决策,自己是单点。TMHA把检测、决策、执行拆开了:Agent负责上报,ZooKeeper负责协调,SwitchManager负责决策,TDDL负责应用层切换。每个组件都能水平扩展。

数据一致性上,MHA靠抢救Binlog补数据,TMHA除了补数据还有rSQL回滚机制,能把老主库回滚到和新主库一致的状态。

题2:TMHA怎么防止误切换?

两道防线。第一道是故障抽象,所有故障统一表现为ZooKeeper节点消失,不用关心具体原因。第二道是二次确认,SwitchManager收到异常事件后再确认一次,网络抖动在这个环节就被过滤了。

题3:rSQL回滚是什么原理?

把宕机主库上没同步出去的Binlog倒序解析,生成逆向SQL,在老主库上执行回滚,让它和新主库数据一致。比如主库执行了INSERT,回滚就执行对应的DELETE。前提是Binlog必须是ROW模式,只有ROW模式能精确还原行级变化。

题4:大厂方案能直接搬到中小公司吗?

不能照搬,能抄的是思路。故障抽象、二次确认、决策与执行分离、切换要覆盖到应用层,这些设计理念用MHA加自研脚本也能实现个七八成。但TDDL那种中间层、DRC那种数据管道,没有相应的团队规模别碰。

九、总结

TMHA是特定时代的产物,它解决的是超大规模实例下的高可用自动化问题。今天云数据库普及了,很多能力RDS开箱即用,自研一套TMHA的必要性没那么大了。

但它留下来的设计思想没过时:故障抽象、决策分层、数据兜底、应用联动。你去看现在各种数据库高可用方案,骨子里都是这些思路。

这个系列到这里就真的结束了。从主从复制的底层原理,到MHA、PXC、MGR这些开源方案,再到InnoDB Cluster官方套件、NDB内存集群,最后到TMHA这种大厂自研,MySQL高可用的完整图景都在这了。

面试也好,选型也好,记住一句话:方案没有高低贵贱,只有合不合适。

这个系列完结撒花。你还想听我聊什么数据库话题?评论区告诉我。

干货已送达,点赞是签收,转发是好评,留言是售后!

MySQL高可用集群架构MHA企业级实战 MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本 DeNA 公司的 youshimaton(现就职于 Facebook 公司)开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。自动的在MASTER宕机后选举新的SLAVE作为MASTER,保证服务不被中断自动的在MASTER宕机后将所有未被选举为新MASTER的SLAVE重新指向新的MASTER并启动复制。 阅读详情

相关推荐

AnyLogic 8.8.3 最新版安装指南:从下载到配置的完整流程(附Java环境设置技巧)

本文提供了AnyLogic 8.8.3最新版从下载到配置的完整安装指南,重点解决了跨平台(Windows、macOS、Linux)部署中的常见问题。核心内容详细讲解了Java开发环境(JDK)的精准配置技巧,包括版本选择、系统环境变量设置与验证,确保为仿真建模工作奠定稳固基础。

efc1234567的博客 760

MySQL-HMA 高可用故障切换

目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA 的出现就是解决 MySQL 单点的问题。另外随着企业数据量越来越庞大,数据库的压力又成为企业的另一个 瓶颈,MySQL 多主多从架构的出现可以减轻 MySQL 本身的压力。本章将主要介绍 MHA 的搭建和模拟 MySQL 故障自动切换的过程。

ls041224的博客 1819

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 278

MHA高可用配置及故障切换

MHA高可用配置及故障切换案例概述简介MHA概述 (基于一主多从)MHA的组成MHA特点项目拓扑图实验思路:故障模拟故障修复实验思路案例环境案例需求案例实现思路环境准备:高可用部署安装5.6 mysql数据库安装 MHA 软件故障修复步骤总结 案例概述 传统的MySQL主从架构存在的问题 单点故障 简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL主从复制架构提供了 automating master failover (自动化主故障转移)功能。MHA 在监控到 ma

weixin_50345059的博客 264

速腾RS-LiDAR-16激光雷达ROS配置全攻略:从硬件连接到Rviz点云可视化

本文详细介绍了速腾RS-LiDAR-16激光雷达在ROS环境中的配置与使用全攻略,涵盖硬件连接、网络配置、ROS驱动安装及Rviz点云可视化等关键步骤。通过实战案例和技术解析,帮助开发者快速实现激光雷达数据采集与处理,提升机器人感知系统的部署效率。

ooo22的博客 249

利用eds editor生成CANOPEN 设备eds文件

通过以上步骤,您可以根据实际设备的功能特性,自动生成一份符合CANopen协议标准的电子数据表(EDS文件),该文件可以被上位机软件或其他CANopen主站设备用于识别、配置和控制您的CANopen从站设备。使用CANopen EDS Editor生成CANOPEN设备的EDS文件是一个系统化的过程,它涉及将设备的具体技术参数和功能映射到CANopen规范定义的对象字典中。

weixin_38604759的博客 6458

MySQL实现MHA高可用配置及故障切换理论加实操演练!!

文章目录一:MHA架构1.1:MHA概述1.2:MHA的组成1.3:MHA Manager与MHA Node的作用1.31:MHA Manager1.32:MHA Node1.4:MHA特点1.5:MHA工作原理二:案列环境2.1:搭建Mysal主从复制环境2.21:修改主机名便于分区各个服务器2.22:安装编译依赖的环境2.23:安装gmak2.24:安装Mysql数据库2.25:修改Master的主配置文件2.26:三台分别启动mysql服务2.27:配置Mysql一主两从2.28:验证主从复制功能2.

weixin_47151643的博客 1128

SAP固定资产原值与净值取值逻辑全解析:从数据表到ABAP实战

在企业资源计划(ERP)系统中,固定资产的价值管理是财务会计的核心模块,其关键在于准确核算资产原值与净值。从技术原理上看,这涉及对资产全生命周期业务(如购置、折旧、转移、报废)的财务建模,以及底层数据表(如ANLC、ANEP)的精准关联与计算。掌握这一逻辑的技术价值在于,能够确保财务报表数据的准确性,满足合规性要求,并为管理决策提供可靠依据。在SAP ECC或S/4HANA系统的应用场景中,ABAP开发者与财务顾问常需通过编写报表程序,从复杂的数据结构中提取资产价值信息。本文聚焦于SAP资产会计模块,深入剖

weixin_30984001的博客 393

MySQL MHA故障切换

目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA 的出现就是解决 MySQL 单点的问题。另外随着企业数据量越来越庞大,数据库的压力又成为企业的另一个 瓶颈,MySQL 多主多从架构的出现可以减轻 MySQL 本身的压力。本章将主要介绍 MHA 的搭建和模拟 MySQL 故障自动切换的过程。

2301_77081516的博客 1180

zabbix添加IBM服务器SNMPV3监控

本地采用欧冠的是zabbix5.0,服务器型号是SR860,使用snmpv3因为只支持这个,醉了。说明:本地采用欧冠的是zabbix5.0,服务器型号是SR860。

萌新包大人的博客 1984

3D打印机控制系统设计:基于MATLAB的3D打印机运动学建模、轨迹规划和控制

控制实现:在控制实现中,需要将轨迹规划的结果转化为实际的控制指令,控制3D打印机按照规划的轨迹进行运动。3D打印机的运动学建模:3D打印机的运动学建模是指将3D打印机的机械结构、传动系统和运动控制部件等抽象成数学模型,以便于进行控制系统的设计和分析。轨迹规划:轨迹规划是指根据3D模型的几何形状和打印机的运动学模型,计算出打印机需要执行的运动轨迹,以便于实现所需的打印效果。控制实现:控制实现是指将轨迹规划的结果转化为控制指令,控制3D打印机按照规划的轨迹进行运动。

走向CTO的路上... 2473

MySQL生产环境高可用架构详解(2)

半同步复制 默认主从为...

法号钦尘的博客 385

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591

学习MHA架构一篇就够了(博主之疯狂踩坑)!

博主疯狂踩坑完成了搭建一个MMA架构,一套优秀的MySQL故障切换和主从提升的高可用软件,解决mysql主服务器单点故障的方法。

下一个艺术家 2493

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

随缘操作:MySQL实现MHA高可用配置及故障切换理论加实操演练--------------------电脑CPU100%照样干

MHA高可用前言一:MHA架构1.1:MHA概述1.2:MHA的组成1.3:MHA Manager与MHA Node的作用1.31:MHA Manager1.32:MHA Node1.4:MHA特点1.5:MHA工作原理二:案列环境2.1:搭建Mysal主从复制环境2.21:修改主机名便于分区各个服务器2.22:安装编译依赖的环境2.23:安装gmak2.24:安装Mysql数据库2.25:修改Master的主配置文件2.26:三台分别启动mysql服务2.27:配置Mysql一主两从2.28:验证主从复制

Hero 390

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Mysql-MHA高可用框架

一、案例概述 传统的MySQL主从架构存在的问题 单点故障(当主mysql服务器发生故事的时候不会自动转移) 二、案例前置知识点分析 MHA概述——基于一主多从架构 一套优秀的MySQL高可用环境下故障切换和主从复制的软件 MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换 MHA的组成 MHA Manager(管理节点) MHA Node(数据节点) MHA的特点 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失 使用半同步复制,可以大大降

weixin_49780168的博客 597

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

lvs+keepalived+mha+mysql高可用架构

http://www.chocolee.cn/archives/276 MHA介绍MHA(MasterHighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本人youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到0~30秒之内自动完成数据库的故障切...

weixin_33768481的博客 288

理论操作:MySQL实现MHA高可用配置及故障切换-------------------------------------------搞点鸭货整点啤酒继续整

MySQL实现MHA高可用配置及故障切换一:MHA架构1.1:MHA概述1.2:MHA的组成1.3:MHA Manager与MHA Node的作用1.31:MHA Manager1.32:MHA Node1.4:MHA特点1.5:MHA工作原理二:案列环境2.1:搭建Mysal主从复制环境2.21:修改主机名便于分区各个服务器2.22:安装编译依赖的环境2.23:安装gmak2.24:安装Mysql数据库2.25:修改Master的主配置文件2.26:三台分别启动mysql服务2.27:配置Mysql一主两

Hero 553

Mysql架构 MMM与MHA区别

如何避免mysql单点故障 利用mysql主从复制来解决mysql单点故障 如何解决主服务器的单点问题 主服务器切换后,如何通知应用新的主服务器的ip地址 如何检查mysql主服务器是否可用 如何处理从服务器和新主服务器之间的那种复制关系 解决这些问题使用第三方管理组件一种是mmm (Multi-Master Replicatin Manager),它是perl语言开发的一套用于管理m...

黄相勇的博客 4970

MHA 架构使用原理

  MHA 架构介绍: MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本人 youshimaton 开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。在 MySQL 故障切换过程中,MHA 能做到 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA 能最大程度...

魏州青年的博客 1万+

Java重要面试名词整理(七):分库分表

整理java重要面试名词

一起交流,一起进步 1075

MHA 架构使用原理

本文为转载文章,原文地址:MHA 架构使用原理 MHA 架构介绍: MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本人 youshimaton 开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。在 MySQL 故障切换过程中,MHA 能做到 0~30 秒之内自动完成数据库的故障切换操作,并且在...

gd0306的博客 1214

安装部署MHA && MHA原理

文章目录前言一、MHA架构1.1:MHA概述1.2:MHA的组成1.3:MHA Manager与MHA Node的作用1.4:MHA特点1.5:MHA工作原理二、案列环境2.1:搭建Mysal主从复制环境2.21:修改主机名便于分区各个服务器2.22:安装编译依赖的环境2.23:安装cmake2.24:安装Mysql数据库2.25:修改Master的主配置文件2.26:三台分别启动mysql服务2.27:配置Mysql一主两从2.28:验证主从复制功能2.2:安装MHA软件2.3:配置接点间SSH免交互登录

a1231231231313的博客 434

MySQL建库建表操作学习笔记

SQL(Structured Query Language,结构化查询语言)是用于在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。:用于定义对数据库对象(库、表、列、索引)的操作,如 CREATE、DROP、ALTER、RENAME、TRUNCATE 等。保存可变长度的字符串(可包含字母、数字以及特殊字 符)。:用于定义对数据库记录的操作,如 INSERT、DELETE、UPDATE、SELECT 等。:用于定义对数据库、表、字段、用户的访问权限和安全级别,如 GRANT、REVOKE 等。

Eternitycai的博客 224

MySQL 索引深入理解:B+ 树、二级索引、联合索引与查询优化

理解二级索引后,就可以理解回表了。SELECT *MySQL 的执行过程分为三个步骤。覆盖索引(Covering Index)并不是一种独立的索引类型,而是一种查询效果。SQL 查询需要的所有字段,都能够直接从某个索引中获得,不需要再访问聚簇索引获取其他字段。例如:因为user_id已经包含在二级索引中,所以 MySQL 可以直接返回结果。不需要回表。联合索引(Composite Index)是同时使用多个字段建立的索引。它的排序规则是:首先按照user_id排序。当user_id。

m0_64642997的博客 133
上一篇: 智聚天府,共启数据库新程|OpenTenBase 城市行・成都站圆满落幕
云贝教育-郑老师
博客等级 码龄5年 491粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值