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
英文地址,請注明出處:http://en.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鏡像直鏈下載工具 核心功…