Vitess 介紹

Vitess 是一套基於 MySQL 或 MariaDB 的叢集式資料庫系統,並且提供 Sharding 的概念達到水平擴展的機制。
Vitess 採用單一端口的方式,使用者僅需透過單一端口進行資料庫的寫入,讀取或刪除行為,不必在意底層資料庫如何處理該行為,就能達到資料的分散儲存效果。
Vitess 目前已經從 CNCF 專案中畢業,已有許多世界級大廠使用,如 Youtube, slack, GitHub… 等等。

官方文件中提到在選擇 MySQL 或 MariaDB 時,建議採用 MySQL 並且版本為 5.7。若要採用 MariaDB 則需要 10.0+

特色

  • 可擴展性:Vitess 整合 MySQL 多項重要的特點,提供開發者不必在應用程式中寫入 Shard 邏輯就能實作像是 NoSQL 的可擴展性
  • 效能優化:Vitess 提供的 Cache 機制來處理重複的 Query 行為以提升整體資料庫查詢效能
  • 可管理性:Vitess 提供主動與被動處理 Master 故障的問題排除與備份功能
  • 連線池:Vitess 改善 MySQL 連線的高成本,以提供簡易的連線機制可同時提供上千個連線
  • Shard 管理:MySQL 不提供 Shard 概念,但是若資料庫規模逐漸擴大則可能需要透過 Shard 來進行多台主機的資料分片儲存,以提供整體讀寫效能

專有名詞

Cell

可視為一個 Zone 的概念。一個 Cell 會包含一台或一台以上的伺服器與一整個網路架構,並且每個 Cell 都是獨立的個體,彼此間是隔離的環境,可以比擬成一個資料中心或者一個群集的資料中心。

Keyspace

Keyspace 是一個虛擬的資料庫邏輯,可以分成兩種不同的情境來討論。第一種若採用 Sharding,則一個 Keyspace 底層會對應多個資料庫行程(process),第二種若沒有採用 Sharding,則一個 Keyspace 底層僅對應一個資料庫行程。但無論如何,從應用程的角度看來不管上述兩種情境下,都只會有一個單一入口。
因此應用程式取得資料就像是從一個資料庫讀取資料,不必理會底層如何處理這個讀取行為。但因為需要保持資料讀取一致性的情況下,Vitess 會由 Master 或 Raplicas 取得資料以提供呼叫端。對於程式開發者而言可以無痛地將原本呼叫 MySQL 的 Query 直接在 Vitess 上使用。

Shard

Shard 是單一個 Keyspace 的一部份,一個 Shard 通常會包含一個 Master 與多個 Replicas,並且每個 Shard 內的 MySQL 資料會是一致的。Replicas 僅提供 Read 而不提供 Write 功能,但有時候也會因為一些情況扮演不同的角色,如當前資料備份則需更改為 Backup,或當有新的 MySQL 啟動時需先進行資料恢復則會更改為 Restore…等

Shard 命名有一套規則:

  • 一個數字範圍區間,其中左邊數字是包含的,而右邊數字不包含
  • 數字是一個十六進制碼
  • 採用 “-“ 符號進行左右兩數字切割
  • -80 == 00-80 == 0000-8000 == 000000-8000000
  • 80- != 80-FF
  • 80-FF == 8000-FF00

Vitess 也提供 Resharding 功能,提供已上線的 Shard 進行動態調整。在 Redharding 過程中,資料會由來源 Shard 複製到目的 Shard,並且可以確保來源與目的的資料一致性,最後將新的 Query 引導至目的 Shard 後將來源 Shard 移除。

VTTablet

VTTablet 通常會與一個 MySQL 行程共同存在於一台實體機器中,每個 VTTablet 都會扮演以下的其中一種角色,處理不同的工作項目:

Master

負責的工作項目與 Replica 雷同,但 Master 具備處理 Write 相關的 Query 操作。並且每個 Shard 都須包含一個以上的 Master 才能正常的提供服務

Replica

負責同步當前的資料與提供 Read 的 Query 操作,在 Master 發生故障時可以透過指定方式晉升為新的 Master 讓服務可以繼續正常運作

RdOnly

負責同步當前的資料與提供 Read 的 Query 操作,但是無法像 Replica 能晉升為新的 Master。除此之外能提供一些背景的處理,如資料備份, 資料同步至其他儲存系統, Resharding…等等

Backup

負責將當前資料進行快照,並將其 MySQL 行程停止,並將資料的快照儲存至後端儲存系統中,如 NFS, Ceph…等等。完成備份後將其角色切換為原本的 Replica 或 RdOnly 並且啟動 MySQL 行程繼續提供服務

Restore

當一個 Tablet 啟動時不包含資料,則會在最新的備份中進行資料復原,當其完成資料復原後,則會更改為 Replica 或 RdOnly 角色

Topology Service

Topology Service 是 Vitess 用來儲存當前拓樸資料的分散式儲存系統,當前可支援的有 etcd, zookeeper, k8s…等等,預設採用 etcd

Topology Service 的存在目的如下:

  • 提供叢集間的 tablet 可以彼此相互通訊與協調
  • 讓 Vitess 知道 tablet 的狀態以提供轉發 Query 使用
  • 儲存 Vitess 相關的配置

每個 Vitess 叢集都會包含一個 Global Topology 與每個 Cell 包含一個 Local Topology

Global Topology

Global Topology 負責儲存整個 Vitess 不會被頻繁被更動的資料,像是 Keyspaces, shards 與每個 Shard 的 Master tablet 資訊等

Global Topology 通常運用情境不多,但如 Reparenting 或 Resharding 才會被使用

為了防止單一 Cell 發生故障的情形下,Global Topology 應該被儲存在不同的 Cell 的節點中,以防止單一個 Cell 發生故障而導致影響整個 Vitess 的運作

Local Topology

每個 Cell 通常會儲存自己的 Local Topology,像是 Cell 本身的 Tablets, Keyspace Graph, Replication Graph..等等

vtctl

vtctl 是一個 command-line 的 Vitess 叢集管理工具,提供了識別 Master 與 Replicas 資料庫的功能, 建立 Tablet, 故障處理或 Resharding 等等

vtctld

vtctld 是一個 HTTP Server,並且提供查看 Topology 服務的資訊,在故障排除或想了解當前叢集狀態都可提供有幫助的訊息

VTGate

VTGate 是一個輕量的 Proxy 服務,負責將使用者請求轉發至正確的 VTTablet 進行處理,並將結果回傳給使用者。
VTGate 同時提供 MySQL 與 gRPC 兩種 Protocol,應用程式可以透過連結 VTGate 來發送 Query 取得資訊,就如同對 MySQL 發送 Query 得到相同的體驗

參考

若針對本篇教學有任何疑問或有敘述錯誤的地方,歡迎在底下留言討論唷~

評論

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×