数据库决策和方案设计

时间:2019-06-10 15:46:28

标签: sql database mongodb cassandra nosql

我正在尝试为自己的用例找到一个好的数据库,我对数据库没有经验。 这是我的用例:我需要获取许多具有可变字段数的时间序列(ts)数据,一个时间序列最多可以包含50KB〜100KB,并且我最多可以生成100 ts /秒。将ts写入数据库的请求将来自c ++客户端的本地主机。我将需要不时查询数据(每分钟左右或根据用户请求一次),查询可能涉及到ts数据内容的一些过滤器。写入数据比读取数据更重要且要求更高。 C ++客户端还将接收将存储在文件系统中的图像,并且一个图像应与一个时间序列相关联。接收图像不会一直发生,但是当我必须接收它们时,速率将与ts的速率相同,最大为100幅图像/秒。我无法通过添加新节点来进行水平缩放,我的体系结构是固定的,因此我不感兴趣是否有一种解决方案可以线性缩放。

首先我想到的是Kafka可以替代我的c ++客户端,但是后来我读到kafka不能处理那么大的文件(一个图像可以达到10 MB)。因此,需要一种混合解决方案,其中c ++客户端将接收图像和ts并将图像存储到磁盘,并将时间序列存储到DB。 对于数据库,我做了一些阅读工作:

  • Mongodb(每个文档限制为16 MB)
  • cassandra(需要通过从查询到模式来非常仔细地设计列)
  • influxdb(适用于ts)
  • timescaleDB(针对ts优化的类似SQL的架构,流入量和时间量似乎比cassandra更快,并且存储起来也更容易)
  • 其他nosql数据库?

我的时间序列有一些固定的列名和一些列名,这些列名我知道数据类型,而某些列名随着时间的推移而不断变化,而这些列名我事先都不知道数据类型。例如,我可以在第一个小时收到这些提示

fixed_col1 fixed_col2 ... fixed_colN     other_col1 other_col2
int         int           string            unknown   unknown

接下来的一个小时我可以收到下一个ts

fixed_col1 fixed_col2 ... fixed_colN     other_col5 other_col6 other_col7
int        int            string           unknown   unknown   unknown

我不介意other_cols是否存储为blob或json,但是我不时需要执行的一些查询将要求我解析未知列的内容,如果可能,我希望将所有ts保留在同一表,文档或逻辑单元中。

0 个答案:

没有答案