有没有推荐的时序数据库或者其他数据库?

30 天前
 tramm

背景:

公司有 30W 台设备,高峰时 6W 台在线,每隔 5s 上传一次数据,一年大概只有 6 个月左右工作.大概整个生命周期内 100W 条数据(每条数据算 64 个监控点),每年预计 10W 新设备增长,数据永久保存(最大到 100W 台设备).

现在使用单机 InfluxDB,总记录 600 亿左右,硬盘占用 4T,高峰时内存经常用满128G导致重启.

写多读少.

需求:

  1. 免费;
  2. 内存,硬盘占用少(新机器只能分配 128G 内存和 15T 的 SSD);
  3. 数据永久保存的情况下(每个设备 50W~100W 的数据量)近期数据的查询时间在 10s 内;
  4. 支持少量乱序写入.

最近调研了几个数据库:

  1. TDengine:

    a. 数据和表删除不会释放空间,只能 keep 设置的数据到期才会删除(企业版支持数据重组),而且乱序写入好像还会占用额外空间?

    b. 性能还行,单表 1 亿的情况下也能在 10s 内,百万数据的话 1s 内(1W 个表,就一个表 1 亿数据,其他表只有 1W 数据).

  2. IoTDB:

    a. 性能还行,没多测;

    b. 内存,硬盘按他给的算法,占用很多.

  3. QuestDB:

    a. 数据量一亿的情况下性能还行,占用跟 TDengine 差不多;

    b. 数据量上到 10 亿后,查询性能下降非常多,写入也慢(吃 CPU,不过够用).

前几天看到站内的VictoriaMetrics/Prometheus+Thanos还没测,不知道具体咋样.

大家有没有什么好的推荐?

1598 次点击
所在节点    数据库
13 条回复
codegenerator
30 天前
为什么不试试 mongdb ?
GooMS
30 天前
先优化
hhhzccc
30 天前
1 、TimescaleDB 试试。2 、Prometheus 接 ck 试试。
hahawode
30 天前
@codegenerator #1 mongodb 的时序 对比别的数据库有优点吗
yjhatfdu2
30 天前
算了一下,一年应该不超过 4000 亿,这个情况用 clickhouse ,认真设计一下表结构尤其是编码方式,应该是可以满足的,而且 CH 可以设置把老数据自动丢到对象存储,降低成本
me1onsoda
30 天前
6w 在线,5 秒上报一次,差不多 10k qps ,居然把内存 128g 打满了???
txhwind
30 天前
为啥不加内存?内存钱不比迁移成本低吗
wxf666
30 天前
需求是这样吗:每秒最多写入 (100W 在线设备 / 5s/条) = 20W 条数据,每条 (4 << 40) / 6e10 = 73 字节?

没用过太高大上的数据库,只有点朴素的想法。

1. 每小时的数据,存在内存里(需 20W * 3600 * 100 / 2 ^ 30 = 67 GB 内存)
2. 数据库 ID 设计为(时间戳_年~小时 + 设备 ID + 时间戳_分~秒)
3. 整点后,按 (设备 ID, 时间) 顺序,写入这一小时数据,至数据库。(顺序写入,很快的)
4. 如果怕丢失数据,接收到上报信息后,也同步写入到 csv 文件里。
 (也是顺序写入,很快的。如果只是《时间戳,设备 ID 》信息,每秒顺序写入 (10 + 1 + 6 + 1) * 20W / 2 ^ 20 = 3.43 MB 数据而已)

这样搞下来,数据库相当于《读多写少》了。正好可以考虑 SQLite 、DuckDB 等。。

试了下,对于 SQLite ,如果只是存上述主键的话,一小时 7.2 亿数据,需要 10GB 文件,写了 5 分钟。。(平均每秒 200W ,还行)

前几天回帖过,SQLite 可以 0.1 秒,在 1 亿数据里,找什么设备,什么时候离线超过 24 小时(每台设备每分钟上报一次)。

当然,这是缓存了 1 GB 内存的结果。在固态上,完全无缓存,需要几秒钟。

具体要啥查询,题主也没写。。只能联想到前几天,有点相关的场景了。。

如果换 DuckDB ,应该能更快。我没试过。
lovelylain
30 天前
@wxf666 SQLite 不一般是客户端使用的单机甚至单应用使用的数据库吗,能用在后台大数据场景?
RedisMasterNode
30 天前
VictoriaMetrics contributor here ,调研时有相关问题可以私信问我,很乐意探讨 :) 并且安利一下它,我们是从 Prometheus + thanos 迁移过来的
RedisMasterNode
30 天前
以及一些 case ,上面有用户具体的数据量和规模可以参考: https://victoriametrics.com/case-studies/grammarly/
xueling
29 天前
时序性数据库可以考虑 VictoriaMetrics ,TimescaleDB ,hbase 等方案。我不知道你说的数据查询场景都有什么场景。如果大部分是分钟、小时、天等粒度的指标查询,可以不依赖时序数据库,而依赖流式统计来实现,因为时序性数据要对存储到磁盘的数据进行计算汇总后再返回结果,这个查询效率其实并不非常高,而流式统计其实更适合。技术方案可以变更为:1 、使用时序性数据库存储原始数据,作为备用,2 、使用流式统计服务提供数据指标查询功能。这样流式统计服务可以分担很大的数据查询压力。可以考虑一下我的开源项目: https://github.com/xl-xueling/xl-lighthouse
Desdemor
29 天前
用 ck , 先 redis 缓存处理,然后批量插入到 ck 里面,如果有别的需求,可以单独用物化视图

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1044250

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX