主頁 > 資料庫 > 分庫分表真的適合你的系統嗎?聊聊分庫分表和NewSQL如何選擇

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

2022-07-14 08:18:26 資料庫

曾幾何時,“并發高就分庫,資料大就分表”已經成了處理 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_,

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

參考資料

  • https://shardingsphere.apache.org/document/current/cn/overview/

  • https://docs.pingcap.com/zh/tidb/stable/tidb-architecture

  • https://www.oceanbase.com/customer/home

  • https://dbaplus.cn/news-11-1854-1.html

我正在參與掘金技術社區創作者簽約計劃招募活動,點擊鏈接報名投稿,

參考資料

  • https://shardingsphere.apache.org/document/current/cn/overview/
  • https://docs.pingcap.com/zh/tidb/stable/tidb-architecture
  • https://www.oceanbase.com/customer/home
  • https://dbaplus.cn/news-11-1854-1.html
image-20210131205854199

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/499114.html

標籤:MySQL

上一篇:MySQL函式學習(四)-----聚合函式

下一篇:當mysql表從壓縮表變成普通表會發生什么

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more