方案

項目背景

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

目標場景

  1. 兼容舊的功能
  2. 對1300多W數據進行分庫分表
  3. 需要對舊的數據進行整合
  4. 老師端選題組卷 可以根據 學段、學科、知識點、難度、題型 來篩選
  5. 學生端根據老師端所選題目獲取對應的題目
  6. 對3年內以後擴展的增量數據預留數量空間

數據樣例

學段數據量小學1285336初中6655780高中6144072學段學科數據量初中數學1869524初中化學1356224初中英語288440

切分方案一

  1. 切分為3個庫, 分別是小學、初中、高中 數據佔比如上
  2. 每個庫切分10個表 根據 (學科+首級知識點)%10
  3. 每個庫一個總表

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

優點:數據分佈較為平均

切分方案二 (採用)

  1. 切分為3個庫, 分別是小學、初中、高中 數據佔比如上
  2. 每個庫切分10個表(全部10個學科) 根據 學科區分, 例: 數學表、物理表
  3. 每個庫一個總表

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

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

數據id 自增區間劃分

  1. 小學 1-2億
  2. 中學 2-3億
  3. 高中 3億起

關聯關係圖


題庫分庫分表架構方案


根據知識點獲取題目流程


題庫分庫分表架構方案


自增id

  1. 對原有的id區間段不做處理
  2. 對切分後的id自增段進行規劃


兼容舊功能

解決的問題

  1. 新舊數據有重複的知識點、題目
  2. 新舊數據的結構不一樣
  3. 對舊的題庫功能代碼的修改
  4. 兩套題庫合併主鍵衝突問題

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

  1. 有操作的舊的數據洗入新的結構,舊的數據只為兼容原有的功能數據,不做顯示。


優點:

不用變動數據結構,最新的購買的數據結構較為清晰。 易維護擴展,因為目前舊的數據已經整合了兩套數據

缺點:

需要修改全部舊有的功能代碼(針對新的數據結構)

兼容舊功能 方案二

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


優點:

  1. 舊有代碼只修改數據結構切分的部分,不用全部修改功能代碼


缺點:

  1. 數據較亂,三套不同的數據同時存在數據庫
  2. 需要處理新的結構整合進舊的數據結構,同時需要處理主鍵衝突,
  3. 代碼上需要處理對應的數據

問題點

  1. 測試環境和正式環境圖片存放在那裡?100多G,上傳cdn需要幾十天時間,有4000多W張,目前cdn不支持打包上傳


解決方案:購買單獨服務器,主備,存放圖片

  1. 測試db 正式db 1300多w 目前佔用100G左右, 需要存放空間


解決方案:測試環境新加硬盤,新加db實例端口3307,正式環境db存放在圖片服務器

代碼設計模式

  1. 採用適配器模式(原先的代碼結構不變)
  2. 類圖


調研內容

中間件MYCAT(未使用)

什麼是MYCAT

  1. 一個徹底開源的,面向企業應用開發的大數據庫集群
  2. 支持事務、ACID、可以替代MySQL的加強版數據庫
  3. 一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群
  4. 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
  5. 結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
  6. 一個新穎的數據庫中間件產品

MYCAT特性

  1. ==支持庫內分表(1.6)==
  2. ==支持單庫內部任意join,支持跨庫2表join,甚至基於caltlet的多表join==
  3. 支持全局序列號,解決分佈式下的主鍵生成問題。
  4. ==分片規則豐富==,插件化開發,易於擴展。
  5. 基於Nio實現,有效管理線程,解決高併發問題。
  6. ==支持通過全局表,ER關係的分片策略,實現了高效的多表join查詢==
  7. 支持分佈式事務(弱xa)。
  8. 支持SQL黑名單、sql注入攻擊攔截
  9. ==支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常見SQL語法==
  10. ==遵守Mysql原生協議==,跨語言,跨平臺,跨數據庫的通用中間件代理。
  11. ==基於心跳的自動故障切換,支持讀寫分離,支持MySQL主從,==以及galera cluster集群。
  12. 可以大幅降低開發難度,提升開發速度
  13. 具體看 mycat 官網

Mycat 注意事項

  1. 全局表一致性檢測 1.6版本開始支持(一致性的定時檢測)
  2. 分片 join(儘量避免使用 Left join 或 Right join,而用 Inner join)


Mycat 原理

  1. 應用要面對很多個數據庫的時候,這個時候就需要對數據庫層做一個抽象,來管理這些數據庫,而最上面的應用只需要面對一個數據庫層的抽象或者說數據庫中間件就好了,這就是Mycat的核心作用。
  2. 分片分析、路由分析、讀寫分離分析、緩存分析等,然後將此SQL發往後端的真實數據庫,並將返回的結果做適當的處理,最終再返回給用戶。


Mycat 應用場景

  1. 讀寫分離,配置簡單
  2. 分表分庫,對於超過1000萬的表進行分片,最大支持1000億的單表分片
  3. 報表系統,藉助於Mycat的分表能力,處理大規模報表的統計

文章整理

  1. 應用場景 那些適合,那些不適合 https://www.cnblogs.com/barry...
  2. 使用說明 https://juejin.im/post/59c325...


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

  1. 合併的表使用的必須是MyISAM引擎
  2. 表的結構必須一致,包括索引、字段類型、引擎和字符集
  3. 對於增刪改查,直接操作總表即可。

數據切分原則

  1. 能不切分儘量不要切分。
  2. 如果要切分一定要選擇合適的切分規則,提前規劃好。
  3. 數據切分儘量通過數據冗餘或表分組(Table Group)來降低跨庫 Join 的可能。
  4. 由於數據庫中間件對數據 Join 實現的優劣難以把握,而且實現高性能難度極大,業務讀取儘量少使用多表 Join。
  5. 儘可能的比較均勻分佈數據到各個節點上
  6. 該業務字段是最頻繁的或者最重要的查詢條件。

相關推薦

推薦中...