欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

這7個問題難以解決!分庫分表也沒吹的那么神……

admin
2024年11月8日 14:32 本文熱度 977

為什么需要分庫分表?是因為MySQL等數(shù)據(jù)庫單庫單表能支撐的系統(tǒng)并發(fā)量和數(shù)據(jù)存儲量存在瓶頸。


中國有超過 10 億的網(wǎng)民,單日交易量超過百萬、千萬單的交易場景越來越多。按照一行數(shù)據(jù) 1K ,每日訂單量 500 萬計算,一年需要的數(shù)據(jù)存儲為 1700G,行數(shù)1.7億。


顯然此種情況MySQL 單庫單表難以保證查詢寫入性能。一張表一年的數(shù)據(jù)量恐怖如斯,交易場景成百上千張表,年復一年,所帶來的存儲和并發(fā)量壓力何其巨大呢?業(yè)務牽引技術的發(fā)展,分庫分表技術應運而生。


目前分庫分表技術似乎成為行業(yè)標準,站在鄙視鏈上游。不分庫分表的系統(tǒng)似乎都是毫無亮點的垃圾系統(tǒng),然而真的如此嗎?


  • 分庫分表技術是完美的解決方案嗎?它有哪些不足之處?

  • 為什么單庫單表存在系統(tǒng)瓶頸,就選擇分庫分表呢?有其他更好的方案嗎?


接下來我將分享自己在電商交易場景實際遇到的痛點:


一、分庫分表難以解決分布式事務問題


一般情況下通過選擇合適的分片屬性,可以保證業(yè)務在一個數(shù)據(jù)庫內完成事務操作。


如用戶領券場景,用戶一次領取 3 張優(yōu)惠券,系統(tǒng)寫入 3 條優(yōu)惠券記錄和一條領券流水,使用 UserId 進行分庫分表,可以保證同一個用戶的 4 條記錄路由到同一數(shù)據(jù)庫,可使用 MySQL 本地事務即可保證數(shù)據(jù)一致性。


然而**當同一個事務中多張表的分片屬性不同時,難以保證這些表在同一個數(shù)據(jù)庫內完成事務操作,勢必會出現(xiàn)難以解決的分布式事務難題**


如優(yōu)惠券存在庫存,在發(fā)券時需同時扣減券庫存,庫存粒度為券模版ID,用戶可同時領取多個券模版的券。如何保證庫存扣減、用戶發(fā)券、領取流水等在同一個數(shù)據(jù)庫內完成呢?難以實現(xiàn)


優(yōu)惠券和領券流水,基于 UserId 拆分數(shù)據(jù)庫,但庫存表無用戶屬性,只能使用券模版 ID分庫。然而不同的分片屬性,無法保證在同一個數(shù)據(jù)庫完成事務操作,難以保證數(shù)據(jù)強一致性。


因此 當同一個事務中多張表的分片屬性不同時,難以保證這些表在同一個數(shù)據(jù)庫內完成事務操作,勢必會出現(xiàn)難以解決的分布式事務難題。即便業(yè)務側使用復雜的業(yè)務架構也難以實現(xiàn)強一致性,作出妥協(xié)后,可實現(xiàn)最終一致性。


分庫分表技術把數(shù)據(jù)庫解決不了的問題推到業(yè)務側,“脅迫” 業(yè)務側使用復雜方案參與解決,要求業(yè)務側在數(shù)據(jù)一致性上作出妥協(xié)


二、分庫分表難以實現(xiàn)非分片屬性的索引查詢能力


電商交易場景一般使用 UserId 作為分片屬性,聯(lián)合索引的前綴都是UserId,但這并不絕對,交易場景中存在品牌、門店、司機、配送等其他維度。


如訂單表使用UserId 作為分片屬性進行分庫分表,查詢商家在最近 1 小時的訂單如何實現(xiàn)呢?由于使用 UserId 分庫分表,當使用商家 ID 查詢時,需要查詢所有的分庫分表,這顯然不現(xiàn)實。


業(yè)務側有幾種實現(xiàn)方案,1)使用商家 ID分庫分表,異構另一份 MySQL存儲 2)基于 ElasticSearch,異構另一種存儲支撐其他維度的檢索場景。


無論哪一種方案都會導致,數(shù)據(jù)一致性降低,但系統(tǒng)復雜度增加。


查詢商家最近1 小時的訂單,業(yè)務上如此簡單清晰的需求,在分庫分表后,實現(xiàn)方案竟如此復雜。此外還要求業(yè)務在數(shù)據(jù)準確性上作出妥協(xié)。


正是因為分庫分表技術的先天不足,所以極大地增加了業(yè)務系統(tǒng)架構的復雜性。(甚至很多人以架構復雜為榮,錯誤的認為系統(tǒng)越復雜越能體現(xiàn)架構能力)


此外還有其他更加 tricky的方案,如為了實現(xiàn)訂單 Id 查詢,在生成的訂單Id中存放UserId后四位(大概意思),用于定位訂單在哪個分片。


三、分庫分表導致的全局主鍵問題


MySQL 主鍵支持自增 ID,但是這一特性在分庫分表后淪為雞肋功能,系統(tǒng)需要分布式方式的 ID 生成器。


如優(yōu)惠券系統(tǒng)在分庫分表后,優(yōu)惠券 ID 需要借助分布式ID生成器生成全局唯一 ID。常見的實現(xiàn)方式包括 UUID、雪花算法、美團 Leaf、百度 UidGenerator等。除維護業(yè)務系統(tǒng)外,還需要維護其他純技術類系統(tǒng)。


毫無疑問,這再次增加架構的復雜性。


四、分庫分表難以建立全局唯一鍵約束


除全局主鍵問題,全局唯一鍵也難以實現(xiàn)。當全局唯一鍵的前綴是非分片屬性時,難以實現(xiàn)全局唯一鍵。


例如訂單在履約完成后,會生成一筆履約單。系統(tǒng)明確一筆訂單只能有一筆履約單,因此履約單上的訂單 ID 字段應該增加唯一鍵約束。然而履約單在基于 UserID 分庫分表后,OrderId建立的唯一鍵約束只在本表內唯一,不能保證在所有的分片內實現(xiàn)全局唯一。


因此 分庫分表后,數(shù)據(jù)庫無法對 OrderId等非分片屬性建立全局的唯一性約束。


除以上具體場景外,分庫分表面臨的難題依然有很多,如擴容難問題、存儲成本高、運維成本高、高可用難等等問題。


五、分庫分表需要持續(xù)造輪子


選擇分庫分表后,需要業(yè)務系統(tǒng)開發(fā)和接入很多輪子,包括


ShardingSphere、mycat等方便客戶端接入分庫分表。如果使用 ShardingSphere需考慮多種語言多套輪子,使用 Mycat代理層方案又會面臨性能風險。


  • 分布式 ID 生成器生成全局 ID

  • 為了支持非分片查詢,需要 DTS 消費binlog,異構存儲For 查詢。

  • 使用 ElasticSearch用于其他維度檢索。

  • 分庫分表管理后臺支持查詢數(shù)據(jù)、修改數(shù)據(jù)

  • 分庫分表管理工具支持高效建表、修改表、加索引等 DDL 操作。(1000 張表后,手動建表不現(xiàn)實)

  • ……


層出不窮的問題,需要層出不窮的輪子,有些輪子需要自己造,如分庫分表管理工具等。


不禁要問,互聯(lián)網(wǎng)大廠能承受如此復雜架構方案,所有的公司都能承受嗎?導致架構如此復雜的根源是什么呢?分庫分表方案上的先天不足


六、分庫分表后面臨老大難的擴容問題


在系統(tǒng)建設之初,一個合格的架構師必須考慮到:未來數(shù)據(jù)量龐大后的存儲擴容問題。這往往讓人很難抉擇,因為要權衡當下的硬件成本和未來擴容成本。


使用分庫分表后,擴容非常困難。如8 個數(shù)據(jù)庫,想繼續(xù)拆分為 16 個數(shù)據(jù)庫,一定會對業(yè)務造成影響,停機遷移是難以避免的問題,需要極多的運維工具保障擴容過程的安全性和快速性,做到對業(yè)務影響程度最低。因此擴容成本和風險都極高。


如果在系統(tǒng)建設初期就拆分為 16 個庫,又會面臨硬件和運維成本過高的問題。如果每一個業(yè)務在系統(tǒng)建設初期都如此鋪張浪費,那么公司的硬件成本將極高。


七、大量分庫分表導致運維成本激增


僅一個業(yè)務團隊就16 個數(shù)據(jù)庫,公司那么多業(yè)務將會有多么龐大規(guī)模的數(shù)據(jù)庫實例。有 DBA 曾分享經歷,他一天新部署了120 套 mysql實例,可想而知,DBA 們面臨了多么龐大的運維壓力。


研發(fā)視角和 DBA視角不同,結論不同。業(yè)務研發(fā)更多考慮容量不足和并發(fā)度不足風險,會傾向于設置較大的分庫分表規(guī)模,而 DBA 會考慮運維成本、硬件成本,希望數(shù)據(jù)庫規(guī)模在可控范圍內。兩者站在不同的視角,各有理由,這是一個矛盾。


我相信大多數(shù)業(yè)務研發(fā)不清楚,自家公司MySQL單庫單實例的最高并發(fā)度,最高容量,在設置分片規(guī)模時往往是拍腦袋決定。只要研發(fā)定的分片方案不離譜,往往 DBA也就接受了。


這些決策中,往往還摻雜歷史問題。如團隊已經有了 10 個庫,無論業(yè)務規(guī)模如何,新表默認拆分10 個庫,而不會考慮是否真的需要 10 個庫。


八、為什么業(yè)務系統(tǒng)要替數(shù)據(jù)庫負重前行?


分庫分表技術把數(shù)據(jù)庫解決不了的問題推到業(yè)務側,“脅迫” 業(yè)務側使用復雜方案參與解決,要求業(yè)務側在數(shù)據(jù)一致性上作出妥協(xié)。


為什么單庫單表存在系統(tǒng)瓶頸,就選擇分庫分表呢?有其他更好的方案嗎?分布式數(shù)據(jù)庫。


分布式數(shù)據(jù)庫繼承了傳統(tǒng)單機數(shù)據(jù)庫的核心特性,同時還擁有分布式系統(tǒng)的處理能力。雖然起步較晚,可以預見的是它將是數(shù)據(jù)庫下一個發(fā)展方向。


如阿里的 OceanBase基于兩階段提交協(xié)議解決了分布式事務問題,提供了比肩本地事務的強一致性,此外還提供以下能力解決了分庫分表技術難以解決的問題 1、2、3、4。相比分庫分表,業(yè)務側使用分布式數(shù)據(jù)庫的門檻更低。


  • 提供了全局索引,可以為非分片屬性提供全局的索引和唯一性約束

  • 提供了全局自增主鍵,無需分布式 ID 生成器。


OceanBase 在性能、擴容能力、運維和硬件成本上,相比分庫分表有更優(yōu)的表現(xiàn)


單機數(shù)據(jù)庫能支撐的并發(fā)量和存儲量的天花板很低,分庫分表和分布式數(shù)據(jù)庫是解決此類問題的兩種方案。分庫分表通過分庫分表中間件及一系列輪子整合了獨立的數(shù)據(jù)庫實例,可解決并發(fā)量和存儲量的難題,但是犧牲了一致性,增加了使用門檻。而分布式數(shù)據(jù)庫則直面困難,使用分布式集群架構在解決并發(fā)量和存儲量挑戰(zhàn)的同時,也提供了類比單機數(shù)據(jù)庫的使用門檻和強一致性事務能力。


就像 ElaticSearch 替代 Lucene ,RedisCluster 替代單機Redis一樣,低門檻、強一致性、支持高并發(fā)大數(shù)據(jù)量存儲的分布式數(shù)據(jù)庫一定是數(shù)據(jù)庫的主流發(fā)展方向。


分庫分表更像是開源數(shù)據(jù)庫技術落后互聯(lián)網(wǎng)業(yè)務發(fā)展時,不得已的臨時過渡方案。


作者丨五陽
來源丨網(wǎng)址:https://juejin.cn/post/7407271112995651610


該文章在 2024/11/8 14:32:05 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved