访问速度非常快的大数据

时间:2015-06-22 15:10:14

标签: hbase phoenix influxdb opentsdb kairosdb

我正面临一个问题:流程工厂的数据库。采样率为50 ms时,最多有50,000个传感器。所有测量值需要存储至少3年并且必须支持实时查询(即,用户可以看到延迟小于1秒的历史数据)。我最近阅读了一篇关于Time-series Database的文章,有很多选项:OpenTSDB,KairosDB,InfluxDB,......

我很困惑哪一个适合这个目的?任何人都知道这个请帮助我!

更新15.06.25

今天我运行了一个基于OpenTSDB的测试。我使用Virtual Box创建了一个由3个CentOS x64 VM组成的集群(1个主服务器,2个从服务器)。主机配置为8 GB RAM,核心i5。主VM配置为3 GB RAM,从站配置为1.5 GB RAM。我编写了一个python程序来将数据发送到OpenTSDB,如下所示:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.10.55", 4242))

start_time = time.time()
start_epoch = 1434192418;

for x in range(0, 1000000):
    curr_epoch = start_epoch + x

    tag1 = "put TAG_1 %d 12.9 stt=good\n" % (curr_epoch)
    tag2 = "put TAG_2 %d 12.9 stt=good\n" % (curr_epoch)
    tag3 = "put TAG_3 %d 12.9 stt=good\n" % (curr_epoch)
    tag4 = "put TAG_4 %d 12.9 stt=good\n" % (curr_epoch)
    tag5 = "put TAG_5 %d 12.9 stt=good\n" % (curr_epoch)
    tag6 = "put TAG_6 %d 12.9 stt=good\n" % (curr_epoch)
    tag7 = "put TAG_7 %d 12.9 stt=good\n" % (curr_epoch)
    tag8 = "put TAG_8 %d 12.9 stt=good\n" % (curr_epoch)
    tag9 = "put TAG_9 %d 12.9 stt=good\n" % (curr_epoch)
    tag10 = "put TAG_10 %d 12.9 stt=good\n" % (curr_epoch)
    str = tag1 + tag2 + tag3 + tag4 + tag5 + tag6 + tag7 + tag8 + tag9 + tag10

    s.send(str)

print("--- %s seconds ---" % (time.time() - start_time))

我在主机上运行python,工作在~220秒后完成。所以,我得到了平均值。速度约为每秒45000条记录。

更新15.06.29

这次我只使用了1个VM(5 GB RAM,3个内核,CentOS x64,伪分布式Hadoop)。我在Windows 7主机上运行2个python进程,将两半数据发送到OpenTSDB。平均放置数据的速度是每秒约100,000条记录。

4 个答案:

答案 0 :(得分:2)

要处理每秒百万次写入,您需要进行一些严谨的工程设计。

并非所有数据库都能以紧凑的形式存储该数据量。

例如,ATSD每个样本使用5到10个字节(浮点数据类型),具体取决于观察到的方差。

有一种基于HBase的分布式(集群)数据库可以处理这种负载。

例如,您可以尝试查看openTSDBATSD

更新1。

我们针对您的特定用例运行了以下测试:

30.000模拟传感器写入浮点型数据,产生540.000.000条记录

20.000个数字传感器写入短型数据(零和1),产生552.000.000条记录

数据占用3.68千兆字节。压缩是无损的。

每条记录平均产生3.37个字节。

这是一项存储效率测试。

完全披露,我为开发ATSD的公司工作。

答案 1 :(得分:2)

InfluxDB目前不会处理每秒持续的百万次写入,但这是今年晚些时候的性能目标。我看到的更大挑战是您想要存储的大量数据。如果你需要在没有下采样的情况下保持三年的全分辨率,那就是数百TB的数据。如果这不是全部在SSD上,则查询性能不会很好。如果这一切都在SSD上,这是一个非常昂贵的数据库。此外,有了这么多原始数据,无论安装了多少内容,都可以很容易地创建一个爆炸RAM的查询。

我会说在8-12周内与InfluxDB团队联系,我们可能会更好地了解如何处理您的问题。不过,我的建议是找到一种方法来解决这个问题。如果你真的以50ms的间隔对50k机器进行采样,那么它就是大量的数据,网络流量等。

答案 2 :(得分:1)

非常有趣的用例。

我不能代表别人说话,因为我只是强烈评价和使用过KairosDB&卡桑德拉,但我可以谈谈我自己的经历。

KairosDB + Cassandra可以承受吞吐量,但是对于每秒1M次写入,您需要一个具有多个前端的群集(我建议至少10个节点,但您必须测试)和后端服务器(如果需要,他们可以进行共处。)

无论如何,每个传感器的吞吐量为每秒200个样本...检索历史数据可能是长查询的问题(历史数据的1秒很有趣,但您必须确定查询持续时间的样本量)。

据我所知,存储效率不会像ATSD那样大(大概是原来的两倍,已经很好了)。

我个人喜欢KairosDB& Cassandra以及我们采用它的原因:它简单,分布均匀,KairosDB不会弄乱数据,设计优雅且不涉及复杂系统,Cassandra管理数据,kairosDB提供TSDB服务,性能和效率都不差......而且Cassandra作为一个集群比同行更容易管理。

答案 3 :(得分:0)

MemSQL可以处理1M次写入。我建议使用Kafka和MemSQL列存储。根据查询的类型,亚秒响应是非常可能的。