股票分鐘數據存儲方案及海量數據架構方案

 
場景20億分鐘K線數據的更新及查找
 
1,瞭解數據使用狀況
 
  這些k線數據用於回測,而對於分鐘k線回測:
  • 大部分回測週期在近幾個月或近幾年
  • 熱門股票幾多滬深300、上證50等
  • 分鐘回測須要必定的實時性既在開盤時間進行回測,須要最近的數據
  • 數據增量每日幾百MB
  ※初始熱數據的劃分須要對業務進行深刻了解
  ※後續熱數據的精確劃分仍是要查看歷史查詢的記錄
  統計來源:程序中添加的數據操做log;數據庫審計;數據庫中間件
 
2,根據數據使用頻率進行拆分
 
  我將數據劃分2個層級:
  1,熱數據:熱門股票的近1個月的數據
  2,使用頻率較低的K線數據
 
  ※根據熱度使2種不一樣的存儲方式(時間段劃分):
  • 熱度數據-redis;
  • 頻率低及冷數據-bcolz文件(頻率低的單獨創建文件)
  每日夜間進行更新:將過期的部分熱數據從redis中寫入數據庫
  每週進行更新:將數據庫過期的數據存入bcolz文件中(bcolz有很是不錯的壓縮率和速度)
 
 
3,數據庫架構演變
 
  1,針對於量化回測,主要的瓶頸在於讀數據(每日讀的數據遠遠大於寫的數據)
 
  2,對於系統往後增加的使用量,咱們將劃分的數據分配獨立的服務器
    ※redis集羣,數據庫集羣,文件服務器
    以上都是用中間件進行訪問控制
 
  3,數據庫的讀瓶頸的演變
    • 數據庫瓶頸:一張表存海量數據(解決辦法:分表)
    • 服務器瓶頸:查詢需求大於磁盤的io性能或負載能力(解決辦法:分庫)
    ※綜上所述咱們將數據庫中的熱門股票平均劃分到N個庫中,並再進行分表
    ※分表規則:例如輪動策略就是某些股票會在一個策略中同時出現,所以能夠放入一張表中
 
  4,讀寫數據量都大的數據表方案
  •  在大型的應用中必然存在每日更新頻繁和查詢頻繁的數據表
    • mysql的解決方案:
      方法:進行分庫分表,加讀寫分離
      好處:可根據自身的數據使用狀況來定義中間件來控制資源訪問,從而實現資源的最大化利用
      缺點:此方案創建於開發者對現有業務和數據使用很是瞭解的狀況下,另外若是往後業務發生變化,變動成本較大(表結構,數據遷移,中間件變動)
    • ES+mongo解決方案:
      方法:使用mongo自帶的分片功能,且只創建主鍵索引_id優化寫性能;經過ES查詢獲得_id後再查詢數據
      好處:對於往後業務的拓展變動成本低(非結構化數據);ES對海量數據查詢效率高
      缺點:額外的存儲,ES索引字段變動
相關文章
相關標籤/搜索