方案
專案背景
在現在題庫架構下,針對新購買的1300w多道資料進行整合,不影響現有功能。由於資料量偏多,需要進行資料的切分
目標場景
相容舊的功能
對1300多w資料進行分庫分表
需要對舊的資料進行整合
老師端選題組卷 可以根據 學段、學科、知識點、難度、題型 來篩選
學生端根據老師端所選題目獲取對應的題目
對3年內以後擴充套件的增量資料預留數量空間
資料樣例
學段資料量
小學初中
高中學段學科
資料量初中數學
初中化學
初中英語
切分方案一
切分為3個庫, 分別是小學、初中、高中 資料佔比如上
每個庫切分10個表 根據 (學科+首級知識點)%10
每個庫乙個總表
缺點:例:用到不同知識點時,需要多表獲取資料
優點:資料分布較為平均
切分方案二 (採用)
切分為3個庫, 分別是小學、初中、高中 資料佔比如上
每個庫切分10個表(全部10個學科) 根據 學科區分, 例: 數學表、物理表
每個庫乙個總表
缺點:資料不大平均, 資料量多的例數學有186w多、英語28w多
優點:當有用到組卷等需要篩選多知識點題目時,不用多表查詢
資料id 自增區間劃分
小學 1-2億
中學 2-3億
高中 3億起
關聯關係圖
根據知識點獲取題目流程
自增id
對原有的id區間段不做處理
對切分後的id自增段進行規劃
相容舊功能
解決的問題
新舊資料有重複的知識點、題目
新舊資料的結構不一樣
對舊的題庫功能**的修改
兩套題庫合併主鍵衝突問題
相容舊功能 方案一 (個人推薦)
有操作的舊的資料洗入新的結構,舊的資料只為相容原有的功能資料,不做顯示。
優點:不用變動資料結構,最新的購買的資料結構較為清晰。 易維護擴充套件,因為目前舊的資料已經整合了兩套資料
缺點:需要修改全部舊有的功能**(針對新的資料結構)
相容舊功能 方案二
把新購買的資料整合進老的資料結構,同時保留三批資料,需要處理所有表的主鍵衝突、三批各表資料去重
優點:舊有**只修改資料結構切分的部分,不用全部修改功能**
缺點:資料較亂,三套不同的資料同時存在資料庫
需要處理新的結構整合進舊的資料結構,同時需要處理主鍵衝突,
**上需要處理對應的資料
問題點測試環境和正式環境存放在那裡?100多g,上傳cdn需要幾十天時間,有4000多w張,目前cdn不支援打包上傳
測試db 正式db 1300多w 目前占用100g左右, 需要存放空間
**設計模式
採用介面卡模式(原先的**結構不變)
類圖調研內容
中介軟體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 注意事項
全域性表一致性檢測 1.6版本開始支援(一致性的定時檢測)
分片 join(盡量避免使用 left join 或 right join,而用 inner join)
mycat 原理
應用要面對很多個資料庫的時候,這個時候就需要對資料庫層做乙個抽象,來管理這些資料庫,而最上面的應用只需要面對乙個資料庫層的抽象或者說資料庫中介軟體就好了,這就是mycat的核心作用。
分片分析、路由分析、讀寫分離分析、快取分析等,然後將此sql發往後端的真實資料庫,並將返回的結果做適當的處理,最終再返回給使用者。
mycat 應用場景
讀寫分離,配置簡單
分表分庫,對於超過1000萬的表進行分片,最大支援1000億的單錶分片
報表系統,借助於mycat的分表能力,處理大規模報表的統計
文章整理
總表使用mysql merge 引擎(不考慮)
合併的表使用的必須是myisam引擎
表的結構必須一致,包括索引、字段型別、引擎和字符集
對於增刪改查,直接操作總表即可。
資料切分原則
能不切分盡量不要切分。
如果要切分一定要選擇合適的切分規則,提前規劃好。
資料切分盡量通過資料冗餘或表分組(table group)來降低跨庫 join 的可能。
由於資料庫中介軟體對資料 join 實現的優劣難以把握,而且實現高效能難度極大,業務讀取盡量少使用多表 join。
盡可能的比較均勻分布資料到各個節點上
該業務欄位是最頻繁的或者最重要的查詢條件。
題庫分庫分表架構方案
個人部落格位址 題庫分庫分表架構方案 專案背景 在現在題庫架構下,針對新購買的1300w多道資料進行整合,不影響現有功能。由於資料量偏多,需要進行資料的切分 目標場景 相容舊的功能 對1300多w資料進行分庫分表 需要對舊的資料進行整合 老師端選題組卷 可以根據 學段 學科 知識點 難度 題型 來篩...
MySQL分庫分表原理
在網際網路還未崛起的時代,我們的傳統應用都有這樣乙個特點 訪問量 資料量都比較小,單庫單錶都完全可以支撐整個業務。隨著網際網路的發展和使用者規模的迅速擴大,對系統的要求也越來越高。因此傳統的mysql單庫單錶架構的效能問題就暴露出來了。而有下面幾個因素會影響資料庫效能 為了提公升效能,所以我們必須要...
MySQL分庫分表原理
前言 在網際網路還未崛起的時代,我們的傳統應用都有這樣乙個特點 訪問量 資料量都比較小,單庫單錶都完全可以支撐整個業務。隨著網際網路的發展和使用者規模的迅速擴大,對系統的要求也越來越高。因此傳統的mysql單庫單錶架構的效能問題就暴露出來了。而有下面幾個因素會影響資料庫效能 為了提公升效能,所以我們...