我面临一个问题:过程工厂的数据库。最多有50,000个传感器,采样率为50毫秒。所有测量值都必须存储至少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,从VM配置为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进程,以将2个数据的一半发送到OpenTSDB。平均放入数据的速度约为每秒100,000条记录。
最佳答案
InfluxDB目前无法每秒处理持续的百万次写入,但这在今年晚些时候的性能目标之内。我看到的最大挑战是要存储的数据量巨大。如果您需要在不降低采样率的情况下保持全分辨率三年的值(value),那将是数百TB的数据。如果不是全部都在SSD上,查询性能将不会很好。如果所有这些都在SSD上,那将是一个非常昂贵的数据库。同样,有了这么多原始数据,无论安装了多少内存,编制一个爆炸都会使RAM爆炸的查询将非常容易。
我会说在8到12周内与InfluxDB团队联系,我们可能会对如何解决您的问题有一个更好的主意。不过,我的建议是找到一种将其拆分的方法。如果您确实以50毫秒的间隔对5万台计算机进行采样,那么这将是大量的数据,网络流量等。