題庫分庫分表架構方案

2021-09-10 09:44:59 字數 3176 閱讀 1721

個人部落格位址 題庫分庫分表架構方案/

專案背景

在現在題庫架構下,針對新購買的1300w多道資料進行整合,不影響現有功能。由於資料量偏多,需要進行資料的切分

目標場景

相容舊的功能

對1300多w資料進行分庫分表

需要對舊的資料進行整合

老師端選題組卷 可以根據 學段、學科、知識點、難度、題型 來篩選

學生端根據老師端所選題目獲取對應的題目

對3年內以後擴充套件的增量資料預留數量空間

資料樣例

學段資料量

小學1285336

初中6655780

高中6144072

學段學科

資料量初中數學

1869524

初中化學

1356224

初中英語

288440

切分方案一

切分為3個庫, 分別是小學、初中、高中 資料佔比如上

每個庫切分10個表 根據 (學科+首級知識點)%10

每個庫乙個總表

缺點:例:用到不同知識點時,需要多表獲取資料

優點:資料分布較為平均

切分方案二 (採用)

切分為3個庫, 分別是小學、初中、高中 資料佔比如上

每個庫切分10個表(全部10個學科) 根據 學科區分, 例: 數學表、物理表

每個庫乙個總表

缺點:資料不大平均, 資料量多的例數學有186w多、英語28w多

優點:當有用到組卷等需要篩選多知識點題目時,不用多表查詢

資料id 自增區間劃分

小學 1-2億

中學 2-3億

高中 3億起

關聯關係圖

根據知識點獲取題目流程

自增id

對原有的id區間段不做處理

對切分後的id自增段進行規劃

相容舊功能

解決的問題

新舊資料有重複的知識點、題目

新舊資料的結構不一樣

對舊的題庫功能**的修改

兩套題庫合併主鍵衝突問題

相容舊功能 方案一 (個人推薦)

有操作的舊的資料洗入新的結構,舊的資料只為相容原有的功能資料,不做顯示。

優點:不用變動資料結構,最新的購買的資料結構較為清晰。 易維護擴充套件,因為目前舊的資料已經整合了兩套資料

缺點:需要修改全部舊有的功能**(針對新的資料結構)

相容舊功能 方案二

把新購買的資料整合進老的資料結構,同時保留三批資料,需要處理所有表的主鍵衝突、三批各表資料去重

優點:舊有**只修改資料結構切分的部分,不用全部修改功能**

缺點:資料較亂,三套不同的資料同時存在資料庫

需要處理新的結構整合進舊的資料結構,同時需要處理主鍵衝突,

**上需要處理對應的資料

問題點採用介面卡模式(原先的**結構不變)

類圖中介軟體mycat(未使用)

什麼是mycat

乙個徹底開源的,面向企業應用開發的大資料庫集群

支援事務、acid、可以替代mysql的加強版資料庫

乙個可以視為mysql集群的企業級資料庫,用來替代昂貴的oracle集群

乙個融合記憶體快取技術、nosql技術、hdfs大資料的新型sql server

結合傳統資料庫和新型分布式資料倉儲的新一代企業級資料庫產品

乙個新穎的資料庫中介軟體產品

mycat特性

支援庫內分表(1.6)

支援單庫內部任意join,支援跨庫2表join,甚至基於caltlet的多表join

支援全域性序列號,解決分布式下的主鍵生成問題。

分片規則豐富,外掛程式化開發,易於擴充套件。

基於nio實現,有效管理執行緒,解決高併發問題。

支援通過全域性表,er關係的分片策略,實現了高效的多表join查詢

支援分布式事務(弱xa)。

支援sql黑名單、sql注入攻擊攔截

支援mysql、oracle、db2、sql server、postgresql等db的常見sql語法

遵守mysql原生協議,跨語言,跨平台,跨資料庫的通用中介軟體**。

==基於心跳的自動故障切換,支援讀寫分離,支援mysql主從,==以及galera cluster集群。

可以大幅降低開發難度,提公升開發速度

具體看 mycat 官網

mycat 注意事項

全域性表一致性檢測 1.6版本開始支援(一致性的定時檢測)

分片 join(盡量避免使用 left join 或 right join,而用 inner join)

mycat 原理

應用要面對很多個資料庫的時候,這個時候就需要對資料庫層做乙個抽象,來管理這些資料庫,而最上面的應用只需要面對乙個資料庫層的抽象或者說資料庫中介軟體就好了,這就是mycat的核心作用。

分片分析、路由分析、讀寫分離分析、快取分析等,然後將此sql發往後端的真實資料庫,並將返回的結果做適當的處理,最終再返回給使用者。

mycat 應用場景

讀寫分離,配置簡單

分表分庫,對於超過1000萬的表進行分片,最大支援1000億的單錶分片

報表系統,借助於mycat的分表能力,處理大規模報表的統計

文章整理

應用場景 那些適合,那些不適合

使用說明

總表使用mysql merge 引擎(不考慮)

合併的表使用的必須是myisam引擎

表的結構必須一致,包括索引、字段型別、引擎和字符集

對於增刪改查,直接操作總表即可。

資料切分原則

能不切分盡量不要切分。

如果要切分一定要選擇合適的切分規則,提前規劃好。

資料切分盡量通過資料冗餘或表分組(table group)來降低跨庫 join 的可能。

由於資料庫中介軟體對資料 join 實現的優劣難以把握,而且實現高效能難度極大,業務讀取盡量少使用多表 join。

盡可能的比較均勻分布資料到各個節點上

該業務欄位是最頻繁的或者最重要的查詢條件。

oracle分庫分表原理 題庫分庫分表架構方案

方案 專案背景 在現在題庫架構下,針對新購買的1300w多道資料進行整合,不影響現有功能。由於資料量偏多,需要進行資料的切分 目標場景 相容舊的功能 對1300多w資料進行分庫分表 需要對舊的資料進行整合 老師端選題組卷 可以根據 學段 學科 知識點 難度 題型 來篩選 學生端根據老師端所選題目獲取...

Mysql分庫分表方案

1.為什麼要分表 當一張表的資料達到幾千萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會死在那兒了。分表的目的就在於此,減小資料庫的負擔,縮短查詢時間。mysql中有一種機制是表鎖定和行鎖定,是為了保證資料的完整性。表鎖定表示你們都不能對這張表進行操作,必須等我對錶操作完才行。行鎖...

mysql分庫分表方案

分庫分表的幾種方式 1 把乙個例項中的多個資料庫拆分到不同的例項 2 把乙個庫中的表分離到不同的資料庫中 3 對乙個庫中的相關表進行水平拆分到不同的例項資料庫中 如何選擇分割槽鍵 1 分割槽鍵要能盡量避免跨分片查詢的發生 2 分割槽鍵要能盡量使各個分片中的資料平均 如何儲存無需分片的表 1 每個分片...