我面临一个问题:加工厂数据库。最多有50000个传感器,采样率为50 ms。所有测量值至少需要存储3年,并且必须支持实时查询(即用户可以看到延迟小于1秒的历史数据)。我最近读了一篇关于时间序列数据库的文章,有很多选择:opentsdb,kairosdb,influxdb。。。
我不知道哪一个适合这个目的?任何人知道这件事请帮帮我!
更新15.06.25
今天我运行了一个基于opentsdb的测试。我使用virtualbox创建了一个由3个centos x64虚拟机(1个主虚拟机,2个从虚拟机)组成的集群。主机配置为8gbram,核心为i5。主虚拟机配置为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个虚拟机(5gbram,3核,centosx64,伪分布式hadoop)。我在windows7主机上运行了两个python进程,将两部分数据发送到opentsdb。输入数据的平均速度约为每秒100000条记录。
4条答案
按热度按时间qcuzuvrc1#
memsql每秒可以处理1百万次写操作。为此,我建议使用kafka和memsql列存储。根据查询的类型,亚秒响应是非常可能的。
bfhwhh0e2#
influxdb目前无法处理每秒数百万次的写操作,但这在今年晚些时候的性能目标之内。我看到的更大的挑战是要存储的数据量。如果你需要保持三年的完整分辨率,而不需要减少采样,那就是数百兆字节的数据。如果ssd上没有这些功能,查询性能将不好。如果这些都在ssd上,那么这是一个非常昂贵的数据库。而且,有了这么多的原始数据,无论安装了多少内存,都很容易创建一个爆炸ram的查询。
我想在8-12周内与XDB团队联系,我们可能会对如何处理您的问题有更好的想法。不过,我的建议是,找到一种方法来将其分开。如果你真的要以50毫秒的间隔对5万台机器进行采样,那将是一个巨大的数据量、网络流量等。
iyfamqjs3#
非常有趣的用例。
我不能为别人说话,因为我只强烈评价和使用kairosdb和cassandra,但我可以说我自己的经验。
kairosdb+cassandra可以承受吞吐量,但是对于每秒1百万次的写操作,您需要一个具有多个前端(我建议至少有10个节点,但您必须进行测试)和后端服务器(如果需要的话,它们可以进行共置)的集群。
不管怎样,每个传感器每秒200个样本的吞吐量。。。对于长时间的查询,检索历史数据可能是一个问题(历史数据的1s很有趣,但您必须确定查询持续时间的样本量)。
据我所知,存储效率不会像atsd那么高(可能是atsd的两倍,这已经很好了)。
我个人喜欢kairosdb和cassandra,以及我们采用它的原因:它简单,真正的分布式,kairosdb不会弄乱数据,设计优雅,不涉及复杂系统,cassandra管理数据,kairosdb提供tsdb服务,性能和效率一点也不差。。。此外,cassandra作为一个集群比它的对应集群更容易管理。
shyt4zoc4#
要处理每秒百万次的写操作,您需要进行一些严肃的工程设计。
并不是所有的数据库都能以紧凑的形式存储这么多的数据。
例如,atsd根据观察到的差异,每个样本使用5到10个字节(float数据类型)。
有一种基于hbase的分布式(集群)数据库能够处理这种负载。
例如,您可以尝试查看opentsdb和atsd。
更新1。
我们为您的特定用例运行了以下测试:
30000个模拟传感器写入浮点型数据,产生540.000.000条记录
20000个数字传感器写入短类型数据(0和1),产生552000.000条记录
数据占用了3.68千兆字节。压缩是无损的。
导致平均每个记录3.37字节。
这是一个存储效率测试。
完全公开,我为开发atsd的公司工作。