分庫分表真的適合你的系統嗎?聊聊分庫分表和NewSQL如何選擇

来源:https://www.cnblogs.com/coderw/archive/2022/07/12/16469906.html
-Advertisement-
Play Games

曾幾何時,“併發高就分庫,數據大就分表”已經成了處理 MySQL 數據增長問題的聖經。 面試官喜歡問,博主喜歡寫,候選人也喜歡背,似乎已經形成了一個閉環。 但你有沒有思考過,分庫分表真的適合你的系統嗎? 分表 在業務剛剛發展起來的時候,流量全部打到了一個 MySQL 上,用戶信息全落到了 user ...


曾幾何時,“併發高就分庫,數據大就分表”已經成了處理 MySQL 數據增長問題的聖經。

面試官喜歡問,博主喜歡寫,候選人也喜歡背,似乎已經形成了一個閉環。

但你有沒有思考過,分庫分表真的適合你的系統嗎?

分表

在業務剛剛發展起來的時候,流量全部打到了一個 MySQL 上,用戶信息全落到了 user 表。

圖片

後來,user 表的數據量越來越大了。

於是,你做了一次垂直拆分,將原來的 user 表拆分成了新的 user 表和 user_details 表。

圖片

這樣一拆之後,用戶的信息分散到兩個表,user 表的數據量一下就變小了,user 表數據量過大的問題暫時就解決了。

但隨著業務的發展,線上的流量越來越大,單個 MySQL 已經扛不住流量的壓力了。

圖片

單個庫承受不住壓力的時候,就需要分庫了。

分庫

顧名思義,分庫就是將一個庫拆成多個庫,讓多個庫分擔流量的壓力。

拆成多個庫也意味著進行了分表,也就是說分庫一定分表,分表不一定分庫。

我們可以根據_偏應用_還是_偏 DB_,將分庫分表的實現方式分成三種類型:

  • JDBC 代理模式

  • DB 代理模式

  • Sharding On MySQL 的 DB 模式

JDBC 代理模式

JDBC 代理模式是一種無中心化的架構模式。ShardingSphere-JDBC 就是 JDBC 代理模式的典型實現。

通常以 jar 包形式提供服務,讓客戶端直連資料庫,這種模式無需額外部署和依賴,可理解為增強版的 JDBC 驅動。

圖片

JDBC 代理模式雖然簡單,但違背了 DB 透明的原則,侵入性比較高,需要針對不同的語言編寫不同的 Driver。

美團的 Zebra、MTDDL,阿裡 TDDL 都是基於這種模式的實現。

DB 代理模式

DB 代理模式是中心化的架構模式。ShardingSphere-Proxy 就是 DB 代理模式的經典實現。

這種模式旨在實現透明化的資料庫代理端,並獨立於應用部署,因為獨立部署,所以對異構語言沒有限制,不會對應用造成侵入。

圖片

DB 代理模式比 JDBC 代理模式消耗的連接數會少,相對來說性能也會更好。

但中心化的設計也帶來了單點的問題,為了保持高可用和高性能,還需要引入 LVS/F5 等 VIP 來實現流量的負載均衡,如果跨 IDC,還依賴諸如 DNS 進行 IDC 分發,大大拉長了應用到資料庫的鏈路,進而提高了響應時間。

阿裡的 MyCat、美團的 Meituan Atlas 和百度 Heisenberg 就是基於 DB 代理模式的實現。

Sharding On MySQL

Sharding On MySQL 相當於屏蔽了分庫分表的操作,是運維和中間件結合的沉澱,比較典型例子是阿裡的 DRDS。

圖片

這種模式讓分庫分表變得模糊,對應用來說,更像是一個封裝了 MySQL 的新型資料庫。

雖然用戶使用變得更簡單了,但簡單的背後是運維的沉澱,分庫分表該存在的問題它依然存在。

分庫分表的成本

實現分庫分表的方式有很多,但不同模式的實現似乎都是在彌補 MySQL 不支持分散式的缺陷。

分庫分表這種強行讓 MySQL 達到一個偽“分散式”的狀態,也帶來了一些新的問題,比如:

  1. 功能限制問題:分庫分表後跨維度 join、聚合、子查詢不復存在,唯一鍵、外鍵等全局約束也只能靠業務保障,DB 慢慢弱化為存儲。

  2. 運維複雜度問題:分庫分表後的多個庫表的管理麻煩,運維成本非常高,數據查詢也很麻煩。

  3. Sharding Key 問題:非 Sharding key 的查詢需要做額外的冗餘處理,需要引入 Elasticsearch、ClickHouse 等其他節點,進一步提高了系統的複雜度。

  4. 唯一 ID 問題:分庫分表後唯一 ID 得不到保障,需要對唯一 ID 進行改造。

  5. 分散式事務問題:MySQL 自帶的 XA 柔性事務性能太低,需要引入新的分散式事務解決方案。

NewSQL

從上文得知,分庫分表需要犧牲 MySQL 的一些功能,還帶來許多新的問題。

那有沒有一種方案,既能擁有 MySQL 的功能,又能支持數據的可擴展?

有。那就是 NewSQL。

NewSQL 是一類關係資料庫管理系統,旨在為線上事務處理(OLTP) 工作負載提供 NoSQL 系統的可擴展性,同時保持傳統資料庫系統的 ACID 保證。

國內比較知名的 NewSQL 有阿裡的 OceanBase、騰訊的 TDSQL、PingCAP 的 TiDB。它們既有 MySQL 的功能,又有分散式可擴展的能力。

筆者對阿裡的 OceanBase 只能說是略懂皮毛,就不過多描述。

我們重點看一下騰訊的 TDSQL 和 PingCAP 的 TiDB。

圖片

從兩者的架構圖(省略了部分模塊)上可以看出,TDSQL 和 TiDB 的架構只有一些命名差別,可以說幾乎一模一樣。

兩者整體來說分為三個部分:

  1. 計算:負責接受客戶端的連接,執行 SQL 解析和優化,最終生成分散式執行計劃轉發給底層的存儲層執行。(TDSQL:SQL Engine 、TiDB:TiDB-Server)

  2. 存儲:分散式_KV 存儲_,類似 NoSQL 資料庫,支持彈性擴容和縮容。(TDSQL:TDStore 、TiDB:TiKV)

  3. 管控:整個集群的元信息管理模塊,是整個集群的大腦。(TDSQL:TDMetaCluster 、TiDB:Placement Driver )

兩者核心的存儲模塊(TDStore/TiKV),都是基於 RocksDB 開發而來,都是_KV 存儲_的模式。

RocksDB 是由 Facebook 基於 LevelDB 開發的一款提供鍵值存儲與讀寫功能的 LSM-tree 架構引擎。

底層利用了_WAL(Write Ahead Log)技術_和_Sorted String Table_,比 B 樹類存儲引擎更高的寫吞吐。

NewSQL 平滑接入方案

因為筆者落地過 TiDB,所以會以 TiDB 為例描述如何接入 NewSQL,做到不影響線上使用的平滑遷移。

圖片

第一步:初始狀態,所有線上讀和寫都落到 MySQL。

第二步:將 TiDB 作為 MySQL 的從節點接入系統,所有線上讀寫還是都落到 MySQL,日末通過腳本或者任務驗證 MySQL 的數據和 TiDB 的數據是否一致,這一步主要驗證 MySQL 數據同步到 TiDB 沒有問題。

第三步:將部分讀切換到 TiDB,這一步主要驗證 TiDB 同步的數據讀沒有問題,驗證系統 SQL 能正常在 TiDB 執行。

第四步:斷掉 MySQL 和 TiDB 之間的同步,雙寫 MySQL 和 TiDB,所有的線上讀流量都落到 MySQL。

第五步:將部分讀流量切到 TiDB,驗證 TiDB 寫入的數據能夠正常讀取。這一階段可以將部分冪等任務同時在兩個數據源上執行,驗證兩者數據是否一致。

第六步:將所有的線上讀流量切到 TiDB,同時保持雙寫,如果出問題隨即切到 MySQL。

第七步:斷掉 MySQL 的寫流量,將 MySQL 作為 TiDB 的一個從庫,作為降級使用。

整個方案的基礎是:TiDB 相容 MySQL 協議和 MySQL 生態

這個方案是建立在完全不信任 TiDB的基礎上設計的,驗證了 TiDB 和 MySQL 的契合點,所以整體會比較繁瑣,實際落地的時候可以根據情況省略一部分步驟。

NewSQL 真的有那麼好嗎?

NewSQL 並是不萬能的,也不必去過於神化 NewSQL,國內比較知名的幾種 NewSQL 或多或少都存在部分功能缺陷,以 TiDB 為例:

  1. TiDB 的自增 ID 只能保證單個 TiKV 上的自增,並不能保證全局自增。

  2. 由於 TiKV 存儲是根據 key 的二進位順序排列的,使用自增 ID 可能會造成熱塊效應。

  3. TiDB 預設 RC(讀已提交)的事務隔離級別,並且不支持 RR(可重覆讀)隔離級別,雖然提供了基本等價於RR的SI(Snapshot Isolation),但還是存在_寫偏斜_問題

  4. TiDB 的點查(select point)性能比 MySQL 要差不少,在幾個億級別的數據量才能勉強和 MySQL 打平。

  5. 因為底層基於 Raft 協議做數據同步,所以 TiDB 延遲會比 MySQL 要高。

  6. ...

所以說,NewSQL 也並不是屠龍刀,需要根據實際應用去評估這些缺陷帶來的影響。

NewSQL 的應用

NewSQL 在國內其實已經發展了很多年,OceanBase 誕生於 2010 年,TDSQL 可追溯到 2004 年,TiDB 誕生於 2015 年。

三者在國內外積累了不少的客戶案例。

OceanBase

  1. OceanBase 已經覆蓋螞蟻集團100%核心鏈路,支撐全部五大業務板塊。目前運行數十億條不同的 SQL、數據量達數百 PB、伺服器核數過百萬。

  2. 中國工商銀行全行業務都使用 OceanBase,包含不限於存、貸、支付結算及創新業務等。

  3. OceanBase 憑藉混合雲架構、高可用、Oracle 相容等特性,通過分散式中間件、金融套件、移動開發平臺集成解決方案,支撐網商銀行核心系統數字化轉型。

  4. 招商銀行的“海量行情系統”和“歷史收益系統”就是採用 OceanBase 作為底層資料庫。

TDSQL

  1. 微眾銀行實現了 TDSQL 私有化部署,是一個典型的兩地多中心架構。

  2. 富途證券的港股交易系統、東吳證券新一代核心交易系統底層存儲都是 TDSQL。

  3. 數字廣東粵省事深圳地鐵碼上乘車等業務都是在 TDSQL 上面跑的。

  4. 平安銀行、中國農業銀行、華夏銀行、中國銀行都有相關業務在 TDSQL 上。

TiDB

  1. 北京銀行的網聯支付業務,所有北京銀行的銀行卡綁定在比如支付寶、微信上的支付操作,後端的資料庫就是運行在 TiDB,而且是一個典型的兩地三中心同城雙活的架構,這個業務非常的關鍵,如果業務中斷超過一定時間,就是需要上報銀監會的。

  2. 日本排名第一的支付公司——Paypay,錢包和支付的業務都在 TiDB 上面。

  3. 中國人壽的壽財險業務,正在用 TiDB 陸續替換 Oracle 。

  4. 肯德基所有的會員登錄系統,包括 KFC 的 APP 以及第三方登錄,後臺資料庫都是用的 TiDB ,這套業務 2020 年 4 月份上線,已經經歷過多次肯德基的大促等活動,目前肯德基的後臺支付系統也已經切換到 TiDB 上。

  5. 麥當勞的賬戶以及訂單系統全部基於 TiDB,如果 TiDB 出問題了,那麼國內所有的麥當勞門店,包括線上和線下的點單系統都將沒法正常運行。

  6. 微眾銀行最核心和最賺錢的微粒貸業務,後臺的全量批處理業務就運行在 TiDB 上面。

分庫分表和 NewSQL 到底怎麼選?

分庫分表是一個重量級的方案,它會帶來很多新的問題,對基建和運維的要求也很高。

NewSQL 功能強大但也有功能缺陷。

如何去抉擇需要根據系統現狀和公司情況去綜合判斷。

圖片

分庫分表是一個重量級的方案,如果_讀寫分離_、冷熱分離_等輕量級方案能解決的問題就沒必要上_分庫分表

如果緩存分流和讀寫分離都扛不住了,且你身處互聯網企業,基建尚可且運維也跟得上,_分庫分表_仍然是第一選擇;

但如果你身處一個傳統的企業,基建很差甚至沒有基建,那麼你可以考慮考慮_NewSQL_。

技術沒有高低之分,能解決問題的技術就是好技術,技術方案選擇上切莫炫技,也切勿過度設計!

參考資料

image-20210131205854199
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 讀了 @SnailMann大佬【MySQL筆記】正確的理解MySQL的MVCC及實現原理 收益頗豐,非常感謝! 但對其中如何判斷事務是否可見性還是不太理解,於是作了本文,在原博客基礎上,舉例畫圖論證、理解了**Read View**的可見性判斷。 引用 @SnailMann大佬【MySQL筆記】正確 ...
  • redis 憑藉著強大的功能和可靠的穩定性,應用場景越來越廣。逐漸成為軟體開發工程師必備的技能之一。 本篇文章,暫不做基本功能的介紹。直接教大家如何部署redis集群。 集群演進主要分為2部分。 ##一、主從備份機制 一個redis 主服務可以擁有多個從服務;一個從伺服器,只可擁有一個主服務。從服務 ...
  • ClickHouse集群的搭建和部署和單機的部署是類似的,主要在於配置的不一致,如果需要瞭解ClickHouse單機的安裝設部署,可以看看這篇文章,ClickHouse(03)ClickHouse怎麼安裝和部署。 ClickHouse集群部署流程大概如下: 環境準備 在每台機器上安裝單機版Click ...
  • MySQL 高級 1、約束 1.1、約束介紹 什麼是約束 對錶中的數據進行限定,保證數據的正確性、有效性、完整性 約束類型 | 約束 | 說明 | | : : | : : | | PRIMARY KEY | 主鍵約束 | | UNIQUE | 唯一約束 | | NOT NULL | 非空約束 | | ...
  • 原文鏈接:批流一體數據集成工具ChunJun同步Hive事務表原理詳解及實戰分享 課件獲取:關註公眾號__ “數棧研習社”,後臺私信 “ChengYing”__ 獲得直播課件 視頻回放:點擊這裡 ChengYing 開源項目地址:github 丨 gitee 喜歡我們的項目給我們點個__ STAR! ...
  • dolphinscheduler單機化改造 轉載請註明出處: https://www.cnblogs.com/funnyzpc/p/16466920.html 前面 其實如果單機的話直接走standalone-server就可以了,簡單又快捷,如果更改的話 後期要升級可能又需要維護個版本才可,所以簡 ...
  • SQL Server 中的事務是什麼? 事務是應該作為一個單元執行的一組 SQL 語句。這意味著事務確保所有命令都成功或都不成功。如果事務中的命令之一失敗,則所有命令都失敗,並且在資料庫中修改的任何數據都將回滾。 比如您在做一個銀行轉賬操作,這涉及了2個操作, 扣款和收款, 必須保證這2個操作都成功 ...
  • 前言 本文章做了把mysql表從壓縮表過渡到普通表的實驗過程,看看壓縮表變成普通表會發生什麼?本文針對mysql5.7和mysql8分別進行了實驗。 1、什麼是表壓縮 在介紹壓縮表變成普通表前,首先給大家普及下,什麼是表壓縮。 表壓縮,意思是使表中的數據以壓縮格式存儲,壓縮能夠顯著提高處理速度和壓縮 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...