天天看點

實戰-記錄一次大版本更新

作者: magongyong ​

一. 背景

  • 目前本公司TiDB叢集已經運作5個業務系統資料庫。這5個業務都是公司相對重要的業務系統,具有高并發寫入、高并發查詢或大批量資料查詢的特征。
  • TiDB産品疊代速度較快,TiDB v5.4.0 GA版本雖然比TiDB v4.0.13晚一年左右,但是卻有較大的功能與性能改進(已測試)能夠提升寫入性能,查詢性能,尤其是多表聯合查詢(mpp)提升較大。

二. 更新目的

  • 提升TiDB叢集寫入性能和查詢性能,5.4.0比4.0.13提升10-15%左右。
  • TiFlash元件增加MPP(查詢下推)功能,較大幅度提升TiDB叢集多表連接配接查詢性能。
  • 提升更友好的維護與管理方式。
  • 新叢集伺服器替換舊叢集伺服器,TiDB叢集整體最大承載能力提升2倍左右。

三. 風險分析

  • TiDB v4.0.13版本是本公司TiDB叢集使用的第一個版本,經過了大量的測試,包括白盒測試和業務測試,并且使用至今基本無重大問題出現,整體較為穩定。而TiDB v5.4.0版本雖然是官方釋出的GA版本,但是版本較新,穩定性需要時間來檢驗。
  • TiDB v5.4.0是大版本5.4的第一個版本,可能會存在bug,後期需要通過小版本更新修複bug list,比如更新到5.4.1。
  • 為保證更新期間對業務影響最小,采用叢集替換方式,保證一個叢集更新出現問題,另一個能随時接管業務。

四. 官方說明

1、版本新特性

TiDB 5.0 Release Notes

發版日期:2021 年 04 月 07 日

  • 5.0 版本中,我們專注于幫助企業基于 TiDB 資料庫快速建構應用程式,使企業在建構過程中無需擔心資料庫的性能、性能抖動、安全、高可用、容災、SQL 語句的性能問題排查等問題。
  • 在 5.0 版本中,你可以獲得以下關鍵特性:
  • TiDB 通過 TiFlash 節點引入了 MPP 架構。這使得大型表連接配接類查詢可以由不同 TiFlash 節點共同分擔完成。當 MPP 模式開啟後,TiDB 将會根據代價決定是否應該交由 MPP 架構進行計算。MPP 模式下,表連接配接将通過對 JOIN Key 進行資料計算時重分布(Exchange 操作)的方式把計算壓力分攤到各個 TiFlash 執行節點,進而達到加速計算的目的。經測試,TiDB 5.0 在同等資源下,MPP 引擎的總體性能是 Greenplum 6.15.0 與 Apache Spark 3.1.1 兩到三倍之間,部分查詢可達 8 倍性能差異。
  • 引入聚簇索引功能,提升資料庫的性能。例如,TPC-C tpmC 的性能提升了 39%。
  • 開啟異步送出事務功能,降低寫入資料的延遲。例如:Sysbench 設定 64 線程測試 Update index 時, 平均延遲由 12.04 ms 降低到 7.01ms ,降低了 41.7%。
  • 通過提升優化器的穩定性及限制系統任務對 I/O、網絡、CPU、記憶體等資源的占用,降低系統的抖動。例如:測試 8 小時,TPC-C 測試中 tpmC 抖動标準差的值小于等于 2%。
  • 通過完善排程功能及保證執行計劃在最大程度上保持不變,提升系統的穩定性。
  • 引入 Raft Joint Consensus 算法,確定 Region 成員變更時系統的可用性。
  • 優化 EXPLAIN 功能、引入不可見索引等功能幫助提升 DBA 調試及 SQL 語句執行的效率。
  • 通過從 TiDB 備份檔案到 Amazon S3、Google Cloud GCS,或者從 Amazon S3、Google Cloud GCS 恢複檔案到 TiDB,確定企業資料的可靠性。
  • 提升從 Amazon S3 或者 TiDB/MySQL 導入導出資料的性能,幫忙企業在雲上快速建構應用。例如:導入 1TiB TPC-C 資料性能提升了 40%,由 254 GiB/h 提升到 366 GiB/h。

TiDB 5.1 Release Notes

發版日期:2021 年 6 月 24 日

  • 在 5.1 版本中,你可以獲得以下關鍵特性:
  • 支援 MySQL 8 中的公共表表達式 (Common Table Expression),提高了 SQL 語句的可讀性與執行效率。
  • 支援對資料表列類型的線上變更,提高了業務開發的靈活性。
  • 引入一種新的統計資訊類型,預設作為實驗特性啟用,提升查詢穩定性。
  • 支援 MySQL 8 中的動态權限 (Dynamic Privileges) 配置,實作對某些操作更細粒度的控制。
  • 支援通過 Stale Read 功能直接讀取本地副本資料,降低讀取延遲,提升查詢性能(實驗特性)。
  • 新增鎖視圖 (Lock View) 功能友善 DBA 觀察事務加鎖情況以及排查死鎖問題(實驗特性)。
  • 新增 TiKV 背景任務寫入限制(TiKV Write Rate Limiter),保證讀寫請求的延遲穩定性。

TiDB 5.2 Release Notes

發版日期:2021 年 8 月 27 日

  • 在 5.2 版本中,你可以獲得以下關鍵特性:
  • 支援基于部分函數建立表達式索引 (Expression index),極大提升查詢的性能。
  • 提升優化器的估算準确度 (Cardinality Estimation),有助于選中最優的執行計劃。
  • 鎖視圖 (Lock View) 成為 GA 特性,提供更直覺友善的方式觀察事務加鎖情況以及排查死鎖問題。
  • 新增 TiFlash I/O 限流功能,提升 TiFlash 讀寫穩定性。
  • 為 TiKV 引入新的流控機制代替之前的 RocksDB write stall 流控機制,提升 TiKV 流控穩定性。
  • 簡化 Data Migration (DM) 工具運維,降低運維管理的成本。
  • TiCDC 支援 HTTP 協定 OpenAPI 對 TiCDC 任務進行管理,在 Kubernetes 以及 On-Premises 環境下提供更友好的運維方式。(實驗特性)yix

TiDB 5.3 Release Notes

發版日期:2021 年 11 月 30 日在 v5.3.0 版本中,你可以獲得以下關鍵特性:

  • 引入臨時表,簡化業務邏輯并提升性能
  • 支援設定表和分區的表屬性
  • 支援為 TiDB Dashboard 建立最小權限使用者,提高系統安全性
  • 優化 TiDB 時間戳處理流程,提升系統的整體性能
  • 提高 DM 同步性能,實作以更低的延遲将資料從 MySQL 同步資料到 TiDB
  • 支援 TiDB Lightning 分布式并行導入,提升全量資料遷移效率
  • 支援“一鍵”儲存和恢複現場問題的相關資訊,提升查詢計劃問題診斷的效率
  • 支援持續性能分析 (Continuous Profiling) 實驗特性,提高資料庫性能的可觀測性
  • 持續優化存儲和計算引擎,提升系統性能和穩定性
  • 降低 TiKV 寫入延遲,從 Raftstore 線程池中分離出 IO 線程池(預設不開啟)

TiDB 5.4 Release Notes

發版日期:2022 年 2 月 15 日

  • 在 v5.4.0 版本中,你可以獲得以下關鍵特性:
  • 支援 GBK 字元集
  • 支援索引合并 (Index Merge) 資料通路方法,能夠合并多個列上索引的條件過濾結果
  • 支援通過 session 變量實作有界限過期資料讀取
  • 支援統計資訊采集配置持久化
  • 支援使用 Raft Engine 作為 TiKV 的日志存儲引擎(實驗特性)
  • 優化備份對叢集的影響
  • 支援 Azure Blob Storage 作為備份目标存儲
  • 持續提升 TiFlash 列式存儲引擎和 MPP 計算引擎的穩定性和性能
  • 為 TiDB Lightning 增加已存在資料表是否允許導入的開關
  • 優化持續性能分析(實驗特性)
  • TiSpark 支援使用者認證與鑒權

2、版本相容性

相容項 5.0.0 5.1.0 5.2.0 5.3.0 5.4.0
系統變量 - - - - -
配置檔案 - - - - -
其他 - - - - -

此處内容過多,省略

3. github issue

​​https://github.com/pingcap/tidb/issues?page=2&q=is%3Aopen+is%3Aissue+label%3Aaffects-5.4​​

五. 更新流程

  1. 預發環境k8s連接配接預發環境TiDB新叢集叢集進行業務測試,版本v5.4.0。
  2. 生産環境部署新叢集TiDB v5.4.0。
  3. 現有叢集TiDB v4.0.13部署binlog drainer同步到TiDB新叢集v5.4.0。
  4. 業務低峰期,根據dns域名切換+haproxy切換的方式切換到新叢集。
  5. 将舊叢集做成新叢集的從叢集,用于随時回退。
  6. 穩定運作一個月,下線舊叢集。

六. 伺服器規劃

1、新版本叢集

實戰-記錄一次大版本更新

2、舊版本叢集

實戰-記錄一次大版本更新

七. 測試報告

1、sysbench混合性能測試,讀寫比3:1

實戰-記錄一次大版本更新

列說明:

第1列:并發數

第2列:4.0.13版本,原叢集伺服器,tps

第3列:4.0.13版本,新叢集伺服器,tps

第4列:5.4.0版本,新叢集伺服器,tps

2、TiFlash單個sql查詢測試

測試結果:

實戰-記錄一次大版本更新

3、TiKV單個sql查詢測試

測試結果:

實戰-記錄一次大版本更新

八. 更新操作步驟

  1. 原叢集部署tidb binlog drainer同步到新版本叢集(先進行全量資料導出導入)。
  2. 以下操作均在業務低峰期進行,切換原則是對業務影響最小為最佳。
  3. 根據切換的業務域名(有多個業務,使用不同的域名,每次隻切換一個業務),通過dns域名管理系統,将域名指向到原叢集的備用haproxy(原叢集包括兩個haproxy,一個主,一個備)的vip上。
  4. 業務相關的k8s服務滾動重新開機(對業務無影響),保證切換業務的資料庫連接配接,連到備用haproxy上。
  5. 通過dns域名管理系統,将切換業務的域名指向新版本5.4.0叢集的主haproxy vip。
  6. 設定新版本叢集隻讀,此操作為了避免叢集雙寫,新叢集隻讀不超過10秒,避免對業務影響太大。
  7. 原叢集備用haproxy重新開機,釋放切換業務的資料庫連接配接。
  8. 設定新版本叢集可寫。
  9. 檢視新叢集和原叢集資料庫連接配接遷移情況,全部遷移完成後,切換成功。
  10. 包含自增id屬性的表,在新叢集執行語句:alter table table_name auto_id_cache 30000; ,此操作重新整理自增id值,避免新叢集出現主鍵重複(踩過的坑)。
  11. 回收原叢集的業務賬号權限(避免非正常操作繼續往原叢集寫資料)。
  12. 原叢集binlog drainer停止。
  13. 新叢集部署binlog drainer,同步到原叢集,保證随時可回退到原叢集,先找到切換時間點的tso,根據此tso部署drainer。
  14. 業務相關的操作,比如業務回歸測試等,至此,切換完成。

九. 回退

十. 經驗總結

  1. 最早打算使用ip漂移的方式,但是考慮到影響業務面積太大,是以改為按業務域名切換,一次切換隻影響一個業務,出現bug等問題不至于全業務癱瘓
  2. 切換前需要确認所有業務使用的是域名,而不是直連IP,如果直連IP,需要改為連接配接域名
  3. 切換到新版本叢集後,出現了主鍵重複的問題,原因應該是新叢集的表自增id初始值小于原叢集的最大值,這個問題出現過多次,之前使用dm,從mysql切換到tidb叢集也出現過,解決方法是alter table table_name auto_id_cache 30000;
  4. 切換之後觸發tiflash的bug,具體見:​​https://asktug.com/t/topic/694454​​
  5. 切換之後頻繁出現tidb記憶體使用過高的問題,修改參數prepared-plan-cache.capacity,從50000改為10000,重新開機tidb server後恢複正常
  6. 切換後tiflash使用效果大幅提升,寫入也相對快了一些,整體效果較好,目前已進入穩定期

繼續閱讀