針對(duì)目前業(yè)務(wù)的高并發(fā)高數(shù)據(jù)量需求解決方案
場(chǎng)景描述
- 5s 時(shí)間間隔推送坐標(biāo)
- 在坐標(biāo)序列中計(jì)算時(shí)間逃沿,軌跡
目前遇到的問題
- 數(shù)據(jù)量巨大鳞陨,關(guān)系數(shù)據(jù)庫(kù)不適用
- 并發(fā)量炼吴,需要上萬(wàn)并發(fā)支持
- 流量比較大
數(shù)據(jù)量估計(jì)
假設(shè) 100 在線峻仇,5s 推送一次愕把,一天 10 小時(shí)預(yù)估,一個(gè)月數(shù)據(jù)量:
100 * 10 * 60 * 60 * 30 / 5 = 21600000
按照這個(gè)設(shè)計(jì)问词,一年達(dá)到 2.5 億
如果終端并發(fā)量 1w督函,那么兩天數(shù)據(jù)量達(dá)到億級(jí)別
目前我的解決方法
- Mysql 分庫(kù)分表
- 使用新數(shù)據(jù)庫(kù)替代 Mysql
- 基于文件中間件開發(fā)
- 數(shù)據(jù)冷熱分離
1. Mysql 分庫(kù)分表
如果數(shù)據(jù)量還在我們的可控范圍嘀粱,那么數(shù)據(jù)庫(kù)的分表分庫(kù)是最為明顯的激挪,這里能否分表分庫(kù)的一個(gè)關(guān)鍵是維度問題
- 以終端作為查詢維度
- 以人員作為查詢維度
不同的人員可以持有不同的終端,必要的時(shí)候锋叨,需要做數(shù)據(jù) merge
即使如此垄分,Mysql 單表也盡量控制在 1 億級(jí)別
2. 新數(shù)據(jù)庫(kù)支持
這里提供如下的幾個(gè)存儲(chǔ)組件:
- Pingcap 的 TiDB
- MongoDB
- ELK 家族的 Elasticsearch
我建議是在構(gòu)建大量測(cè)試數(shù)據(jù)情況下,做一個(gè) qps 測(cè)試
3. 基于文件的中間件開發(fā)
這個(gè)對(duì)技術(shù)要求比較高娃磺,在目前信息有限下的設(shè)想:
- 使用文件順序?qū)懕∈涗浗K端坐標(biāo)文件,Append 方式寫
- 每一個(gè)已經(jīng)產(chǎn)生的數(shù)據(jù)偷卧,都是不可修改
- 業(yè)務(wù)數(shù)據(jù)豺瘤,比如操作者,作為 Meta 數(shù)據(jù)記錄在數(shù)據(jù)庫(kù)
- 使用 Merge 等方式听诸,合并多個(gè)終端的數(shù)據(jù)輸出
數(shù)據(jù)冷熱分離
從目前的數(shù)據(jù)量來(lái)看坐求,挑戰(zhàn)在于行記錄,和流量
- 在有限硬件下晌梨,及時(shí)查詢桥嗤,和報(bào)表式結(jié)果輸出需要分開
- 把數(shù)據(jù)切分成冷熱數(shù)據(jù),盡量把好的硬件條件分配到熱數(shù)據(jù)
- 離線生成報(bào)表仔蝌,可以在低峰時(shí)期生成泛领,比如凌晨 0-6 點(diǎn)間
我的建議
如果確實(shí)按照目前的數(shù)據(jù)量,關(guān)系數(shù)據(jù)庫(kù)基本不可行
確定需求敛惊,以便決定分庫(kù)分表渊鞋,或者新數(shù)據(jù)庫(kù)是否支持
生成大量數(shù)據(jù)測(cè)評(píng),以便確定是否可行