Uber的MySQL实践(一)——学习笔记

MySQL 是Uber数据基础设施的核心支柱,支撑着平台上大量关键操作。Uber 拥有一套庞大的 MySQL 集群,如何构建一个控制平面来管理如此大规模的 MySQL 集群,并同时确保零宕机、零数据丢失是一个十分有挑战性的问题。下面重点介绍 Uber 的 MySQL 集群架构、控制平面的操作机制,以及近年来在控制平面上的关键改进。

一、架构概览

1.1 概览

Uber 的 MySQL 集群由多个集群(官方数据称包含超过 2300 个独立的集群)组成,每个集群包含若干节点。系统包含两个主要的数据流:

  • 数据面(Data Plane):服务端/客户端与 MySQL 集群交互。托管在 K8s中的无状态服务通过标准 JDBC 客户端连接至其对应的 MySQL 集群。每台服务器上部署了一个反向代理,用于基于角色(主节点/副本/批处理)存储并维护路由映射。这使客户端能根据查询内容发现并连接到合适的节点。

  • 控制面(Control Plane):负责集群和节点的创建、维护与下线,并确保安全策略合规,以及与公司内部基础设施的集成。

Uber 的 MySQL 架构由以下几个关键组件构成:

  • 控制面(Control Plane)
  • 数据面(Data Plane)
  • 服务发现面(Discovery Plane)
  • 可观测性系统(Observability)
  • 变更数据捕获 & 数据仓库同步(CDC & DW Ingestion)
  • 备份与恢复系统(Backup/Restore)
    在这里插入图片描述

1.2 控制平面(Control Plane)

MySQL 控制平面是一个基于状态的系统,由多个服务和存储组件构成。其中最核心的组件是 技术管理器(Technology Manager),负责协调控制平面内其他模块的操作。它的关键职责如下:

  1. 发布目标状态(Goal State)至 Odin(Uber 内部用于有状态服务管理的基础平台)。目标状态包括资源配置、节点数量、节点角色(主/从)、数据节点需要运行的边车容器、MySQL 服务设置(如 binlog 格式、SQL 模式)等内容。
  2. 控制平面会持续保证每一个集群与节点都趋于其目标状态,确保系统始终处于一致性配置。

此外,技术管理器还支持通过 工作流(Workflow) 修改系统状态。这些工作流是基于 Cadence 的容错、持久化、长生命周期的自动化任务,例如:

  • 为现有集群添加节点;
  • 主节点故障转移(Failover);
  • 修改节点上的 MySQL 参数;
  • 更换副本的主库节点等。

其他核心职责还包括:

  • 集群管理:创建、更新与删除集群;
  • 主库故障转移:切换集群的主节点;
  • 节点生命周期管理:增删改替服务器节点;
  • 节点均衡调度:向 Odin 的调度引擎提供信号,确保节点在地理位置上的均衡分布,提高容灾能力;
  • 数据库操作:系统变量设置、主从复制配置、弹性扩缩容等操作。

过去控制平面与底层基础设施耦合度较高,导致 MySQL 故障经常影响资源调度。这种耦合影响了 60 多种工作流的稳定性,最终推动了整个控制平面的重构。

1.3 控制器(Controller)

控制器作为所有MySQL集群的外部观察者,持续监听 MySQL 集群的状态信号,并在违反预设规则时执行自恢复操作。控制器的核心职责包括:

  • 监控主节点健康状况;
  • 在发现主节点不可用时自动触发 主库故障转移(Failover)
  • 在 Group Replication 环境中,确保集群状态均衡。

二、关键流程编排机制

控制平面主要通过 工作流机制 与外部交互。工作流是异步事件驱动的任务序列,支持复杂操作的编排和错误恢复。整套工作流系统基于 Cadence 构建,实现高可用、高容错的流程控制。
在这里插入图片描述
以下是两个关键流程的架构介绍。

2.1 主节点故障转移(Primary Failover)

Uber 使用 单主多从 架构,主节点处理写操作,使用 MySQL 的 Binlog 将数据同步到多个副本。

控制器根据主节点健康状态,自动执行以下两种故障转移:

  • 正常转移(Graceful Failover):例如运维过程中主节点需下线或重启。流程如下:
    1. 将当前主节点设置为只读;
    2. 停止主节点流量;
    3. 选择新主节点(优先选择当前数据中心延迟最小的副本);
    4. 等待新主节点应用所有 Binlog;
    5. 启用新主节点写入功能。
  • 故障转移(Emergency Failover):不依赖原主节点的数据同步,适用于主节点已不可达的场景。例如数据中心宕机、主节点失联。

主故障转移是保证下游服务99.99%的可用性这一SLA的关键过程。

2.2 节点替换(Node Replacement)

节点替换意味着将 MySQL 节点及其数据从一台主机迁移至另一台,同时确保客户端无感知。替换流程主要包括两个操作:

  • 节点添加:确定目标主机 → 安装 MySQL → 数据同步(首选主节点);
  • 节点移除:处理依赖(复制关系等)后,安全下线旧节点。

注意事项:

  • 新节点需具备相同硬件配置
  • 放置在相同容灾等级的主机;
  • 若旧节点是复制父节点,其子节点必须指向新的替换节点或连接到集群中的另一个节点。
  • 若旧节点是主库,需先执行优雅主库切换。

2.3 架构变更(Schema Changes)

Uber 支持通过自助工作流自动执行 无锁的在线表结构变更。根据变更类型和数据规模,系统根据模式更改类型和数据大小智能地选择模式应用策略:

  • MySQL Instant Alter;
  • Percona 的 pt-online-schema-change 工具(ptosc)。

支持 Dry-Run 模式:先在隔离副本上执行变更,确保安全后再在主库生效。

此外,表结构变更还集成到了 CI/CD 流水线中,开发者将变更写入 schema 文件,与代码一起提交,审核通过后自动触发部署,确保数据库结构与业务代码一致

三、数据面(Data Plane)

一个运行中的 MySQL 节点由多个容器构成,部署在同一宿主机上,容器间通过 Docker 网络通信。
在这里插入图片描述

  • 数据库容器:运行 mysqld 进程,默认使用 InnoDB 引擎;
  • Worker 容器:收敛当前状态至目标状态,这将MySQL节点与Odin放置引擎集成在一起;
  • 监控容器:收集 QPS、锁等待、连接数等指标;
  • 健康探测器:周期性检测主节点状态,供控制器做出自动化响应;
  • 备份容器(Backup):周期性拉起,获取数据库备份并将其上传到对象存储,

四、发现平面(Discovery Plane)

为了简化客户端与MySQL集群的交互,路由平面或发现平面提供了对不断变化的硬件基础设施的抽象。为服务连接到其MySQL集群提供了一个单一的虚拟IP,隐藏了硬件级别的所有更改。路由发现平面由以下三个主要模块组成:

  • 反向代理:充当负载均衡器,转发请求;
  • 连接池服务:在节点状态变化时更新代理配置;
  • 标准客户端库:提供连接创建、连接池管理、超时控制、度量采集等能力。
    路由层使用 etcd 作为强一致性的拓扑存储。所有拓扑变更通过 etcd watch 机制通知连接池服务,动态调整反向代理配置,实现读写流量智能调度。发现平面支持禁用特定节点上的流量。这对于调试MySQL节点中的任何硬件或软件故障而不影响客户流量非常有用。

五、可观测性(Observability)

系统通过监控容器和探测器持续采集指标,并发送至 Uber 的日志与指标平台。支持的告警项包括:

  • 写不可用;
  • 主从延迟;
  • CPU 使用率过高;
  • 异常连接数等。
    开发团队和上游服务都可订阅这些告警,第一时间发现异常,保障服务可靠性。

六、变更数据捕获(CDC)

MySQL 集群通过 Storagetapper 实现 CDC,实时捕捉 binlog 中的insert, update和delete操作,并流式传输至 Apache Kafka,再写入 Apache Hive数据仓库。系统支持上游结构变更、数据转换及格式转换等操作。

七、备份与恢复(Backup & Restore)

Uber 的 MySQL 集群支持完全自动化的备份与恢复,基于 Percona XtraBackup 实现。支持:

  • 4 小时的 RPO(恢复点目标)
  • 分钟到小时级的 RTO(恢复时间目标),取决于数据规模。

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

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

相关文章

腾讯云EdgeOne产品深度分析报告

一、产品概述腾讯云EdgeOne是腾讯云推出的新一代边缘安全加速平台,集成内容分发网络(CDN)、Web应用防火墙(WAF)、DDoS防护、Bot管理、API安全及边缘计算能力,致力于为企业提供一站式安全加速解决方案。该平…

Spring Boot 优雅配置InfluxDB3客户端指南:@Configuration + @Bean + yml实战

前言 想用Java玩转InfluxDB 3?要是还靠写main函数硬编码配置,那就像穿着睡衣开正式会议,实在有点不靠谱。现代Spring开发套路讲究配置和代码分离,讲究优雅和灵活。用@Configuration配合@Bean注解,再加上yml配置文件集中管理连接信息,简直是为代码打扮一身西装,既整洁又…

记录:rk3568适配开源GPU驱动(panfrost)

rk3568采用的GPU是Mali-G52,该型号的GPU已在5.10内核的panfrost驱动中被支持。下面记录下移植过程。 1.内核dts修改: kernel 5.10: arch/arm64/boot/dts/rockchip/rk3568.dtsigpu: gpufde60000 {compatible "rockchip,rk3568-mali", "ar…

SMBIOS详解:系统管理BIOS的工作原理与实现

1. SMBIOS概述 SMBIOS(System Management BIOS)是由DMTF(分布式管理任务组)制定的行业标准,旨在为计算机系统提供统一的硬件信息描述框架。它定义了计算机硬件组件(如处理器、内存、主板等)的标…

8.5 CSS3多列布局

多列布局 CSS3之多列布局columns CSS3中新出现的多列布局(multi-column)是传统HTML网页中块状布局模式的有力扩充。这种新语法能够让WEB开发人员轻松的让文本呈现多列显示。 设置列宽 column-width: | auto 设置对象的宽度;使用像素表示。 auto&#…

Chrome插件快速上手

目录 前言 一、浏览器插件的主要功能 二、插件的工作原理 插件结构 manifest.json icons background.js content-scripts 三、插件例子 popup popup.html popup.js styles.css background.js content-script.js manifest.json 四、其它 前言 本文不做特殊说明…

moment和dayjs

一:moment和dayjs 区别moment 大且可变、维护模式;dayjs 小且不可变、插件化、tree‑shaking 友好。antd v4 用 moment;antd v5 用 dayjs。请在同一项目中统一其一,避免混用导致组件报错。二: antd 4.24.16&#xff08…

Flutter Packge - 组件应用

一、组件创建1. 在工程根目录创建 packages 目录。mkdir packages #创建文件夹 cd packages 2. 创建纯 Dart Package(适合工具类/UI组件)。flutter create --templatepackage common_network二、组件配置1. 在 common_network 的 pubspec.yaml 中添加…

基于双块轻量级神经网络的无人机拍摄的风力涡轮机图像去雾方法

基于双块轻量级神经网络的无人机拍摄的风力涡轮机图像去雾方法 UAV-Taken Wind Turbine Image Dehazing With a Double-Patch Lightweight Neural Network 我是菜鸡!我是菜鸡!我是菜鸡! 如果老师及学姐学长对该文有任何意见,请…

Spring AI Alibaba 项目接入阿里云百炼平台大模型

1 依赖jdk 21 springboot 3.4.5 spring-ai-alibaba-starter-dashscope 1.0.0.2<properties><java.version>21</java.version><spring-ai.version>1.0.0</spring-ai.version><spring-ai-alibaba.version>1.0.0.2</spring-ai-alibaba.v…

电脑和手机访问网站,自动检测跳转不同网站

自动检测跳转不同网站 自动检测设备手机或电脑来跳转不同网页 开箱即用&#xff0c;不过需要自己修改一下跳转链接 源码截图&#xff1a; 下载地址&#xff1a;电脑和手机访问网站&#xff0c;自动检测跳转不同网站.zip - 蓝奏云

Spring Boot 集成 ShardingSphere 实现读写分离实践

Spring Boot 集成 ShardingSphere 实现读写分离实践 在高并发的业务场景中,数据库往往是系统性能的瓶颈。为了提高系统的吞吐量和稳定性,读写分离是一种常见的优化方案。本文将详细介绍如何使用 Spring Boot 结合 ShardingSphere 实现数据库的读写分离,并提供完整的配置和实…

以rabbitmq为例演示podman导出导入镜像文件

1. 导出镜像为 tar 文件 将镜像保存为压缩包&#xff08;默认格式为 docker-archive&#xff09;&#xff1a; podman save -o rabbitmq_management.tar docker.io/rabbitmq:management-o&#xff1a;指定输出文件名&#xff08;如 rabbitmq_management.tar&#xff09;。镜像名…

LIS(最长上升子序列)与LCS(最长公共子序列)

最长上升子序列定义&#xff1a;给出一个数字序列&#xff08;arr&#xff09;&#xff0c;求出其中长度最长的数值严格递增的子序列做法一&#xff1a;使用动态规划&#xff0c;我们定义dp[i]为以arr[i]结尾的最长上升子序列的长度。#include<bits/stdc.h> using namesp…

javaSE(基础):5.抽象类和接口

抽象类一.理解抽象类思维&#xff1a;假如我想定义一个Shape&#xff08;图形类&#xff09;类&#xff0c;我在这个类中写了一个draw()方法&#xff0c;但是这个方法是不能用来描述图形形状的&#xff08;不能有方法体&#xff09;&#xff0c;因为我只要对他进行了准确描述&a…

ESG评级可持续发展之路,ESG评级的好处

在商业文明的演进历程中&#xff0c;ESG评级正成为衡量企业价值的全新坐标系。这套融合环境&#xff08;Environmental&#xff09;、社会&#xff08;Social&#xff09;和治理&#xff08;Governance&#xff09;三大维度的评估体系&#xff0c;犹如一盏明灯&#xff0c;指引…

camera人脸识别问题之二:【FFD】太阳逆光场景,人像模式后置打开美颜和滤镜,关闭heif拍摄格式对着人脸拍照,成像口红出现位置错误

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; camera人脸识别问题之二&#xff1a;【FFD】太阳逆光场景&#xff0c;人像模式后置打开美颜和滤镜&#xff0c;关…

YOLO-Count:用于文本到图像生成的可微分目标计数

摘要 https://arxiv.org/pdf/2508.00728v1 我们提出了YOLO-Count&#xff0c;一种可微分的开放词汇目标计数模型&#xff0c;旨在解决通用计数挑战并实现文本到图像(T2I)生成的精确数量控制。核心贡献是"基数"图(cardinality map)&#xff0c;这是一种新颖的回归目标…

Go 的错误处理方式深度解析—— error vs panic vs recover:机制原理与实战取舍

一、Go 的错误处理哲学Go 的设计哲学鼓励明确的、显式的错误处理方式。它不像 Java 或 Python 使用异常机制&#xff0c;而是采用了返回值 error 的方式&#xff0c;让错误成为程序流程的一部分。Go 的错误处理核心理念是&#xff1a; 错误是值&#xff08;Errors are values&a…

官方Windows系统部署下载工具实践指南

摘要&#xff1a;本文介绍两款用于获取微软正版系统部署文件的工具&#xff0c;适用于需要快速搭建Windows环境的技术人员。所有工具均基于官方渠道实现&#xff0c;不涉及系统修改或激活功能。一、Windows系统镜像下载方案工具名称&#xff1a;Windows镜像直链下载工具 核心功…