TiDB 2.1: Battle-Tested for an Unpredictable World

PingCAP發表於2018-11-30

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

回顧 2.0 版本

今年 4 月份我們釋出了 TiDB 2.0 版本,提升了穩定性、效能以及可運維性,這個版本在接下來的半年中得到了廣泛的關注和使用。

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

這幾個月,在這些場景中,我們親歷了跨機房容災需求、親歷了幾十萬級別的高吞吐業務、親歷了雙十一的流量激增、親歷了高併發點查、高併發寫入與上百行復雜 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%。

TiDB 2.1: Battle-Tested for an Unpredictable World

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 2.1: Battle-Tested for an Unpredictable World

完善的生態工具

為了讓使用者更方便的使用 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 這個開源社群能夠有所收穫!

相關文章