在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

你是否知道分庫分表需要哪些要素?

jf_ro2CN3Fa ? 來源:小姐姐味道 ? 作者:小姐姐養的狗 ? 2022-10-12 10:39 ? 次閱讀

數據庫中間件之分庫分表

切入層次

① 編碼層

② 框架層

③ 驅動層

④ 代理層

⑤ 實現層

驅動層和代理層對比

驅動層特點

代理層特點

共同點

使用限制

產品

流程解決方案

信息收集

前期準備

實施階段

題外話

數據庫中間件之分庫分表

恭喜你,貴公司終于成長到一定規模,需要考慮高可用,甚至分庫分表了。但你是否知道分庫分表需要哪些要素?拆分過程是復雜的,提前計劃,不要等真正開工,各種意外的工作接踵而至,以至失控。

本文意圖打開數據庫中間件的廣度,而不考慮實現深度,至于庫表垂直和水平分的概念和緣由,不做過多解釋。所以此文面向的是有一定研發經驗,正在尋找選型和拆分流程的專業人士。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

切入層次

以下,范圍界定在JAVA和MySQL中。我們首先來看一下分庫分表切入的層次。

95a05bfe-49d2-11ed-a3b6-dac502259ad0.jpg

① 編碼層

在同一個項目中創建多個數據源,采用if else的方式,直接根據條件在代碼中路由。Spring中有動態切換數據源的抽象類,具體參見AbstractRoutingDataSource。

如果項目不是很龐大,使用這種方式能夠快速的進行分庫。但缺點也是顯而易見的,需要編寫大量的代碼,照顧到每個分支。當涉及跨庫查詢、聚合,需要循環計算結果并合并的場景,工作量巨大。

如果項目裂變,此類代碼大多不能共用,大多通過拷貝共享。長此以往,碼將不碼。

② 框架層

這種情況適合公司ORM框架統一的情況,但在很多情況下不太現實。主要是修改或增強現有ORM框架的功能,在SQL中增加一些自定義原語或者hint來實現。

通過實現一些攔截器(比如Mybatis的Interceptor接口),增加一些自定義解析來控制數據的流向,效果雖然較好,但會改變一些現有的編程經驗。

很多情況要修改框架源碼,不推薦

③ 驅動層

基于在編碼層和框架層切入的各種缺點,真正的數據庫中間件起碼要從驅動層開始。什么意思呢?其實就是重新編寫了一個JDBC的驅動,在內存中維護一個路由列表,然后將請求轉發到真正的數據庫連接中。

像TDDL、ShardingJDBC等,都是在此層切入。

包括Mysql Connector/J的Failover協議 (具體指“load balancing”、“replication”、“farbic”等), 也是直接在驅動上進行修改。

請求流向一般是這樣的:

95b44146-49d2-11ed-a3b6-dac502259ad0.jpg

④ 代理層

代理層的數據庫中間件,將自己偽裝成一個數據庫,接受業務端的鏈接。然后負載業務端的請求,解析或者轉發到真正的數據庫中。

像MySQL Router、MyCat等,都是在此層切入。

請求流向一般是這樣的:

95e0f178-49d2-11ed-a3b6-dac502259ad0.jpg

⑤ 實現層

SQL特殊版本支持,如Mysql cluster本身就支持各種特性,mariadb galera cluster支持對等雙主,Greenplum支持分片等。

需要換存儲,一般是解決方案,就不在討論之列了。

技術最終都會趨于一致,選擇任何一種、都是可行的。但最終選型,受開發人員熟悉度、社區活躍度、公司切合度、官方維護度、擴展性,以及公司現有的數據庫產品等多方位因素影響。選擇或開發一款合適的,小伙伴們會幸福很多。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

驅動層和代理層對比

通過以上層次描述,很明顯,我們選擇或開發中間件,就集中在驅動層和代理層。在這兩層,能夠對數據庫連接和路由進行更強的控制和更細致的管理。但它們的區別也是明顯的。

驅動層特點

僅支持JAVA,支持豐富的DB

驅動層中間件僅支持Java一種開發語言,但支持所有后端關系型數據庫。如果你的開發語言固定,后端數據源類型豐富,推薦使用此方案。

95fbbd28-49d2-11ed-a3b6-dac502259ad0.jpg

占用較多的數據庫連接

驅動層中間件要維護很多數據庫連接。比如一個分了10個 的表,每個java中的Connection要維護10個數據庫連接。如果項目過多,則會出現連接爆炸(我們算一下,如果每個項目6個實例,連接池中minIdle等于5,3個項目的連接總數是 10*6*5*3 = 900 個)。像Postgres這種每個連接對應一個進程的數據庫,壓力會很大。

數據聚合在業務實例執行

數據聚合,比如count sum等,是通過多次查詢,然后在業務實例的內存中進行聚合。

路由表存在于業務方實例內存中,通過輪詢或者被動通知的途徑更新路由表即可。

集中式管理

所有集群的配置管理都集中在一個地方,運維負擔小,DBA即可完成相關操作。

典型實現

961925f2-49d2-11ed-a3b6-dac502259ad0.jpg

代理層特點

異構支持,DB支持有限

代理層中間件正好相反。僅支持一種后端關系型數據庫,但支持多種開發語言。如果你的系統是異構的,并且都有同樣的SLA要求,則推薦使用此方案。

9624770e-49d2-11ed-a3b6-dac502259ad0.jpg

運維負擔大

代理層需要維護數據庫連接數量有限(MySQL Router那種粘性連接除外)。但作為一個獨立的服務,既要考慮單獨部署,又要考慮高可用,會增加很多額外節點,更別提用了影子節點的公司了。另外,代理層是請求唯一的入口,穩定性要求極高,一旦有高耗內存的聚合查詢把節點搞崩潰了,都是災難性的事故。

典型實現

96428bf4-49d2-11ed-a3b6-dac502259ad0.jpg

共同點

篇幅有限,不做過多討論。訪問各中間件宣傳頁面,能夠看到長長的Feature列表,也就是白名單;也能看到長長的限制列表,也就是黑名單。限定了你怎么玩,在增強了分布式能力后,分庫分表本身就是一個閹割的數據庫。

使用限制

確保數據均衡

拆分數據庫的數據盡量均勻,比如按省份分user庫不均勻,按userid取模會比較均勻

不用深分頁

不帶切分鍵的深分頁,會取出所有庫所取頁數之前的所有數據在內存排序計算。容易造成內存溢出。

減少子查詢

子查詢會造成SQL解析紊亂,解析錯誤的情況,盡量減少SQL的子查詢。

事務最小原則

盡量縮小單機事務涉及的庫范圍,即盡可能減少夸庫操作,將同類操作的庫/表分在一起

數據均衡原則

拆分數據庫的數據盡量均勻,比如按省份分user庫不均勻,按userid取模會比較均勻

特殊函數

distinct、having、union、in、or等,一般不被支持?;蛘弑恢С?,使用之后會增加風險,需要改造。

產品

建議聚焦在MyCat和ShardingJDBC上。另外,還有大量其他的中間件,不熟悉建議不要妄動。數據庫中間件不好維護,你會發現大量半死不活的項目。

以下列表,排名不分先后,有幾個是只有HA功能,沒有拆分功能的:

Atlas、Kingshard、DBProxy、mysql router、MaxScale、58 Oceanus、ArkProxy、Ctrip DAL、Tsharding、Youtube vitess、網易DDB、Heisenberg、proxysql、Mango、DDAL、Datahekr、MTAtlas、MTDDL、Zebra、Cobar、Cobar

汗、幾乎每個大廠都有自己的數據庫中間件(還發現了幾個喜歡拿開源組件加公司前綴作為產品的),只不過不給咱用罷了。

流程解決方案

無論是采用哪個層面切入進行分庫分表,都面臨以下工作過程。

966edc5e-49d2-11ed-a3b6-dac502259ad0.jpg

信息收集

統計影響的業務和項目

項目范圍越大,分庫難度越高。有時候,一句復雜的SQL能夠涉及四五個業務方,這種SQL都是需要重點關注的。

確定分庫分表的規模,是只分其中的幾張表,還是全部涉及。分的越多,工作量越大,幾乎是線性的。

還有一些項目是牽一發動全身的。舉個例子,下面這個過程,影響的鏈路就不僅是分庫這么簡單了。

9690062c-49d2-11ed-a3b6-dac502259ad0.jpg

確定參與人員

除了分庫分表組件的技術支持人員,最應該參與的是對系統、對現有代碼最熟悉的幾個人。只有他們能夠確定哪些SQL該廢棄掉、SQL的影響面等。

確定分庫分表策略

確定分庫分表的維度和切分鍵。切分鍵(就是路由數據的column)一旦確定,是不允許修改的,所以在前期架構設計上,應該首先將其確立下來,才能進行后續的工作;數據維度多意味著有不同的切分鍵,達到不同條件查詢的效果。這涉及到數據的冗余(多寫、數據同步),會更加復雜。

前期準備

數據規整

庫表結構不滿足需求,需要提前規整。比如,切分鍵的字段名稱不同或者類型各異。在實施分庫分表策略時,這些個性會造成策略過大不好維護。

掃描所有SQL

將項目中所有的SQL掃描出來,逐個判斷是否能夠按照切分鍵正常運行。在判斷過程中肯定會有大量不合規的SQL,則都需要給出改造方案,這是主要的工作量之一。

驗證工具支持

直接在原有項目上進行改動和驗證是可行的,但會遇到諸多問題,主要是效率太低。我傾向于首先設計一些驗證工具,輸入要驗證的SQL或者列表,然后打印路由信息和結果進行判斷。

技術準備

建議以下提到的各個點,都找一個例子體驗一下,然后根據自己的團隊預估難度。

以下:中間件所有不支持的SQL類型 整理容易造成崩潰的注意事項 不支持的SQL給出處理方式 考慮一個通用的主鍵生成器 考慮沒有切分鍵的SQL如何處理 考慮定時任務等掃全庫的如何進行遍歷 考慮跨庫跨表查詢如何改造 準備一些工具集

實施階段

數據遷移

分庫分表會重新影響數據的分布,無論是全量還是增量,都會涉及到數據遷移,所以Databus是必要的。

一種理想的狀態是所有的增刪改都是消息,可以通過訂閱MQ進行雙寫。

9698a782-49d2-11ed-a3b6-dac502259ad0.jpg

但一般情況下,仍然需要去模擬這個狀態,比如使用Canal組件。

96b56ff2-49d2-11ed-a3b6-dac502259ad0.jpg

怎么保證數據安全的切換,我們分其他章節進行討論。

充足的測試

分庫分表必須經過充足的測試,每一句SQL都要經過嚴格的驗證。如果有單元測試或者自動化測試工具,完全的覆蓋是必要的。一旦有數據進行了錯誤的路由,尤其是增刪改,將會創造大量的麻煩。

在測試階段,將驗證過程輸出到單獨的日志文件,充足測試后review日志文件是否有錯誤的數據流向。

SQL復驗

強烈建議統一進行一次SQL復驗。主要是根據功能描述,確定SQL的正確性,也就是通常說的review。

演練

在非線上環境多次對方案進行演練,確保萬無一失。

制定新的SQL規范

分庫分表以后,項目中的SQL就加了枷鎖,不能夠隨意書寫了。很多平常支持的操作,在拆分環境下就可能運行不了了。所以在上線前,涉及的SQL都應該有一個確認過程,即使已經經過了充足的測試。

題外話

沒有支持的活別接,干不成。

分庫分表是戰略性的技術方案,很多情況無法回退或者回退方案復雜。如果要拆分的庫表涉及多個業務方,公司技術人員復雜,CTO要親自掛帥進行協調,并有專業仔細的架構師進行監督。沒有授權的協調人員會陷入尷尬的境地,導致流程失控項目難產。




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JDBC
    +關注

    關注

    0

    文章

    25

    瀏覽量

    13431
  • MYSQL數據庫
    +關注

    關注

    0

    文章

    96

    瀏覽量

    9453
  • DAL
    DAL
    +關注

    關注

    0

    文章

    4

    瀏覽量

    5409

原文標題:設計糟糕的分庫分表是如何把系統搞掛的?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數據庫分區、分庫

    今天先說說數據庫的數據分區,分庫以及的內容吧! 數據庫分區、分庫 數據庫分區、
    的頭像 發表于 09-30 11:24 ?2919次閱讀

    談分布式數據庫中間件之分庫   

      分庫,顧名思義就是把原本存儲于一個庫的數據分塊存儲到多個庫上,把原本存儲于一個的數據分塊存儲到多個上。那么關于
    發表于 08-02 20:19

    分庫是什么?怎么實現?

    數據庫分庫、讀寫分離的原理實現,使用場景
    發表于 10-25 17:24

    關于 EMC 損失需要知道

    方程的一部。因此,在使用列線圖時不必使用頻率。知道需要12貝的衰減(就像以前一樣) ,
    發表于 06-18 14:42

    不用那么麻煩,從iPhone上就可以知道的電池是否需要更換

    有一種方法可以直接的了解的手機電池是否需要更換。iPhone系統需要在iOS10.2.1或以上才可以
    發表于 02-28 13:52 ?2.5w次閱讀

    利用Mycat實現MySQL讀寫分離、分庫最佳實踐

    利用Mycat實現MySQL讀寫分離、分庫最佳實踐
    發表于 09-08 10:20 ?14次下載
    利用Mycat實現MySQL讀寫分離、<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>最佳實踐

    數據庫分庫基礎和實踐

    決上述問題?如果僅僅通過增加一個主實例來分擔寫請求,寫操作如何在兩個主實例之間同步來保證數據一致性,如何避免雙寫,問題會變的更加復雜。這時就需要用到分庫(sharding),對寫操
    發表于 09-05 16:40 ?269次閱讀

    你們知道為什么要分庫

    在文章開頭先拋幾個問題: (1)什么時候才需要分庫呢?我們的評判標準是什么? (2)一張存儲了多少數據的時候,才
    的頭像 發表于 08-16 10:37 ?1571次閱讀

    優化MySQL數據庫中樸實無華的和花里胡哨的分庫

    4、水平分庫 總結 首先我們要知道分庫、都是干啥的,本文主角還是我們的MySQL為第一視角。首先從字面意思來看:
    的頭像 發表于 08-26 16:33 ?1291次閱讀

    什么是分庫?為什么分庫?什么情況下會用分庫呢?

    分庫是由分庫這兩個獨立概念組成的,只不過通常分庫
    的頭像 發表于 11-30 09:37 ?7615次閱讀

    分庫的21條法則速來碼住(上)

    還是不著急實戰,咱們先介紹下在分庫架構實施過程中,會接觸到的一些通用概念,了解這些概念能夠幫助理解市面上其他的分庫表工具,盡管它們的實
    的頭像 發表于 05-26 17:33 ?600次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>的21條法則速來碼?。ㄉ希? />    </a>
</div>                            <div   id=

    分庫的21條法則速來碼?。ㄏ拢?/a>

    還是不著急實戰,咱們先介紹下在分庫架構實施過程中,會接觸到的一些通用概念,了解這些概念能夠幫助理解市面上其他的分庫表工具,盡管它們的實
    的頭像 發表于 05-26 17:33 ?676次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>的21條法則速來碼?。ㄏ拢? />    </a>
</div>                            <div   id=

    如何知道的代碼是否線程安全

    的?如何知道的代碼是否線程安全?要如何訪問數據才能保證數據的安全? 本篇文章會一一回答的問題。 1. 線程不安全是怎樣的? 要搞清楚什么是線程安全,就要先了解線程不安全是什么樣的。
    的頭像 發表于 11-01 11:42 ?769次閱讀
    如何<b class='flag-5'>知道</b><b class='flag-5'>你</b>的代碼<b class='flag-5'>是否</b>線程安全

    分庫后復雜查詢的應對之道:基于DTS實時性ES寬構建技術實踐

    ,通過分庫應對存系統讀寫性能瓶頸和存儲瓶頸;分庫
    的頭像 發表于 06-25 18:30 ?911次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>后復雜查詢的應對之道:基于DTS實時性ES寬<b class='flag-5'>表</b>構建技術實踐

    軟件系統數據庫的分庫設計

    軟件系統數據庫的分庫設計 系統讀寫分離、分庫技術實現采用MyCat中間件,MyCat 是
    的頭像 發表于 08-22 11:39 ?368次閱讀
    軟件系統數據庫的<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>設計
    主站蜘蛛池模板: 黄网免费观看 | 国产操女 | a一级 | 在线视频人人视频www | 一级片特黄 | 自偷自拍亚洲欧美清纯唯美 | 午夜精品久久久久久久第一页 | 好硬好大好爽女房东在线观看 | 中文字幕天堂在线 | 四虎永久在线精品国产免费 | 91久久精品青青草原伊人 | 国产一级做a爱免费视频 | 日韩一级片在线免费观看 | 2019天天操天天干天天透 | 日本大片免aaa费观看视频 | 最好看的2019中文字幕1 | 天天草天天草 | 国产精品一久久香蕉产线看 | 4438x五月天| 色批网站www | 91婷婷色涩涩 | 天天爽夜夜爽视频 | 欧美特黄特色aaa大片免费看 | 黄色片不卡 | 欧美一级艳片视频免费观看 | 亚洲精品亚洲人成人网 | 最新亚洲情黄在线网站 | 成年香蕉大黄美女美女 | 黑粗硬大欧美视频 | xxxx日本69xxxxx| 模特视频一二三区 | 牛牛精品 | 一区二区中文字幕亚洲精品 | 不卡无毒免费毛片视频观看 | aaa免费视频| 污污的网站免费阅读 | 久久夜色精品国产噜噜 | 天天在线天天看成人免费视频 | 香蕉视频黄色在线观看 | 怡红院最新网址 | 亚洲伦理一区二区三区 |