網易互娛的數據庫選型和 TiDB 應用實踐

圖片

一、業務架構簡介

計費組是爲網易互娛產品提供統一登錄和支付高效解決方案的公共支持部門,對內是互娛的各個遊戲工作室,對外是國內外數百個渠道。由於業務場景的特殊性,我們爲各個遊戲產品部署了不同的應用服務,其中大產品環境獨立,小產品集中部署。

隨着部門業務量的激增,單機 MySQL 在容量、性能、擴展性等方面都遇到了瓶頸,我們開始對其他數據庫產品進行調研選型。本文將詳細介紹網易互娛計費組針對自己場景的數據庫選型對比方案,以及使用 TiDB 後解決的問題,並分享使用 TiDB 過程中集羣管理、監控和數據遷移等方面的最佳實踐,以供大家參考和交流。

1.1 MySQL 使用架構

網易互娛計費組線上 MySQL 的基本使用架構,如下圖所示,其中箭頭方向表示數據或請求的指向:

圖 1 網易互娛計費組線上 MySQL 使用架構

1.2 MySQL 使用的現狀與問題

**隨着業務的發展,部門內各應用服務產生的數據量也在快速增長。業務落地數據量不斷激增,導致單機 MySQL 不可避免地會出現性能瓶頸。**主要體現在以下幾個方面:

圖 2 現狀之數據孤島

二、數據庫選型

2.1 調研目標

針對目前存儲架構存在的問題,有需要使用其他存儲方案的可能。考慮到目前的業務與 MySQL 高度耦合,對數據庫選型的主要要求有:

其他要求:

2.2 可選方案

2.3 測試

2.3.1 基於 MySQL 的解決方案

一開始仍然是傾向使用基於 MySQL 的解決方案,比如 MySQL InnoDB Cluster 或 MySQL + 中間件的方案。

我們測試了 MySQL 集羣 5.7.25 版本對比 8.0.12 版本,在 128 併發寫各 1000 萬行的 10 個表,比較單節點、3 節點和 5 節點下的情況,如下圖所示:

圖 3 對比結果

在測試中發現,使用 MySQL InnoDB 集羣的方案寫性能比單機 MySQL 差約 30%,其他的讀寫測試結果也不甚滿意。之後陸續測試 MySQL InnoDB Cluster 或 MySQL + 中間件的方案,不是測試結果性能不達要求,就是需要修改大量代碼。

因此我們得出了基於 MySQL InnoDB Cluster 或 MySQL + 中間件的方案的不滿足我們的業務場景的結論。總結來說,我們不使用 MySQL 分庫分表、中間件或 MySQL 集羣,原因主要是以下兩點:

仔細分析來看,其實基於 MySQL InnoDB Cluster 或 MySQL + 中間件的方案,本質上是 MySQL 主從結構的延伸,並非真正的分佈式拓展,像是以打 “補丁” 的方式來實現橫向擴展,很多功能特性自然也難以讓人滿意。

2.3.2 CockroachDB VS TiDB

在開源的分佈式 NewSQL 領域,知名的有 TiDB 和 CockroachDB(簡稱 CRDB),二者都是基於 Google Spanner 論文的開源實現。我們對這兩種數據庫的功能和性能做了大量的調研和測試。

測試方面,我們也進行了全面地對比和測試。這裏說其中一個測試案例:10 臺機器 5 存儲節點,160 併發訪問單表 2 億行,我們於 2018 年 7 月,對 CRDB-v2.1.0 版本和 TiDB-v2.0.5 版本進行了讀寫測試(CRDB 和 TiDB 集羣均使用默認配置,未進行調優)。

集羣拓撲

圖 4 CockroachDB 測試集羣搭建

圖 5 TiDB 測試集羣搭建

測試語句

其中一個重要的測試結果如下:

圖 6 測試結果

結論:

  1. CRDB 和 TiDB 在性能表現上不相上下;

注:上面是 2018 年 7 月的基於 TiDB 2.0.5 版本的測試結果,現在 TiDB 已發佈 3.0 GA 版本,在性能上有了質的提升。我們在近期進行了補充測試,大多數場景下 3.0 版本較 2.1 版本有數倍的性能提升,最新的測試結果圖如下:

圖 7 TiDB 2.1.15 vs 3.0.3:OLTP 峯值比較

圖 8 TiDB 2.1.15 vs 3.0.3:TPC-C

  1. CRDB 兼容 PostgreSQL,如果需要遷移則需要轉協議,需 MySQL → PostgreSQL  → CRDB。遷移過程複雜,成本高;

  2. TiDB 兼容 MySQL,代碼修改量不多,遷移成本低。

2.3.3 最終選型

綜合對比結果如下表:

經過謹慎的考量,我們選擇了 TiDB。

圖 9 選擇 TiDB 的重要理由

三、TiDB 在網易互娛計費組的使用

3.1 TiDB 使用架構

網易互娛使用 TiDB 的架構設計如下:

圖 10 基於 TiDB 的架構設計

3.2 TiDB 解決了哪些需求

3.3 TiDB 使用現狀

四、最佳實踐分享

4.1 集羣管理

4.2 運維實踐

4.2.1 Prometheus 監控

官方集成了 Prometheus + Grafana 的實時監控平臺,從集羣的各個方面進行了完善的監控,包括:

PD 監控示意圖如下,集羣管理員可以很方便地掌握集羣的最新狀態,包括集羣的空間 Region 等所有情況。

圖 11 最佳運維實踐:Prometheus 實時監控

如果集羣運行過程出錯,在監控面板上很容易就發現,下圖是使用過程中的一個案例:

圖 12 最佳運維實踐案例

應用訪問 TiDB 寫入數據時發現特別慢,讀請求正常。排查後,根據 TiKV 面板發現 Raft Store CPU 這項指標異常。深入瞭解原因是因爲數據庫副本複製是單線程操作,目前已經到了集羣的瓶頸。解決辦法有以下兩點:

解決方法:刪除過期數據。

解決方法:從 2.1.5 升級到 2.1.15,開啓自動 Region Merge 功能。

4.2.2 部分運維問題及解決方案

4.3 全網數據庫遍歷

以前部分業務遍歷全網數據庫獲取所需數據,需要維護多個源,而且是異構源,非常複雜和繁瑣。使用 TiDB 很好地解決了這個問題,只需要訪問一個源就可以獲取到所有想要的數據。

圖 13 全網數據庫遍歷

4.4 數據遷移

4.4.1 MySQL 到 TiDB

圖 14 數據從 MySQL 遷移到 TiDB

MySQL 數據庫遷移到 TiDB 分爲兩個部分:全量和增量。

4.4.2 數據遷出 TiDB

圖 15 數據遷出 TiDB

如果數據需要反向導入或同步,可以利用 TiDB Binlog 工具將 TiDB 集羣的 binlog 同步到 MySQL。TiDB Binlog 支持以下功能場景:

導入的方式:

4.5 優雅地「去分庫分表」

圖 16 去分庫分表舉例

舉例:一個超級大表按天分表,現在打算查詢某個賬號一年間的信息。

上游 MySQL

 SELECT xx FROM HFeeall join HFee20190101 join ... join ...join ... join HFee20190917 WHERE xx;

需要連接 N 個 join 條件,查詢需要等待較長時間。

下游 TiDB

 SELECT xx  FROM SuperHfeeall WHERE xx ;

應用此方案,最大單表 700+GB,13+ 億行,索引查詢秒返回。

4.6  業務遷移

目標:利用 TiDB 的水平擴展特性,解決容量瓶頸和系統吞吐量瓶頸。

遷移原則:

1)數據同步

使用 DM 或者 Syncer 將上游 MySQL 的數據同步到 TiDB 集羣。同步流搭建後注意需要檢查上下游數據一致性。

觀察一段時間,同步無誤後,可以根據業務需要遷移部分讀流量到 TiDB 集羣。

圖 17 業務遷移之數據同步

2)讀寫驗證

這一階段是驗證應用訪問 MySQL 和訪問 TiDB 可以得到相同的結果,驗證業務訪問的準確性問題。

停止數據同步,使用流量複製工具將線上流量完全拷貝出來,同時讀寫 MySQL 和 TiDB。將兩邊的訪問結果進行對比,覈查 TiDB 是否可靠和可信。根據需要,這個階段可以測試較長時間。

圖 18 業務遷移之讀寫驗證

3)灰度切換

將步驟 2 的雙寫停止,即關雙寫,同時拉起上游的 DM 同步。

把訪問部分非核心業務的庫表寫操作遷移到 TiDB,打開 TiDB 的 Binlog 開關對線上 MySQL 進行反向同步。這個操作,保證只寫 MySQL 的數據同步到 TiDB ,只寫 TiDB 的數據也可以反向同步到 MySQL,保證出了問題,隨時可以回滾。當業務長時間訪問正常,可以增加切換流量,進行灰度切換。建議觀察一段時間,至少一個月。

圖 19 業務遷移之灰度切換

4)遷移完成

當流量完全遷移完成,保持 TiDB 反同步到 MySQL 過程,繼續觀察一段時間,確認無誤後,斷開反向同步,100% 遷移完成。

圖 20 完成遷移

五、總結與展望

**TiDB 兼容 MySQL 協議,支持 TP/AP 事務且擴展性好,能很好地解決網易互娛計費組業務大容量、高可用等問題。目前我們的業務在不斷深入和擴大規模使用 TiDB。**因爲看好它,所以這裏提出一些使用中的問題以幫助原廠持續打磨產品:

最後,根據網易互娛計費組已有的使用情況,我們計劃繼續加大、加深 TiDB 的使用場景,豐富業務類型和使用規模,期待 TiDB 給我們的業務帶來更多便利。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/pTCbXLu3RvmadIcudi-U4g