9 時序數據庫M3DB架構與原理


一、M3DB介紹

M3DB是Uber開源的一款分布式時序數據庫,已在Uber內部使用多年。M3DB有以下特性:

  • 分布式的時序數據庫,可以水平擴展存儲。
  • 支持Pormetheus的查詢語言PromQL,Prometheus可以使用M3DB做為存儲后端。
  • 支持多租戶,不同租戶(Namespace)提供不同的配置(數據失效時間、Bloack大小等)。
  • 支持數據聚合,可以對監控指標進行采樣。

二、M3DB架構

 

 

組件:

  • M3Coordinator:協調器,用於協調上游系統(如 Prometheus 和 M3DB )之間的讀寫操作,相當於M3DB集群的網關。
  • M3Storage Node:存儲節點,實際存儲時序數據的組件,支持分片、多副本。
  • M3Seed Node(Etcd):種子節點,用於存儲元數據,包括集群、Namespace等的配置。

三、M3DB原理

1.基本概念

  • Placement:用於管理M3DB的Topology(拓撲結構),包括IsolationGroup(所在區域)、Node(M3DB節點)、Shard(分片)、Replication(副本)等。
  • Namespace:邏輯上的多租戶,每個租戶可以設置數據過期時間、Block大小等配置。所有租戶共享拓撲結構。
  • Block:M3DB存儲數據的基本單位,將時間長短作為存儲大小,例如設置Block大小為2h,則Block內存儲2小時的數據。

2.存儲引擎

2.1.數據壓縮

  • M3DB使用M3TSZ算法對Block進行壓縮。
  • M3TSZ基於Facebook Gorilla算法實現,是一種專用於壓縮時序數據的算法,在Uber的生產使用中,一條時序數據會被壓縮到1.45bytes,壓縮比非常高。

2.2.內存結構

 

 

  • Database:M3DB進程,一個Database擁有多個Namespace。
  • Namespaces:租戶,一個Namespace擁有多個Shard。
  • Shards:分片,一個Shard擁有多個Series,M3DB會根據Series id的Hash值分配Series到不同的Shards中。
  • Series:時序數據(Time series datapoints),數據結構包括id、tags、datapoint(timestamp、value)。Series包括Buffer和Cached blocks。
  • Buffer:緩沖區,M3DB會先將時序數據寫入Buffer,Flush機制會將Buffer中的數據形成Block,並持久化到磁盤中。
  • Cached blocks:緩存,M3DB會緩存部分Block。

2.3.持久化存儲結構

  • Commit log:日志文件,M3DB的所有寫入操作會記錄Commit log,用於M3DB啟動時加載數據以及災難恢復。M3DB寫入Commit log時,會先寫入內存中,由M3DB定時(可配置)批量刷新到磁盤中,所以可能會有Commit log丟失的情況。
  • Fileset files:數據文件組,M3DB的Flush機制會將Block寫入到Fileset文件中。Fileset包含一組文件,包括Data file(數據文件)、Index file(索引文件)等等。

2.4.讀寫流程

1)寫流程

寫入M3DB的時序數據必須指定四個屬性:Namespace, Series id, Timestamp, Value。

  • M3DB找到Namespace。
  • M3DB根據Series id計算Hash值,並找到Shard。
  • M3DB將時序數據寫入Buffer,並記錄Commit log。
  • M3DB的Flush機制會定期讀取Buffer,並根據Timestamp將滿足Block大小的時序數據形成Block(例如Block大小為2h,M3DB會將2小時的數據形成Block)。
  • Block形成后,M3DB會用M3TSZ算法壓縮Block,壓縮后將Block持久化到Fileset files。
2)讀流程

讀取M3DB的時序數據必須指定四個屬性:Namespace,Series id,Timestamp范圍。

  • M3DB找到Namespace。
  • M3DB根據Series id計算Hash值,並找到Shard。
  • M3DB會合並Timestamp范圍內的Buffer、Block(Cached、Fileset)。
  • 合並完成后M3DB返回結果。

3.拓撲結構

3.1.Placement

用於管理M3DB的Topology(拓撲結構),M3DB可以使用Placement擴展移除M3DB節點。基本概念:

  • Replication:副本,M3DB可以保存同一份數據的多個副本,保證數據的高可用。
  • Shard:分片,一個分片包含一個或多個Replication。分片包含3個狀態:
    • Initializing:初始化Shatd,此時無法對Shard進行操作。
    • Available:可用狀態,此時可以正常操作Shard。
    • Leaving:移除中。
  • Node:M3DB節點,是以IP+Port來區分,一個實例包含一個Replication下的多個Shard。
  • IsolationGroup:Node所在的區域分組,保證同一分組下只保存一個Replication。

3.2.IsolationGroup分組

可以按照M3DB實例所在的區域進行分組,多個Replication可以分布到不同的IsolationGroup中,以此實現區域上的高可用:

  • 按Rack(機櫃)分組:

  • 按Zone(機房)分組:

  • 按Region(地域)分組:

4.高可用

4.1.一致性等級(Consistency Levels)

M3DB提供連接集群的一致性等級以及讀寫一致性等級,當Client連接M3DB集群達不到連接一致性等級,則無法進行讀寫操作。

1)寫一致性等級(Write consistency levels)
  • One:只需要寫一個Node成功,就表示此次操作成功。
  • Majority:寫大部分Node成功,此次操作才成功。計算Majority的公式為,n代表Node數量,majority=(n+1)/2, 例如n=3,majority=2,表示需要至少有寫2個Node成功,此次操作才算成功。

  • All:寫所有Node成功,此次操作才成功。

2)讀一致性等級(Read consistency levels)
  • One:只需要讀一個Node成功,就表示此次操作成功。
  • UnstrictMajority: 首先讀大部分Node,如果成功,則此次操作成功,否則會嘗試只讀一個Node,成功則表示此次操作成功。
  • Majority: 讀大部分Node成功,此次操作才成功。
  • All: 讀所有Node成功,此次操作才成功。
3)連接一致性等級(Connect consistency levels)
  • Any: M3DB依次嘗試按照All、Majority、One三個等級連接,只要有一個成功,則連接成功,否則連接失敗。
  • None: M3DB始終認為連接是成功的。
  • One: 只需要連接一個Node成功,就認為連接成功。
  • Majority: 連接大部分Node成功,連接才成功。
  • All: 連接所有Node成功,連接才成功。
4)讀寫一致性組合
  • 讀UnstrictMajority,寫Majority,此為默認組合。例如Node數量為3,寫必須滿足至少有2個Node寫成功,保證大部分Node的數據保持一致,讀優先滿足至少2個Node讀成功,如果失敗,則降級,滿足一個Node讀成功即可,保證集群出現大面積故障時,能盡量提供讀服務。監控系統一般使用該組合。
  • 讀Majority,寫Majority。如果對數據一致性要求較高,寫成功的數據,必須能讀出來,可以使用該組合,當集群出現大面積故障時,M3DB則不提供讀寫服務。

4.2.災難恢復

M3DB會在Bootstrap(啟動節點)和Repair(后台修復機制)兩個階段恢復數據,並且提供兩種恢復數據的方式:

  • 基於Commit log恢復數據。
  • 當Commit log丟失,從其他Replication中恢復,恢復時遵循一致性等級。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM