TiDB 2.1: Battle-Tested for an Unpredictable World

TiDB 是由 PingCAP 開發的分佈式關係型數據庫,今天咱們很高興地推出 TiDB 2.1 正式版,提供更豐富的功能、更好的性能以及更高的可靠性。git

回顧 2.0 版本

今年 4 月份咱們發佈了 TiDB 2.0 版本,提高了穩定性、性能以及可運維性,這個版本在接下來的半年中獲得了普遍的關注和使用。github

迄今爲止 TiDB 已經在 數百家用戶 的生產環境中穩定運行,涉及互聯網、遊戲、金融、保險、製造業、銀行、證券等多個行業,最大集羣包含數百個節點及數百 TB 數據,業務場景包含純 OLTP、純 OLAP 以及混合負載。另外,既有使用 TiDB 當作關係數據庫的場景,也有隻用 TiKV 做爲分佈式 Key Value 存儲的場景。sql

這幾個月,在這些場景中,咱們親歷了跨機房容災需求、親歷了幾十萬級別的高吞吐業務、親歷了雙十一的流量激增、親歷了高併發點查、高併發寫入與上百行復雜 SQL 的混合負載、見到過屢次的硬件/網絡故障、見到過操做系統內核/編譯器的 Bug。數據庫

簡而言之,咱們的世界充滿了未知,而分佈式關係型數據庫這樣一種應用普遍、功能豐富且很是關鍵的基礎軟件,最大的困難就是這些「未知」。在 2.1 版本中,咱們引入了很多新的特性來抵禦這些未知,適配各類複雜的場景,提高性能和穩定性,幫助咱們的用戶更好地支撐複雜的業務。安全

新特性

更全面的 Optimizer

在 2.1 版本中,咱們對 TiDB 的 Cost-based Optimizer 作了改進,但願這個優化器可以處理各類複雜的 Query,儘可能少的須要人工介入去處理慢 SQL。例如對 Index Join 選擇索引、外表的優化,對關聯子查詢的優化,顯著地提高了複雜 SQL 的查詢效率。性能優化

固然,除了自動的查詢優化以外,2.1 也增長了更多的手動干預機制,好比對 Join 算子的 Hint、Update/Delete 語句的 Hint。用戶能夠在優化器沒有指定合適的計劃時,手動干預結果或者是用來確保查詢計劃穩定。網絡

更強大的執行引擎

在 2.1 版本中,咱們對部分物理算子的執行效率進行了優化,特別是對 Hash Aggregation 和 Projection 這兩個算子進行了並行化改造,另外重構了聚合算子的運行框架,支持向量化計算。併發

得益於這些優化,在 TPC-H 這種 OLAP 的測試集上,2.1 比 2.0 版本有了顯著的性能提高,讓 2.1 版本更好的面對 HTAP 應用場景。負載均衡

Raft 新特性

在 2.1 版本中,咱們引入了 Raft PreVote、Raft Learner、Raft Region Merge 三個新特性:框架

  • PreVote 是在 Raft Group Member 發起投票以前,預先檢查是否能被其餘成員所支持,以免集羣中被網絡隔離的節點從新接入集羣中的時候引起性能抖動,提高集羣穩定性。2.1 版本已經支持 PreVote 功能,並默認打開。

  • Learner 是隻同步數據不參與投票的 Raft Group Member。在新加副本的時候,首先增長 Learner 副本,以免添加副本過程當中,部分 TiKV 節點故障引起丟失多數副本的狀況發生,以提高集羣的安全性。2.1 版本已經支持 Learner 功能,並默認打開。

  • Region Merge 用於將多個太小的 Region 合併爲一個大的 Region,下降集羣的管理成本,對於長期運行的集羣以及數據規模較大的集羣的性能、穩定性有幫助。2.1 版本已經支持 Region Merge 功能,還沒有默認打開。

這些新特性的引入,有助於提高存儲集羣尤爲是大規模集羣的穩定性和性能。

自動更新統計信息

統計信息的及時性對查詢計劃的正確性很是重要。在 2.1 版本中,咱們提供了基於 Query Feedback 的動態增量更新機制。

在制定查詢計劃時,會根據現有的統計信息估算出須要處理的數據量;在執行查詢計劃時,會統計出真實處理的數據量。TiDB 會根據這兩個值之間的差距來更新統計信息,包括直方圖和 CM-Sketch。在咱們的測試中,對於一個徹底沒有統計信息的表,通過十輪左右的更新,能夠達到統計信息基本穩定的狀態。這對於維持正確的查詢計劃很是重要。

除了動態增量更新以外,咱們對自動全量 Analyze 也提供了更多支持,能夠經過 系統變量 指定作自動 Analyze 的時間段。

並行 DDL

TiDB 全部的 DDL 操做都是 Online 進行,不過在 2.0 以及以前的版本中,全部的 DDL 操做都是串行執行,即便 DDL 所操做的表之間沒有關聯。好比在對 A 表 Add Index 時候,想建立一個 B 表,須要等待 Add Index 操做結束。這在一些場景下對用戶使用形成了困擾。

在 2.1 版本中,咱們對 DDL 流程進行拆分,將 Add Index 操做和其餘的 DDL 操做的處理分開。因爲在 TiDB 的 DDL 操做中,只有 Add Index 操做須要去回填數據,耗時較長,其餘的 DDL 操做正常狀況下均可以在秒級別完成,因此通過這個拆分,能夠保證大多數 DDL 操做可以不須要等待,直接執行。

Explain 和 Explain Analyze

Explain 對於理解查詢計劃相當重要,2.1 以前的版本,TiDB 追隨 MySQL 的 Explain 輸出格式來展現查詢計劃。可是當 SQL 比較複雜時,MySQL 的格式並不利於展現算子之間的層級關係,不利於用戶定位問題。

2.1 版本中,咱們使用縮進來展現算子之間的層級關係,對每一個算子的詳細信息也作了優化,但願整個查詢計劃一目瞭然,幫助用戶儘快定位問題。這篇文檔 能夠幫助用戶瞭解 TiDB 的查詢計劃。

用戶除了經過 Explain 語句查看查詢計劃以外,在 2.1 版本中還能夠經過 Explain Analyze 語句查看語句的運行時信息,包括每一個算子運行時的處理時間以及處理的數據量。這樣能夠經過實際的運行結果,拿到更加精確的信息。

熱點調度

熱點是分佈式系統最大的敵人之一,而且用戶的業務場景複雜多變,讓熱點問題捉摸不定,也是最狡猾的敵人。2.1 版本中,咱們一方面加強熱點檢測能力,儘量詳細地統計系統負載,更快的發現熱點;另外一方面優化熱點調度策略,用盡量小的代價,儘快地打散熱點。同時咱們也提供了手動分裂 Region 的接口,讓用戶在特殊場景下將單點瓶頸手動分裂開,再由 PD 進行負載均衡。

高效的 GC 機制

2.1 版本對 GC(垃圾回收) 模塊進行優化。一方面減小對線上的寫入的影響,另外一方面加快了空間回收速度。在內部測試場景中,刪除一個 1TB 的表,新的 GC 機制可以在 10 秒內回收 99% 左右的空間。

更好的性能

OLTP

咱們針對 OLTP 場景中,點查佔多數的特色進行了針對性的優化。當經過 Unique Key 或者 Primary Key 進行數據訪問時,在優化器和執行引擎中都作了改進,使得語句的執行效率更高,經過 2.1 和 2.0 版本的 Sysbench 對比 能夠看到,點查性能提高 50%。

OLAP

發佈 2.0 的時候,咱們同時發佈了在 TPC-H Scale 50 的場景中 2.0 和 1.0 的對比結果。其中大多數 Query 都有數量級的提高,部分 Query 在 1.0 中跑不出結果,在 2.0 中能夠順利運行。不過對於 Query17 和 Query18,運行時間依然很長。

咱們在相同的場景下,對 2.1 和 2.0 進行了 對比測試。從下圖能夠看到(縱座標是 Query 的響應時間,越低越好),以前的兩個慢 Query 的運行時間大幅縮短,其餘的 Query 也有必定程度的提高。這些提高一方面得益於查詢優化器以及執行引擎的改進,另外一方面 得益於 TiKV 對連續數據掃描的性能優化。

完善的生態工具

爲了讓用戶更方便的使用 TiDB,咱們提供了三個工具:

  • TiDB Lightning 用於將全量數據導入到 TiDB 中,這個工具能夠提高全量數據導入速度,目前內部測試場景中,一小時能夠導入 100GB 數據。
  • TiDB Binlog 用於將 TiDB 中的數據更新實時同步到下游系統中,能夠用於作主從集羣同步或者是將 TiDB 中的數據同步回 MySQL。
  • TiDB DM(Data-Migration)用於將 MySQL/MariaDB 中的數據經過 Binlog 實時同步到 TiDB 集羣中,而且提供 Binlog 數據轉換功能,能夠將 Binlog 中的表/庫名稱進行修改,或者是對數據內容自己作修改和裁剪。

上述三個工具能夠將 TiDB 和周邊的系統打通,既能將數據同步進 TiDB,又能夠將數據同步出來。因此不管是遷移、回退仍是作數據熱備,都有完整的解決方案。

Open Source Community

咱們相信打敗「未知」最好的武器就是社區的力量,基礎軟件須要堅決地走開源路線。爲了讓社區更深刻的瞭解 TiDB 的技術細節而且更好地參與到項目中來,咱們今年已經完成超過 20 篇源碼閱讀文章,項目的設計文檔(TiDBTiKV)已經在 GitHub 上面公開出來,項目的開發過程也儘可能經過 Github Issue/Project 向社區展現。一些 Feature 設計方案的討論也會經過在線視頻會議的方式方便社區參與進來,這裏 能夠看到會議安排。

從 TiDB 2.0 版發佈到如今的半年多時間,TiDB 開源社區新增了 87 位 Contributor,其中 杜川 成爲了 TiDB Committer,他已經貢獻了 76 次 PR,還有一些活躍的 Contributor 有但願成爲下一批 Committer。

在這裏咱們對社區貢獻者表示由衷的感謝,但願更多志同道合的人能加入進來,也但願你們在 TiDB 這個開源社區可以有所收穫!

相關文章
相關標籤/搜索