天天看點

雲原生資料庫vitess簡介vitess簡介功能與其他存儲選擇的對比架構概念總結

vitess

簡介

Vitess是用于部署,擴充和管理MySQL執行個體的大型群集的資料庫解決方案。它在架構上可以像在專用硬體上一樣有效地在公共或私有雲架構中運作。它結合了NoSQL資料庫的可伸縮性,并擴充了許多重要的MySQL功能。Vitess可以幫助您解決以下問題:

  • 允許您對MySQL資料庫通過分片來進行擴充規模,同時将應用變更降至最低。
  • 從裸機遷移到私有雲或公共雲。
  • 部署和管理大量MySQL執行個體。

Vitess包括使用本機查詢協定的相容JDBC和Go資料庫驅動程式。另外,它實作了MySQL Server協定,該協定實際上與任何其他語言相容。

自2011年以來,Vitess一直在為所有YouTube資料庫流量的服務,如今已被許多企業采用以滿足其生産需求。

功能

  • 性能
    • 連接配接池 - 将前端應用程式查詢複用到MySQL連接配接池中以優化性能。
    • 查詢去重 – 對于在運作中查詢仍在執行時收到的所有相同請求,請對運作中查詢的結果重新使用。
    • 事務管理器 – 限制并發事務的數量并管理截止日期以優化整體吞吐量。
  • 保護
    • 查詢重寫和清理 – 添加限制并避免不确定的更新。
    • 查詢黑名單 – 自定義規則以防止可能有問題的查詢進入您的資料庫。
    • 查詢killer – 終止花費很長時間才能傳回資料的查詢。
    • 表級ACL – 根據所連接配接的使用者為表指定通路控制清單(ACL)。
  • 監控方式
    • 性能分析工具使您可以監視,診斷和分析資料庫性能。
  • 拓撲管理工具
    • master管理工具(句柄修複)
    • 基于Web的管理GUI
    • 設計用于多個資料中心/區域
  • 分片
    • 幾乎無縫的動态重新分片
    • 垂直和水準分片支援
    • 多種分片方案,可以插入自定義方案

與其他存儲選擇的對比

Vitess vs. Vanilla MySQL

Vanilla MySQL Vitess
每個 MySql 連接配接都有一個記憶體開銷,其範圍介于 256KB 到幾乎 3MB 之間,這取決于你所使用的 MySql 版本。随着你的使用者群的增長,你需要增加記憶體以支撐增加的那些連接配接,但增加記憶體無助于提高查詢速度。此外,在擷取這些連接配接的時候還有大量的 CPU 開銷。Vitess 基于 BSON 的協定建立非常輕量級僅約 32KB 的連接配接。Vitess 的連接配接池功能使用了 Go 語言的卓越的并發支援将這些輕量級的連接配接映射到一個小型的 MySql 連接配接池。是以,Vitess 可以很容易地同時處理數千個連接配接 每個 MySql 連接配接都有一個記憶體開銷,其範圍介于 256KB 到幾乎 3MB 之間,這取決于你所使用的 MySql 版本。随着你的使用者群的增長,你需要增加記憶體以支撐增加的那些連接配接,但增加記憶體無助于提高查詢速度。此外,在擷取這些連接配接的時候還有大量的 CPU 開銷。Vitess 基于 BSON 的協定建立非常輕量級僅約 32KB 的連接配接。Vitess 的連接配接池功能使用了 Go 語言的卓越的并發支援将這些輕量級的連接配接映射到一個小型的 MySql 連接配接池。是以,Vitess 可以很容易地同時處理數千個連接配接。
低效的寫查詢,比如一些沒有設定一個限制的寫查詢,将會對所有使用者的資料庫性能産生負面影響 Vitess 所用的 SQL 解析器使用了一組可配置的規則對可能會降低資料庫性能的查詢進行重寫。
分片是一個對你的資料進行分區來提高可擴充性和性能的過程。MySql 不支援分片,要求你自己去編寫分片代碼并在你自己的應用程式中嵌入分片邏輯 Vitess 使用基于範圍的分片。它同時支援水準和垂直的重新切分,完成大多數資料的轉換隻需要僅僅幾秒鐘的隻讀的停機時間。Vitess 甚至可以适應你現有的一個自定義分片方案。
MySql 叢集為保證可用性采用的是主從複制,有一個主資料庫和幾個副本資料庫。主庫當機,某台從庫将成為新的主庫。這個要求你去管理資料庫的生命周期并将目前的系統狀态傳達給你自己的應用程式。 Vitess 幫你管理資料庫的生命周期。它支援并自動應對各種場景,包括主庫故障轉移以及資料備份。
MySQL群集可以具有針對不同工作負載的自定義資料庫配置,例如用于寫入的主資料庫,用于Web用戶端的快速隻讀副本,用于批處理作業的較慢隻讀副本等等。如果資料庫具有水準分片,則将對每個分片重複進行設定,并且應用程式需要内置邏輯才能知道如何查找正确的資料庫 Vitess 使用一個資料存儲一緻性的拓撲支援,比如 etcd 或者 ZooKeeper。這也就意味着叢集視圖始終是最新的而且對于不同的用戶端也能始終保證其一緻性。Vitess 還提供了一個高效地将查詢路由給最适合的 MySql 執行個體的代理。

Vitess vs. NoSQL

NoSQL Vitess
NoSQL 資料庫不定義資料庫表之間的關系,并且僅支援 SQL 語言的一個子集 Vitess 并不是一個簡單的鍵值存儲。它支援複雜的查詢語句,比如 where 子句、聯接查詢、聚集功能等等。

NoSQL 資料庫不支援事務 | Vitess 支援單個分片内的事務。Vitess 團隊也正在探索使用兩階段送出支援跨分片事務的可行性。

NoSQL 解決方案擁有定制的 API,這将導緻定制的架構、應用程式和工具 | Vitess 僅添加了極小的變化到 MySql,一個絕大多數的人們都已經習慣使用的資料庫。

相比 MySql 來講,NoSQL 提供的資料庫索引支援是有限的 | Vitess 允許你使用 MySql 的所有索引功能來優化查詢性能。

架構

Vitess平台由許多伺服器程序,指令行實用程式和基于Web的實用程式組成,并由一緻的中繼資料存儲提供支援。

根據您應用程式的目前狀态,您可以通過許多不同的流程來實作完整的Vitess實作。例如,如果要從頭開始建構服務,那麼使用Vitess的第一步就是定義資料庫拓撲。但是,如果需要擴充現有資料庫,則可能首先要部署連接配接代理。

Vitess工具和伺服器旨在為您提供幫助,無論您是從完整的資料庫團隊開始,還是從小規模擴充到随時間擴充。對于較小的實作,vttablet功能(例如連接配接池和查詢重寫)可幫助您從現有硬體中獲得更多收益。然後,Vitess的自動化工具為大型實施提供了更多好處。

下圖說明了Vitess的元件:

雲原生資料庫vitess簡介vitess簡介功能與其他存儲選擇的對比架構概念總結

概念

cell

是一組伺服器和網絡基礎設施中并置的區域,并且和其他cell故障隔離 它通常是完整的資料中心或資料中心的子集,有時稱為區域或可用性區域。Vitess可以優雅地處理cell級别的故障,例如當cell被切斷網絡時。

Vitess實作中的每個cell都有一個本地拓撲服務,該服務托管在該cell中。拓撲服務在其單元格中包含有關Vitess數位闆的大多數資訊。這使cell可以拆卸并重建為一個單元。

Vitess限制了資料和中繼資料的跨cell流量。雖然也可以将讀取流量路由到各個單元可能有用,但Vites目前僅服務于本地cell的讀取。必要時,寫入将跨cell到達該分片的主檔案所在的位置。

keyspace

一個keyspace是一個邏輯資料庫。如果您使用分片,則keyspace将映射到多個MySQL資料庫。如果您不使用分片,則keyspace将直接映射到MySQL資料庫名稱。無論哪種情況,從應用程式的角度來看,keyspace都顯示為單個資料庫。

從keyspace讀取資料就像從MySQL資料庫讀取資料一樣。但是,根據讀取操作的一緻性要求,Vitess可能會從主資料庫或副本中擷取資料。通過将每個查詢路由到适當的資料庫,Vitess允許将代碼構造為好像從單個MySQL資料庫讀取一樣。

Keyspace Graph

通過keyspace graph,Vitess可以決定對于給定的keyspace,cell,tablet使用哪一組分片。

Keyspace id

密鑰空間ID是用确定給定行在哪個分片上

Replication Graph

Replication Graph辨別了主資料庫及其各自的副本之間的關系。在主伺服器故障轉移期間,Replication Graph使Vitess可以将所有現有副本指向新指定的主資料庫,以便複制可以繼續

shard

keyspace是Keyspace的拆分,一個分片通常包含一個MySQL主伺服器和許多MySQL從伺服器。分片中的每個MySQL執行個體都具有相同的資料,從節點可以為隻讀流量提供服務,執行長時間的資料分析或管理任務

  • 重新分片

Vitess支援動态重新分片,其中動态群集上的分片數量可以更改。這可以将一個或多個碎片分成較小的碎片,也可以将相鄰的碎片合并成較大的碎片。在動态重新分片期間,源分片中的資料将被複制到目标分片中,以跟上複制的步伐,然後與原始分片進行比較以確定資料完整性。然後,将實時服務基礎結構轉移到目标分片,并删除源分片。

Tablet

Tablet是 mysqld和vttablet的組合通常運作在同一伺服器,每個Tablet都被配置設定一個Tablet 類型,用于指定其目前的執行角色

類型:

  • master - 一個Tablet 副本,目前正好是其分片的MySQL master。
  • replica - 一個MySQL slave,有資格晉升為master。通常,這些保留用于服務實時的,面向使用者的請求(例如從網站的前端)。
  • rdonly - 無法更新為master的 MySQL slave 。通常,它們用于背景處理作業,例如進行備份,将資料轉儲到其他系統, 繁重的分析查詢,MapReduce和重新分片。
  • backup - Tablet已在一緻的快照處停止了複制,是以可以為其分片上載新的備份。完成後,它将恢複複制并傳回其先前的類型。
  • restore -一種Tablet,沒有資料啟動,并且正在從最新的備份中恢複自身。完成後,它将在備份的GTID位置開始複制,并成為副本或rdonly。
  • drained -由Vitess背景程序保留的數位闆(例如用于重新分片的rdonly數位闆)。

Topology Service(也稱為TOPO或鎖定服務)

該拓撲服務是一組不同的伺服器上運作的後端程序。這些伺服器存儲拓撲資料并提供分布式鎖定服務。Vites使用一個插件系統來支援各種後端來存儲拓撲資料,這些後端被假定提供了分布式的,一緻的鍵值存儲。預設情況下,我們的本地示例使用ZooKeeper插件,而Kubernetes示例使用etcd。

存在拓撲服務的原因有幾個:

  • 它使tablets之間可以作為一個群集進行協調。
  • 它使Vitess能夠發現數位闆,是以知道将查詢路由到何處。
  • 它存儲資料庫管理者提供的Vitess配置,叢集中許多不同伺服器都需要該配置,并且在伺服器重新啟動之間必須保持這種配置。
  • 一個Vitess群集在每個tablets中都有一個全局拓撲服務和一個本地拓撲服務。由于cluster是一個重載術語,并且一個Vitess叢集通過每個叢集都有其自己的全局拓撲服務這一事實而與另一個叢集有所差別,是以我們将每個Vitess叢集稱為對流層。

全局拓撲

全局拓撲服務存儲不經常更改的Vites範圍的資料。具體來說,它包含有關鍵空間和分片以及每個分片的主tablets别名的資料。

全局拓撲用于某些操作,包括重定親和重新分片。通過設計,全局拓撲服務使用不多。

為了終止任何殘存的cell,全局拓撲服務應在多個cell中具有節點,并具有足夠的數量以在發生cell故障時維持仲裁。

局部拓撲

每個本地拓撲都包含與其自己的celll有關的資訊。具體來說,它包含有關cell中的tablets的資料,該cell的鍵空間圖以及該單元格的複制圖。

Vitess必須可以使用本地拓撲服務來發現數位闆并在數位闆進出時調整路由。但是,在穩定狀态下為查詢提供服務的關鍵路徑中,沒有對拓撲服務進行任何調用。這意味着在拓撲暫時不可用期間仍可提供查詢。

vschema

一個VSchema允許您描述資料是如何被keyspaces和shard組織。此資訊用于路由查詢,以及在重新分片操作期間。

VSTREAM

VStream是位于VTGate上的變更通知系統。可以将VStream視為自定義為在Vitess中使用的UpdateStream。與更新流一樣,VTTablets可以訂閱VStream來接收事件。VStream可以從VStreamer中提取事件,後者又從Binlog中提取事件。這将允許高效執行VReplication之類的過程,在此過程中,訂戶可以間接從binlog接收和應用事件。使用者可以将過濾規則應用于VStream,以擷取有關引擎蓋下給定鍵空間,分片和位置發生的情況的深入資訊。

VTGate

VTGate是一種輕量級的代理伺服器,可将流量路由到正确的VTTablet伺服器,并将合并結果傳回給用戶端。它說MySQL協定和Vitess gRPC協定。是以,您的應用程式可以連接配接到VTGate,就像它是MySQL Server一樣。

在将查詢路由到适當的VTTablet伺服器時,VTGate會考慮分片方案,所需的延遲以及表及其底層MySQL執行個體的可用性。

vtctl

vtctl是用于管理Vitess群集的指令行工具。它允許人員或應用程式輕松地與Vitess實作互動。使用vtctl,您可以辨別主資料庫和副本資料庫,建立表,啟動故障轉移,執行分片(和重新分片)操作,等等。

當vtctl執行操作時,它會根據需要更新鎖伺服器。其他Vitess伺服器會觀察到這些更改并做出相應的反應。例如,如果您使用vtctl故障轉移到新的master資料庫,則vtgate會看到更改并将将來的寫操作定向到新的master。

vtctld

vtctld是一個HTTP伺服器,使您可以浏覽存儲在鎖伺服器中的資訊。這對于故障排除或擷取伺服器及其目前狀态的進階概述很有用。

vtworker

vtworker承載長時間運作的程序。它支援插件架構并提供庫,是以您可以輕松選擇要使用的平闆電腦。插件可用于以下類型的作業:

重新分片不同的作業會在分片拆分和聯接期間檢查資料完整性 垂直拆分不同作業在垂直拆分和聯接期間檢查資料完整性 vtworker還可讓您輕松添加其他驗證過程。例如,如果一個鍵空間中的索引表引用了另一個鍵空間中的資料, 則可以執行片劑内部完整性檢查以驗證類似外鍵的關系或跨表完整性檢查

總結

vitess是一個基于MySQL的雲原生資料庫,自身屏蔽了分庫分表的複雜性,使應用能夠直接使用無需特殊配置,與原生MySQL高度相容,目前已經從CNCF畢業,相信以後會有更多的使用者使用vitess.