說說為什麼要做資料庫拆分

来源:https://www.cnblogs.com/88223100/archive/2023/10/05/Why-do-we-need-to-do-database-splitting.html
-Advertisement-
Play Games

1. 為什麼要拆分資料庫? 單體項目在構建之初,資料庫的負載和數據量都不大,所以不需要對資料庫做拆分,小型財務系統、文書系統、ERP系統、OA系統,用一個MySQL資料庫實例基本就夠用了。 就像《淘寶技術這十年》裡面說到的,電商業務的數據量增長飛快,所以最開始的PHP+MySQL的架構已經不能滿足實 ...


1. 為什麼要拆分資料庫?

單體項目在構建之初,資料庫的負載和數據量都不大,所以不需要對資料庫做拆分,小型財務系統、文書系統、ERP系統、OA系統,用一個MySQL資料庫實例基本就夠用了。

就像《淘寶技術這十年》裡面說到的,電商業務的數據量增長飛快,所以最開始的PHP+MySQL的架構已經不能滿足實際要求了,於是淘寶想到的第一個辦法就是把MySQL替換成Oracle。但是沒過了多久,在08年前後,單節點的Oracle資料庫也不好用了,於是淘寶終於告別了單節點資料庫,開始拆分資料庫。從一個節點,變成多個節點。

拆分資料庫是有講究的,比如說拆分方法有兩種:垂直切分和水平切分。那你是先水平切分還是垂直切分呢?順序無所謂?不,順序有所謂,次序絕對不能錯:先水平切分,然後垂直切分。

2. 什麼是垂直切分?

垂直切分是根據業務來拆分資料庫,同一類業務的數據表拆分到一個獨立的資料庫,另一類的數據表拆分到其他資料庫。

比如說一個新零售的電商資料庫,我們可以把跟商品相關的數據表拆分成一個資料庫,然後在這些數據表的基礎之上,構建出商品系統。比如用JAVA或者PHP語言,創建出一個商城系統。然後把跟進銷存相關的數據表拆分到另外一個資料庫上,再用程式構建出倉庫系統。

圖片

垂直切分解決了什麼問題

垂直切分可以降低單節點資料庫的負載。原來所有數據表都放在一個資料庫節點上,無疑所有的讀寫請求也都發到這個MySQL上面,所以資料庫的負載太高。如果把一個節點的資料庫拆分成多個MySQL資料庫,這樣就可以有效的降低每個MySQL資料庫的負載。

垂直切分不能解決什麼問題

垂直切分不能解決的是縮表,比如說商品表無論劃分給哪個資料庫節點,商品表的記錄還是那麼多,不管你把資料庫垂直拆分的有多細緻,每個數據表裡面的數據量是沒有變化的。

MySQL單表記錄超過2000萬,讀寫性能會下降的很快,因此說垂直切分並不能起到縮表的效果。

3. 什麼是水平切分?

水平切分是按照某個欄位的某種規則,把數據切分到多張數據表。一張數據表化整為零,拆分成多張數據表,這樣就可以起到縮表的效果了。

圖片

很多人,都會水平切分存在誤解,以為水平切分出來的數據表必須保存在不同的MySQL節點上。其實水平切分出來的數據表也可以保存在一個MySQL節點上面。不是水平切分一定需要多個MySQL節點。為什麼這麼說呢?

許多人不知道MySQL自帶一種數據分區的技術,可以把一張表的數據,按照特殊規則,切分存儲在不同的目錄下。如果我們給Linux主機掛載了多塊硬碟,我們完全可以利用MySQL分區技術,把一張表的數據切分存儲在多個硬碟上。這樣就由原來一塊硬碟有限的IO能力,升級成了多個磁碟增強型的IO。

水平切分的用途

水平切分可以把數據切分到多張數據表,可以起到縮表的作用。

但是也不是所有的數據表都要做水平切分。數據量較大的數據表才需要做數據切分,比如說電商系統中的,用戶表、商品表、產品表、地址表、訂單表等等。有些數據表就不需要切分,因為數據量不多,比如說品牌表、供貨商表、倉庫表,這些都是不需要切分的。

水平切分的缺點

不同數據表的切分規則並不一致,要根據實際業務來確定。所以我們在選擇資料庫中間件產品的時候,就要選擇切分規則豐富的產品。常見的資料庫中間件有:MyCat、Atlas、ProxySQL等等。有些人覺得MyCat是Java語言開發的,就懷疑MyCat運行效率。其實資料庫中間件的作用相當於SQL語句的路由器。你家路由器硬體配置不怎麼高,但是不影響你享用百兆寬頻。MyCat也是一個道理,它僅僅是起到SQL語句轉發的作用,並不會實際執行SQL語句。我推薦使用MyCat最主要的原因是它自帶了非常多的數據切分規則,我們可以按照主鍵求模切分數據,可以按照主鍵範圍切分數據,還可以按照日期切分數據等等。因此說,為了滿足業務的需要,MyCat目前來說算是非常不錯的中間件產品。

水平切分的另一個缺點就是擴容比較麻煩,日積月累,分片遲早有不夠用的時候。這時候不是首先選擇增加新的集群分片。因為一個MySQL分片,需要4~8個MySQL節點(最小規模),增加一個分片的投入成本是很高的。所以正確的做法是做冷熱數據分離,定期對分片中的數據歸檔。把過期的業務數據,從分片中轉移到歸檔庫。目前來說數據壓縮比最高的MySQL引擎是TokuDB,而且帶著事物的寫入速度是InnoDB引擎的6-14倍。用TokuDB作為歸檔資料庫最適合不過。

圖片

4. 為什麼先做水平切分,後作垂直切分?

隨著數據量的增加,最先應該做的是數據分片,利用多塊硬碟來增大數據IO能力和存儲空間,這麼做的成本是最低的。幾塊硬碟的錢就能收穫不錯的IO性能。

進入到下一個階段,數據量繼續增大,這時候我們應該把數據切分到多個MySQL節點上,用MyCat管理數據切分。當然還要做數據的讀寫分離等等,這裡不展開討論。在後臺做水平切分的同時,業務系統也可以引入負載均衡、分散式架構等等。理論上,使用了冷熱數據分離之後,水平切分這種方式可以繼續維持很長一段時間,數據量再大也不怕,定期歸檔就好了。

資料庫到了水平切分的階段,數據量的增加已經不是更改架構設計的主要原因了。反而這個階段業務系統承受不住了,如果再不對系統做模塊拆分,業務系統也撐不下去了,所以按照模塊和業務,把一個系統拆分成若幹子系統。若幹子系統之間,數據相對獨立。比如淘寶不會跟支付支付寶分享全部數據,共用同一套數據表,這也影響各自業務的發展。所以就要弄垂直切分了,把數據表歸類,拆分成若幹個資料庫系統。

講到這裡,你仔細想想。如果過早的對資料庫做了垂直切分,勢必要重新構建若幹獨立的業務系統,工作量太巨大。水平切分並不需要業務系統做大幅度的修改,因此說應該先從水平切分開始做。

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Why-do-we-need-to-do-database-splitting.html


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

-Advertisement-
Play Games
更多相關文章
  • AOP(Aspect Oriented Programming,面向切麵編程),通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。 ...
  • 在每個Java新版本發佈的特性中,都會包含一些Preview(預覽)功能,這些功能主要用來給開發者體驗並收集建議。所以,Preview階段的功能並不是預設開啟的。 如果想體驗某個Java版本中的Preview功能,您還需要做一些設置才能把程式跑起來。 下麵以IDEA 2023.2為例,演示為Java ...
  • 當讀者需要獲取到特定進程內的寄存器信息時,則需要在上述代碼中進行完善,首先需要編寫`CREATE_PROCESS_DEBUG_EVENT`事件,程式被首次載入進入記憶體時會被觸發此事件,在該事件內首先我們通過`lpStartAddress`屬性獲取到當前程式的入口地址,並通過`SuspendThrea... ...
  • 1. 簡介 機緣巧合下寫的一個工程,本來是作為商家視覺識別上位機的替代品,但是最後沒用上,因此只開發了一半(廠家升級了攝像頭和軟體) 該工程基於WPF的.net6+mvvm 調用攝像頭進行識別 opencv開攝像頭(不想自己封裝win32api),yolov5對圖像進行檢測 2.引用庫 MVVM C ...
  • 經過版本更新,Mini API 的功能逐步完善,早期支持得不太好的 mini API 現在許多特性都可以用了,比如灰常重要的依賴註入。 咱們先來個相當簡單的註入測試。來,定義一個服務類,為了偷懶,老周這裡就不使用 介面 + 實現類 的方式了。 public class MyService : IDi ...
  • 眾所周知,在Cortex-M內核中,系統節拍由Systick時鐘提供,當配置好系統滴答時鐘後,每次時鐘中斷就會觸發中斷處理函數 xPortSysTickHandler(), void xPortSysTickHandler( void ) { /* The SysTick runs at the l ...
  • 搭建msf 官方有提供一鍵安裝腳本,如下: curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate ...
  • MySQL 是世界上最流行的開源關係型資料庫管理系統之一,而其中的存儲引擎則是其關鍵組成部分之一。InnoDB 存儲引擎在 MySQL 中扮演了重要角色,提供了許多高級功能和性能優化,適用於各種應用程式和工作負載。本文將深入介紹 InnoDB 存儲引擎的各個方面,以幫助您更好地理解它的特性和優勢。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...