如果您使用時間序列資料庫(timeseries db,
免責聲明:列出的問題適用於 InfluxDB 版本 1.7.4。
為什麼是時間序列?
該項目旨在追蹤各種區塊鏈上的交易並顯示統計數據。 具體來說,我們來看看穩定幣的發行和燃燒(
在分析交易時,產生了一個想法:使用InfluxDB時序資料庫作為主儲存。 交易是時間點,它們非常適合時間序列模型。
聚合函數看起來也非常方便 - 非常適合處理長期圖表。 使用者需要一年的圖表,資料庫包含時間範圍為五分鐘的資料集。 向他發送全部十萬個點是沒有意義的——除了長時間的處理之外,它們甚至無法顯示在屏幕上。 您可以編寫自己的增加時間範圍的實現,或使用 Influx 中內建的聚合函數。 在他們的幫助下,您可以按天對資料進行分組並發送所需的 365 個點。
令人有點困惑的是,此類資料庫通常用於收集指標。 監控伺服器、物聯網設備以及數以百萬計的點「流動」的一切:[<時間> - <指標值>]。 但是,如果資料庫在大數據流下運作良好,那麼為什麼小數據流會導致問題呢? 考慮到這一點,我們使用 InfluxDB 來工作。
InfluxDB還有什麼方便的地方
除了上面提到的聚合函數之外,還有一個很棒的東西 - 連續查詢 (
也有 保留政策 (
- 建立連續查詢以將資料聚合到另一個表中;
- 對於第一個表,定義刪除早於同一周的指標的策略。
而Influx會獨立減少資料的大小,刪除不必要的東西。
關於儲存的數據
儲存的資料不多:大約 70 萬筆交易和另外 3000 萬個帶有市場資訊的點。 新增條目 - 每天不超過 XNUMX 點。 該網站也有一些指標,但那裡的數據很少,而且根據保留政策,它們的儲存時間不超過一個月。
問題
在服務的開發和後續測試過程中,InfluxDB的運作出現了越來越多的關鍵問題。
1. 刪除數據
有一系列的交易數據:
SELECT time, amount, block, symbol FROM transactions WHERE symbol='USDT'
其結果是:
我正在發送刪除資料的命令:
DELETE FROM transactions WHERE symbol=’USDT’
接下來我請求接收已刪除的資料。 Influx 傳回的不是空響應,而是應刪除的部分資料。
我正在嘗試刪除整個表:
DROP MEASUREMENT transactions
我檢查表刪除:
SHOW MEASUREMENTS
我在清單中沒有看到該表,但新的資料查詢仍然傳回相同的事務集。
這個問題只出現在我身上一次,因為刪除案例是一個孤立的案例。 但資料庫的這種行為顯然不符合「正確」操作的框架。 後來發現github上開放了
因此,刪除然後恢復整個資料庫會有所幫助。
2. 浮點數
在 InfluxDB 中使用內建函數時的數學計算存在精度錯誤。 這並不是什麼不尋常的事情,但它是令人不愉快的。
就我而言,數據包含財務成分,我希望對其進行高精度處理。 因此,我們計劃放棄連續查詢。
3.連續查詢無法適配不同時區
該服務有一個包含每日交易統計數據的表。 對於每一天,您需要將當天的所有交易分組。 但每個用戶的一天將在不同的時間開始,因此交易集也會不同。 按 UTC 時間 是
在 InfluxDB 中,按時間分組時,您也可以指定班次,例如莫斯科時間 (UTC+3):
SELECT MEAN("supply") FROM transactions GROUP BY symbol, time(1d, 3h) fill(previous)
但查詢結果會不正確。 由於某種原因,按天分組的數據會追溯到1677年(InfluxDB官方支持從今年開始的時間跨度):
為了解決這個問題,我們暫時將服務切換到 UTC+0。
4. 性能
網路上有許多比較 InfluxDB 和其他資料庫的基準測試。 乍一看,它們看起來像是行銷材料,但現在我認為其中有一些道理。
我來告訴你我的情況。
該服務提供了一個 API 方法來傳回最後一天的統計資料。 執行計算時,此方法使用下列查詢查詢資料庫 XNUMX 次:
SELECT * FROM coins_info WHERE time <= NOW() GROUP BY symbol ORDER BY time DESC LIMIT 1
SELECT * FROM dominance_info ORDER BY time DESC LIMIT 1
SELECT * FROM transactions WHERE time >= NOW() - 24h ORDER BY time DESC
解釋:
- 在第一個請求中,我們透過市場數據獲取每種代幣的最後分數。 就我而言,八個硬幣可以得到八個積分。
- 第二個請求獲取最新點之一。
- 第三個請求請求過去 XNUMX 小時內的交易清單;可能有數百個。
讓我澄清一下,InfluxDB會根據標籤和時間自動建立索引,從而加快查詢速度。 在第一個請求中 符號 是一個標籤。
我已經對此 API 方法進行了壓力測試。 對於 25 RPS,伺服器展示了 XNUMX 個 CPU 的滿載:
同時,NodeJs進程根本不提供任何負載。
執行速度已經下降了 7-10 RPS:如果一個客戶端可以在 200 毫秒內收到回應,那麼 10 個客戶端就必須等待一秒鐘。 25 RPS 是穩定性受到影響的極限;向客戶端回傳了 500 個錯誤。
有了這樣的效能,不可能在我們的專案中使用 Influx。 而且:在一個需要向很多客戶端示範監控的專案中,可能會出現類似的問題,而且指標伺服器會過載。
產量
從所獲得的經驗中得出的最重要的結論是,如果沒有充分的分析,就不能將未知的技術應用到專案中。 對 github 上的未解決問題進行簡單篩選可以提供信息,以避免選擇 InfluxDB 作為主要數據存儲。
InfluxDB 本來應該很適合我的專案的任務,但實踐表明,這個資料庫並不能滿足需求,而且有很多 bug。
您已經可以在專案儲存庫中找到版本 2.0.0-beta;我們只能希望第二個版本能夠有重大改進。 同時,我將去研究 TimescaleDB 文件。
來源: www.habr.com