
Vitess,作為海外最為知名的分庫分表産品,一直以來在國内聲音不多。近期抽空了解下這個産品,特分享出來。本文部分内容取自Vitess官網https://vitess.io。
1. Vitess概述
人生基本上就是兩件事,選題和解題。最好的人生是在每個關鍵點上,既選對題,又解好題。人生最大的痛苦在于解對了題,但選錯了題,而且還不知道自己選錯了題。正如人生最大的遺憾就是,不是你不行,而是你本可以。
Vitess是一個用于部署、擴充和管理大型開源資料庫執行個體叢集的資料庫解決方案。它目前支援MySQL、Percona和MariaDB。它的架構設計使其在公共或私有雲架構中運作時與在專用硬體上運作時一樣有效。它結合并擴充了許多重要的SQL功能和NoSQL資料庫的可擴充性。
1).使用場景
-
資料分片
通過允許分片來縮放SQL資料庫,同時将應用程式更改保持在最低限度。
-
資料遷移
從裸金屬遷移到私有雲或公共雲。
-
管理執行個體
部署和管理大量SQL資料庫執行個體。
2).技術特點
❖ 性能優化
-
連接配接池
資料庫連接配接池能力,滿足支援大量前端應用連接配接。
-
查詢結果重用
正在運作的查詢,對于後續完全相同的請求将重用同一查詢的結果。
-
事務管理器
限制并發事務的數量并管理逾時,以優化整體吞吐量。
-
行緩存
對于需根據主鍵随機通路的字段查詢,維護一個基于行的緩存(使用 memcached),可優化 OLTP 工作負載非常有用。
❖ 運作防護
-
查詢重寫和淨化
添加限制并防止不确定性的更新。
-
查詢黑名單
自定義規則,防止潛在有問題的查詢送出到資料庫。
-
殺掉查詢
終止運作需要很長時間才能傳回資料的查詢。
-
表級别 ACLs
根據連接配接使用者為表定義通路控制清單(ACLs)。
❖ 監控診斷
-
性能分析
提供對資料庫性能進行監控、診斷和分析的工具。
❖ 系統運維
-
叢集/拓撲管理工具
提供基于 Web 的的叢集管理工具,可顯示整體拓撲。上述能力支援面向多個資料中心/區域的場合。
❖ 海量存儲
-
分片能力
支援垂直、水準分片能力,支援自定義分片政策,支援線上重分片能力。
3). 核心優勢
-
分片管理
MySQL本身并不提供拆分分片功能,但是您的業務資料量增大到一定程度是您是需要增加叢集的。Vitess提供線上拆分功能,隻需要很少的時間就完成新叢集的切換,無需您在應用程式中添加任何拆分邏輯。
-
連接配接池
Vitess避免了MySQL連接配接的高記憶體開銷。Vitess伺服器輕松地一次處理數千個連接配接。
-
工作流
Vitess會跟蹤有關叢集配置的所有中繼資料,以便叢集拓撲始終是最新的,對不同的用戶端保持一緻。
-
性能
Vitess自動重寫對資料庫性能有損害的查詢。它還使用緩存機制來調節查詢,并防止重複查詢同時到達您的資料庫
-
擴充性
Vitess集Mysql資料庫的很多重要特性和NoSQL資料庫的可擴充性于一體。其内建拆分分片功能使您能夠對您的MySQL資料庫叢集無限水準擴充,同時無需為應用添加分片邏輯
-
管理
Vitess可以支援自動處理主故障轉移和備份等功能。它使用分布式中繼資料服務來跟蹤和管理伺服器,使您的應用程式無需關心資料庫拓撲變化。
4).方案對比
- 與MySQL對比
- 與NoSQL對比
2. Vitess基本架構
人生基本上就是兩件事,選題和解題。最好的人生是在每個關鍵點上,既選對題,又解好題。人生最大的痛苦在于解對了題,但選錯了題,而且還不知道自己選錯了題。正如人生最大的遺憾就是,不是你不行,而是你本可以。
Vitess 平台由若幹伺服器程序、指令行工具和基于 web 的工具組成,具備一緻性中繼資料存儲支援。根據使用者應用程式的現狀,可以選擇不同的方式接入Vitess。如果正在從頭建構一個服務,應該起始于定義資料庫拓撲;如果需要對現有資料庫進行擴充,那首先需要部署一個連接配接代理。無論資料庫叢集規模大小,Vitess 工具和伺服器都旨在提供幫助。對于較小的實作,VTTablet 的一些特性諸如連接配接池和行緩存可以幫助更充分利用現有硬體。Vitess 的自動化工具則為大型實作提供額外的好處。
❖ Cell
Cell 是放置一組伺服器和網絡基礎設施的區域,并且與其他Cell做到故障隔離。它通常是一個完整的資料中心或資料中心子集,有時稱為Zone或Availability Zone。Vitess 可以優雅地處理Cell 級故障,例如當一個Cell 斷開網絡時。Vitess 在每個Cell中托管本地拓撲服務。這一服務在Cell中包含Tablet的大部分資訊,這使得Cell能夠被拆除并重建。Vitess 限制資料和中繼資料的跨Cell的流量。雖然其具有将讀取流量路由到單個Cell的能力,但 Vitess 目前僅提供來自本地Cell的讀取。如有必要,Vitess可跨Cell寫入。
❖ Execution Plans
Vitess 在 VTGate 和 VTablet 層解析查詢,評估執行查詢的最佳方法,進而生成查詢執行計劃。Vitess 優化政策之一是将盡可能多的工作下推到底層 MySQL 執行個體。當這不可能時,Vitess 将使用從多個MySQL收集輸入并合并結果以生成正确查詢結果。
-
評估模式
一個執行計劃由操作符組成,每個操作符執行一個特定的工作。整個執行計劃是由一組樹形結構的操作符組成,每個操作符為樹中的一個節點。每個操作符将零或多行作為輸入,并産生零或多行作為輸出。這意味着一個操作的輸出成為下一個操作的輸入。連接配接樹中兩個分支的操作符組合來自兩個傳入流的輸入并産生單個輸出。執行計劃的評估從樹的葉子節點開始。葉子節點從 VTablet 中提取資料,并且在某些情況下還能夠在本地評估表達式值。每個葉子節點不會有來自其他操作符的輸入,并且将它們産生的任何節點通過管道傳輸到其父節點。然後,父節點将通過管道将節點傳送到它們的父節點,一直到根節點。根節點産生查詢的最終結果并将結果傳遞給使用者。
-
檢視計劃
可通過浏覽/queryz端點,在 VTGate 級别觀察緩存的執行計劃。從Vitess 6開始,也可通過下面指令來檢視:EXPLAIN FORMAT=vitess <query>.
❖ Keyspace
Keyspace 是一個邏輯資料庫。如果使用分片技術,則keyspace映射到多個 MySQL 資料庫;如果沒使用分片,則keyspace直接映射到 MySQL 資料庫名稱。無論那種情況,從應用側來看,keyspace都顯示為單個資料庫。從 keyspace 讀取資料就像從 MySQL 資料庫讀取資料一樣。但是根據讀取操作的一緻性要求,Vitess 可能會選擇從主資料庫或備資料庫中讀取。
-
Keyspace id
Keyspace ID,就是通常講的分片鍵。基于範圍的分片,是指建立時指定覆寫特定範圍的keyspace ID。使用此方式,可通過用兩個或更多新分片,替換原有分片來拆分。而新分片組合在一起以覆寫keyspace ID 的範圍,而無需移動其他分片中的任何記錄。Keyspace ID本身,是通過對資料中某些列的函數計算所得。Vitess 允許從各種函數 ( vindexes ) 中進行選擇來執行此映射。這使你可以選擇正确的方法來實作資料在分片之間的最佳分布。
❖ MoveTables
MoveTables 是一種基于 VReplication 的新工作流。它使您能夠在 Keyspace 之間重新定位表,進而在不停機的情況下重新定位實體 MySQL 執行個體。
-
識别候選表
建議将需要互相關聯的表保留在同一 Keyspace 中,是以 MoveTables 操作的典型候選對象是一組邏輯上組合在一起或以其他方式隔離的表。如果有多組表作為候選,移動最有意義可能取決于環境的具體情況。例如,一個更大的表将需要更多的時間來移動,但這樣做你可能能夠利用額外的或更新的硬體,這些硬體在需要執行額外的操作(如分片)之前有更多的空間。同樣,以更頻繁的速率更新的表可能會增加移動時間。
-
對生産流量影響
在内部,MoveTables 操作由表副本和對表所做的所有更改的訂閱組成。Vitess 使用批處理來提高表複制和應用訂閱更改的性能,但應該期望修改率較低的表移動得更快。在主動移動過程中,資料是從副本而不是主伺服器複制的。這有助于確定最小的生産流量影響。在MoveTables 中SwitchWrites 操作階段,Vitess 可能會暫時不可用。這種不可用性通常是幾秒鐘,但如果系統從主副本到副本的複制延遲很高,則會更高。
❖ Query Rewrite
Vitess 努力營造一種使用者與單個資料庫連接配接的錯覺。實際上,單個查詢可能與多個資料庫互動,并且可能使用多個連接配接到同一資料庫。
-
查詢分解
具有跨分片連接配接的複雜查詢,可能需要先從保持 VIndex 查找表的 Tablet 中擷取資訊,然後使用此資訊查詢兩個不同的分片以擷取更多資料,并将傳入的結果連接配接到使用者接收的單個結果中。MySQL 擷取的查詢通常隻是原始查詢的一部分,最終結果将在 VTGate 級别組裝。
-
連接配接池
當 Tablet 與 MySQL 對話以代表使用者執行查詢時,它不會為每個使用者使用專用連接配接,而是會在使用者之間共享底層連接配接。這意味着在會話中存儲任何狀态都是不安全的,因為無法确定它是否會繼續在同一連接配接上執行查詢,并且無法确定此連接配接稍後是否會被其他使用者使用。
❖ Replication Map
Vitess 通過複制圖來識别主資料庫和它們各自的副本之間的關系。在故障轉移期間,複制圖使 Vitess 能夠将所有現有副本指向新指定的主資料庫,以便繼續複制。
❖ Shard
分片是一個 Keyspace 的子集。一個 Keyspace 将包含一個或多個分片。一個分片通常包含一個 MySQL 主副本和許多 MySQL 副本。分片中的每個 MySQL 執行個體都具有相同的資料。副本可以提供隻讀流量(具有最終的一緻性保證)、執行長時間運作的資料分析查詢或執行管理任務(備份、恢複、差異等)。
-
Reshard
Vitess 支援重新分片,其中在實時叢集上更改分片的數量。這可以是将一個或多個分片拆分為更小的部分,或者将相鄰的分片合并為更大的部分。在重新分片期間,源分片中的資料被複制到目标分片中,然後與原始分片進行比較以確定資料完整性,最後将實時服務基礎設施轉移到目标分片,并删除源分片。
❖ Tablet
Tablet 是mysqld過程和相應的vttablet過程的組合,通常運作在同一機器上。每個 Tablet 都具備對應的角色。查詢通過 VTGate 伺服器路由到Tablet。Tablet 劃分角色如下:
-
primary
Tablet對應的MySQL角色是主庫。
-
replica
Tablet對應的MySQL角色是從庫,且該從庫有資格提升為主。這一角色一般服務面向實時隻讀查詢的通路。
-
rdonly
Tablet對應的MySQL角色是從庫,且該從庫無法提升為主。這一角色通常用于背景處理作業,例如備份、将資料轉儲到其他系統、大量分析查詢、MapReduce 和重新分片。
-
backup
Tablet對應的MySQL角色是從庫,且因一緻性快照而停止複制,可将其分片上傳備份。完成後,它将恢複複制并傳回到以前的類型。
-
restore
啟動時 Tablet 對應MySQL沒有資料,正在從最新備份中恢複。完成後,它将進入複制狀态,并且角色變為replica或rdonly。
-
drained
為Vitess 背景程序保留的Tablet,例如用于重分片等需求。
❖ Topology Service
該拓撲服務是一組在不同伺服器上運作的後端程序組成。這些伺服器存儲全局拓撲資料,并提供分布式鎖定服務。Vitess 使用插件系統來支援存儲拓撲資料的各種實作,預設的拓撲服務存儲插件是etcd2。拓撲服務的存在有幾個原因:
- 協調叢集内 Tablets,發現Tablet,并感覺将查詢路由到哪裡。
- 存儲叢集中不同伺服器上的 Vitess 配置,并且必須在伺服器重新啟動之間保持不變。
一個 Vitess 叢集有一個全局拓撲服務,每個單元有一個本地拓撲服務。
-
Global Topology
全局拓撲服務存儲不經常更改的 Vitess 資料。具體來說,它包含有 Keyspace 和 Shard 的資料以及每個 Shard 的主要 Tablet。全局拓撲用于一些操作,包括重新選主、重新分片。為了在任何單個單元發生故障時幸免于難,全局拓撲服務應該在多個單元中具有節點,以便在單元發生故障時維持仲裁。
-
Local Topology
每個本地拓撲都包含與其自身 Cell 相關的資訊。具體來說,它包含有關 Cell 中 Tablet 的資料、該 Cell 的 Keyspace 以及該Cell的複制圖。本地拓撲服務必須可供 Vitess 使用以發現Tablet 并在 Tablet 變化時調整路由。但是,在穩定狀态下提供查詢服務的關鍵路徑中不會調用拓撲服務。這意味着在拓撲暫時不可用期間仍會提供查詢服務。
❖ VSchema
一個 VSchema 用來描述資料是如何Keyspace和Shard内組織。此資訊用于路由查詢,也用于重新分片操作。對于 Keyspace,可以指定它是否被分片。對于分片的 Keyspace,可以為每個表指定 vindexes 清單。
-
序列
Vitess 支援序列生成器,可用于生成新的 id,其工作方式類似于 MySQL 自動增量列。VSchema 允許将表列關聯到序清單。如果沒有為這樣的列指定值,那麼 VTGate 将知道使用序清單為它生成一個新值。
❖ VStream
VStream 是一種可通過 VTGate 通路的更改通知服務。VStream 的目的是從 Vitess 叢集的底層 MySQL 分片提供與 MySQL 二進制日志等效的資訊。gRPC 用戶端,包括 Vitess 元件,如 VTablets,可以訂閱 VStream 以接收來自其他分片的更改事件。VStream從VTTablet執行個體上的一個或多個VStreamer執行個體拉取事件,後者又從底層MySQL執行個體的二進制日志拉取事件。這允許有效執行諸如 VReplication 之類的功能,其中訂閱者可以從一個或多個 MySQL 執行個體分片的二進制日志中間接接收事件,然後将其應用于目标執行個體。使用者可以利用 VStream 擷取有關給定 Vitess Keyspace、Shard和位置的資料更改事件的深入資訊。工作原理可參考如下:
❖ vtctl
vtctl是一個指令行工具,用于管理 Vitess 叢集。它既可用作獨立工具 ( vtctl),也可用作用戶端-伺服器(vtctlclient與 結合使用vtctld)。建議使用用戶端-伺服器,因為它在遠端使用用戶端時提供了額外的安全層。使用 vtctl,可以識别主資料庫和副本資料庫、建立表、啟動故障轉移、執行重新分片操作等。随着 vtctl 執行操作,拓撲服務會根據需要進行更新。其他 Vitess 伺服器會觀察這些變化并做出相應的反應。例如,如果您使用 vtctl 故障轉移到新的主資料庫,vtgate 會看到更改并将未來的寫入操作定向到新的主資料庫。
❖ vtctld
vtctld是一個 HTTP 伺服器,可浏覽存儲在拓撲服務中的資訊。它對于故障排除或擷取伺服器及其目前狀态的進階概述很有用。vtctld還充當vtctlclient連接配接的伺服器。
❖ VTGate
VTGate 是一個輕量級的代理伺服器,它可以将流量路由到正确的 VTTablet 伺服器并将合并的結果傳回給用戶端。它同時使用 MySQL 協定和 Vitess gRPC 協定。是以,應用程式可以像連接配接 MySQL 伺服器一樣連接配接到 VTGate。在将查詢路由到适當的 VTablet 伺服器時,VTGate 會考慮分片方案、所需的延遲以及表及其底層 MySQL 執行個體的可用性。
3. Vitess産品理念
人生基本上就是兩件事,選題和解題。最好的人生是在每個關鍵點上,既選對題,又解好題。人生最大的痛苦在于解對了題,但選錯了題,而且還不知道自己選錯了題。正如人生最大的遺憾就是,不是你不行,而是你本可以。
1). 可擴充理念
Vitess的産品理念,是将資料庫分片,将其分解成很小的部分,很容易将它們分解到足以容納一台機器的程度。在行業中,每個主機隻運作一個MySQL執行個體是很常見的。Vitess建議将執行個體分解成可管理的塊(每個MySQL伺服器250GB),并且不要回避每個主機運作多個執行個體。淨資源使用量将大緻相同。但是當MySQL執行個體很小時,可管理性會大大提高。跟蹤端口和分離MySQL執行個體的路徑會很複雜。然而,一旦越過這個障礙,其他一切都變得簡單了。拆分為更小粒度後,需要擔心的鎖争用更少,複制更快,停機對生産的影響變得更小,備份和恢複運作更快,并改善資源使用。
2). 複制代替持久性
傳統意義上,資料被重新整理到磁盤時就将其視為持久的。Vitess 更為推薦的耐久性方法是通過将資料複制到多台機器甚至多個地理位置來實作的。這種形式的耐久性解決了對裝置故障和災難的擔憂。Vitess中的許多工作流都是根據這種方法建構的。例如,強烈建議打開半同步複制。這允許Vitess在主資料庫崩潰時故障轉移到新副本,而不會丢失資料。依賴複制還允許放松一些基于磁盤的耐久性設定。例如,可以關閉sync_binlog,這大大減少了磁盤的IOPS數量,進而提高了有效吞吐量。
3). 有取舍一緻性
❖ 非一緻性讀
在 Vitess 中跨分片讀取可能彼此不一緻。在制定分片決策中,應該試圖盡量減少這種情況,因為跨分片讀取更昂貴。如果存在可以容忍稍顯陳舊的資料,則可将查詢發送到replica角色的 Tablet 處理;對于OLAP工作負載,則可發送到rdonly角色的 Tablet 處理。這一方式可提供更為靈活的縮放讀取流量,并可按地理位置分布它們。這種權衡允許以陳舊或可能不一緻的讀取為代價獲得更好的吞吐量,因為随着資料的變化(可能在不同的分片上有不同的滞後),讀取可能會落後于主分片。為了緩解這種情況,VTGate伺服器能夠監控副本滞後,并且可以配置為避免來自滞後超過X秒的執行個體的資料。
-
REPLICA/RDONLY read
伺服器可以按地理位置縮放。本地讀取速度很快,但可能會因副本延遲而失效。
-
PRIMARY read
每個分片隻有一個全局主要讀取。來自遠端位置的讀取将受制于網絡延遲和可靠性,但資料将是最新的(寫入後讀取一緻性)。隔離級别READ_COMMITTED。
-
PRIMARY transaction
它們顯示與主讀取相同的屬性。但是,可以為單個分片獲得REPEATABLE_READ一緻性和ACID寫入。跨分片原子事務的支援正在進行中。
❖ 快照級讀
對于真正的快照,查詢必須在事務中發送到主伺服器。為了寫入後讀取的一緻性,從主伺服器讀取而不使用事務就足夠了。
❖ 分布式事務
在“盡最大努力模式”中,跨分片事務可能會在中間失敗,并導緻部分送出。可以改為使用“2PC模式”事務,為提供分布式原子保證。然而,選擇此選項會增加大約50%的寫入成本。單個分片事務繼續保持ACID,就像MySQL支援它一樣。事務支援原子性,支援以下級别:
- SINGLE:禁止多db事務。
- MULTI:盡最大努力送出的多資料庫事務。
- TWOPC:具有2PC送出的多資料庫事務
4). 高可用性
Vitess與Orchestrator內建,Orchestrator能夠在故障檢測後幾秒鐘内執行到新主伺服器的故障轉移。這對于大多數應用程式來說通常已經足夠了。