Vitess 學習(1)理解Vitess

Vitess是用於部署,擴展和管理大型MySQL實例集羣的數據庫解決方案。它的架構能夠像在專用硬件上那樣有效地在公共或私有云架構中運行。它結合並擴展了許多重要的MySQL功能和NoSQL數據庫的可擴展性。Vitess能夠幫助你解決如下問題:html

  1. 經過容許您對MySQL數據庫進行分片來擴展MySQL數據庫,同時將應用程序更改保持在最低限度。
  2. 從裸機遷移到私有云或公共雲。
  3. 部署和管理大量的MySQL實例。

Vitess包含使用本地查詢協議的兼容JDBC和Go數據庫驅動程序。此外,它還實現了幾乎與任何其餘語言兼容的MySQL服務器協議。前端

Vitess自2011年以來一直服務於全部YouTube數據庫流量,如今已被許多企業用於生產需求。mysql

特徵

  • 性能git

    • 鏈接池 - 將多個前端應用程序查詢到MySQL鏈接池以優化性能。
    • 查詢重複刪除 - 在飛行中的查詢仍在執行時,重複使用正在進行的查詢結果來查找收到的任何相同請求。
    • 事務管理器 - 限制併發事務的數量並管理期限以優化總體吞吐量。
  • 保護github

    • 查詢重寫和清理 - 添加限制並避免非肯定性更新。
    • 查詢黑名單 - 自定義規則以防止可能存在問題的查詢觸擊您的數據庫。
    • 查詢殺手 - 終止須要很長時間才能返回數據的查詢。
    • 表ACL - 根據鏈接的用戶爲表指定訪問控制列表(ACL)。
  • 監控web

    • 性能分析:使用工具能夠監視,診斷和分析數據庫性能。
    • 查詢流式傳輸 - 使用傳入查詢列表來爲OLAP工做負載提供服務。
    • 更新流 - 服務器對數據庫中更改的行進行流式處理,這能夠用做將更改傳播到其餘數據存儲的機制。
  • 拓撲管理工具sql

    • 主管理工具(手柄重設)
    • 基於Web的管理GUI
    • 設計用於多個數據中心/地區
  • 拆分數據庫

    • 幾乎無縫的動態從新分片
    • 垂直和水平分片支持
    • 多種分片方案,可以插入自定義分片

與其餘存儲選項進行比較

如下各節將Vitess與兩種常見的替代方法進行比較,一個是vanilla MySQL實現和一個NoSQL實現。apache

Vitess vs. Vanilla MySQL

Vitess以幾種方式改進了vanilla MySQL的實現:編程

香草MySQL Vitess
每一個MySQL鏈接的內存開銷都在256KB到3MB之間,具體取決於您使用的是哪一個MySQL版本。隨着用戶羣的增加,您須要添加RAM來支持更多鏈接,但RAM無助於加快查詢速度。另外,與獲取鏈接相關的CPU成本也很高。 Vitess基於gRPC的協議建立了很是輕量級的鏈接。Vitess的鏈接池功能使用Go的併發支持將這些輕量級鏈接映射到一小羣MySQL鏈接。所以,Vitess能夠輕鬆處理數千個鏈接。
編寫很差的查詢(如未設置LIMIT的查詢)可能會對全部用戶的數據庫性能產生負面影響。 Vitess採用SQL解析器,使用一組可配置的規則來重寫可能會損害數據庫性能的查詢。
分區是對數據進行分區以提升可伸縮性和性能的過程。MySQL缺少本地分片支持,要求您編寫分片代碼並在應用程序中嵌入分片邏輯。 Vitess支持各類分片方案。它還能夠將表遷移到不一樣的數據庫中,並擴大或縮小碎片的數量。這些功能是非侵入式執行的,只需幾秒鐘的只讀停機時間便可完成大部分數據轉換。
使用可用性複製的MySQL集羣具備主數據庫和一些副本。若是主人失敗,副本應該成爲新的主人。這要求您管理數據庫生命週期並將當前系統狀態傳達給您的應用程序。 Vitess有助於管理數據庫場景的生命週期。它支持並自動處理各類場景,包括主站故障切換和數據備份。
MySQL羣集能夠爲不一樣的工做負載定製數據庫配置,例如用於寫入的主數據庫,用於Web客戶端的快速只讀副本,批處理做業的較慢只讀副本等等。若是數據庫具備水平分片,則每一個分片都會重複該設置,而且該應用須要插入邏輯以瞭解如何找到正確的數據庫。 Vitess使用由一致數據存儲支持的拓撲,如etcd或ZooKeeper。這意味着羣集視圖始終是最新的,而且對於不一樣的客戶端是一致的。Vitess還提供了一個代理,能夠有效地將查詢路由到最合適的MySQL實例。

Vitess vs. NoSQL

若是您正在考慮NoSQL解決方案,主要是由於擔憂MySQL的可伸縮性,Vitess多是您的應用程序更合適的選擇。雖然NoSQL爲非結構化數據提供了很好的支持,但Vitess仍然提供了NoSQL數據存儲中不具有的一些好處:

NoSQL的 Vitess
NoSQL數據庫不定義數據庫表之間的關係,只支持SQL語言的子集。 Vitess不是一個簡單的鍵值存儲。它支持複雜的查詢語義,如where子句,JOINS,聚合函數等。
NoSQL數據存儲不支持事務。 Vitess支持碎片內的交易。對於跨越多個分片的事務,它容許您選擇啓用2PC。
NoSQL解決方案具備自定義API,可致使定製體系結構,應用程序和工具。 Vitess給MySQL增長了不多的變化,這是大多數人已經習慣使用的數據庫。
與MySQL相比,NoSQL解決方案對數據庫索引提供有限的支持。 Vitess容許您使用MySQL的全部索引功能來優化查詢性能。

建築

Vitess平臺由許多服務器進程,命令行實用程序和基於Web的實用程序組成,並由一致的元數據存儲提供支持。

根據您的應用程序的當前狀態,您能夠經過許多不一樣的流程實現完整的Vitess實施。例如,若是您要從頭開始構建服務,那麼使用Vitess的第一步就是定義數據庫拓撲。可是,若是您須要擴展示有數據庫,則可能首先部署鏈接代理。

Vitess工具和服務器旨在爲您提供幫助,不管您是從一組完整的數據庫開始,仍是從小規模開始,隨着時間的推移開始擴展。對於較小的實現,鏈接池和查詢重寫等vttablet功能可幫助您從現有硬件中得到更多。Vitess的自動化工具爲大型實施提供了額外的好處。

下圖說明了Vitess的組件:

顯示Vitess實施的圖表

拓撲

拓撲服務是一個元數據存儲,其中包含有關運行的服務器,分片方案,並複製圖形信息。該拓撲由一個一致的數據存儲支持。您可使用vtctl(命令行)和vtctld(web)來瀏覽拓撲

在Kubernetes中,數據存儲是etcdVitess源代碼還附帶Apache ZooKeeper支持。

vtgate

vtgate是一個輕型代理服務器,可將流量路由到正確的vttablet(s)並將合併結果返回給客戶端。它是應用程序向其發送查詢的服務器。所以,客戶端能夠很是簡單,由於它只須要可以找到一個vtgate實例。

爲了路由查詢,vtgate考慮了分片方案,所需的延遲以及平板電腦及其基礎MySQL實例的可用性。

vttablet

vttablet是位於MySQL數據庫以前的代理服務器。Vitess實現對每一個MySQL實例都有一個vttablet。

vttablet執行的任務試圖使吞吐量最大化,並保護MySQL免受有害查詢的影響。其功能包括鏈接池,查詢重寫和查詢重複。另外,vttablet執行vtctl啓動的管理任務,並提供用於過濾複製和數據導出的流服務

輕量級的Vitess實現使用vttablet做爲智能鏈接代理,爲單個MySQL數據庫提供查詢服務。經過在MySQL數據庫前運行vttablet並將應用程序更改成使用Vitess客戶端而不是MySQL驅動程序,您的應用程序將受益於vttablet的鏈接池,查詢重寫和查詢重複刪除功能。

vtctl

vtctl是用於管理Vitess集羣的命令行工具。它容許人或應用程序輕鬆地與Vitess實現進行交互。使用vtctl,您能夠識別主數據庫和副本數據庫,建立表,啓動故障轉移,執行分片(和從新分片)操做等等。

當vtctl執行操做時,它根據須要更新鎖服務器。其餘Vitess服務器觀察這些變化並做出相應的反應。例如,若是您使用vtctl故障轉移到新的主數據庫,vtgate會看到更改並將未來的寫操做指向新的主數據庫。

vtctld

vtctld是一個HTTP服務器,可以讓您瀏覽存儲在鎖定服務器中的信息。這對於故障排除或獲取服務器及其當前狀態的高級概述頗有用。

vtworker

vtworker承載長時間運行的進程。它支持插件架構並提供庫,以便您能夠輕鬆選擇要使用的平板電腦。插件可用於如下類型的做業:

  • 在分片分割和鏈接過程當中從新劃分不一樣的做業檢查數據完整性
  • 垂直分割不一樣做業檢查垂直分割和鏈接期間的數據完整性

vtworker還容許您輕鬆添加其餘驗證過程。例如,若是一個密鑰空間中的索引表引用了另外一個密鑰空間中的數據,則能夠執行內嵌式完整性檢查以驗證外鍵相似關係或跨分片完整性檢查。

其餘支持工具

Vitess還包含如下工具:

  • mysqlctl:管理MySQL實例
  • vtcombo:包含Vitess全部組件的單個二進制文件。它可用於在持續集成環境中測試查詢。
  • vtexplain:一種命令行工具,用於探索Vitess如何根據用戶提供的模式和拓撲處理查詢,而無需設置完整集羣。
  • zk:命令行ZooKeeper客戶端和資源管理器
  • zkctl:管理ZooKeeper實例

在Kubernetes上的Vitess

Kubernetes是Docker容器的開源協調系統,Vitess能夠做爲Kubernetes感知的雲本地分佈式數據庫運行。

Kubernetes在計算集羣的節點上處理調度,主動管理這些節點上的工做負載,並將包含應用程序的容器分組,以便於管理和發現。這爲Vitess在YouTube上運行的前身Kubernetes提供了一個相似的開源環境

運行Vitess最簡單的方法是經過Kubernetes。可是,這不是要求,還會使用其餘類型的部署。

歷史

自2011年以來,Vitess一直是YouTube基礎設施的基本組成部分。本節簡要概述了致使Vitess建立的事件順序:

  1. YouTube的MySQL數據庫達到了峯值流量即將超過數據庫服務容量的程度。爲了暫時緩解這個問題,YouTube爲寫入流量建立了一個主數據庫,併爲讀取流量建立了一個副本數據庫。
  2. 隨着對貓視頻的需求達到歷史新高,只讀流量仍然足以使副本數據庫超載。因此YouTube增長了更多的副本,再次提供了一個臨時解決方案。
  3. 最終,寫入流量對於主數據庫來講過高了,須要YouTube來分割數據來處理傳入流量。(若是數據庫的總體大小對於單個MySQL實例而言變得太大,則分片也將變得必要。)
  4. YouTube的應用程序層已被修改,以便在執行任何數據庫操做以前,代碼能夠識別正確的數據庫分片以接收特定的查詢。

Vitess讓YouTube從源代碼中刪除該邏輯,在應用程序和數據庫之間引入一個代理來路由和管理數據庫交互。此後,YouTube將用戶羣擴大了50倍以上,大大增長了其提供頁面服務的能力,處理新上傳的視頻等等。更重要的是,Vitess是一個持續擴展的平臺。

YouTube選擇在Go中編寫Vitess,由於Go提供了表現力和性能的組合。它幾乎和Python同樣具備表現力,而且很是易於維護。可是,在某些狀況下,它的性能與Java相同,接近於C ++。另外,該語言很是適合併發編程,而且具備很是高質量的標準庫。

首先開源

Vitess的開源版本與YouTube上使用的版本很是類似。雖然YouTube有一些變化能夠利用Google的基礎架構,但其核心功能是同樣的。在開發新功能時,Vitess團隊首先讓他們在開源代碼樹中工做。在某些狀況下,團隊會編寫一個利用Google特定技術的插件。這種方法可確保Vitess的開放源代碼版本與內部版本保持相同的質量水平。

Vitess的絕大部分開發工做都是在GitHub上公開的。所以,Vitess的構建具備可擴展性,以便您能夠根據基礎架構的需求進行調整。

詳見:https://vitess.io/overview/

相關文章
相關標籤/搜索