我正在为如何存储一些遥测流而苦苦挣扎。我玩过很多东西,我发现自己感觉像是在作家的街区。
问题描述
通过 UDP 连接,我接收来自不同来源的遥测数据。每个源都分解为一组设备。对于每个设备,我要存储最多 5 种不同的值类型。他们进来的速度不超过每分钟一次,而且可能很少。使用混合边缘/电平触发方案传输值(当值足够不同或经过足够时间时,发送值的数据)。所以它是一个 2 或 3 级层次结构,带有时间序列字典。
我最想对数据做的事情是a)访问最新值和b)枚举时间跨度(开始/结束/值)。我并不真正关心数据之间的很多“相关性”。这不是我想要计算平均值或在它们之间关联的情况。通常,我会查看给定类型的最新值,跨越所有或某些层次结构派生的子集。或者我专注于一个单一的价值流并列举跨度。
我根本不是数据库专家。其实我知道的很少。我的三个同事也不是。我做python(并且希望我做的任何事情都是python3)。所以我希望我们所做的一切都尽可能平易近人。我目前正在尝试使用 Mint Linux 进行开发。我不太关心酸和所有这些。
到目前为止我做了什么
我们的第一个版本使用了 Gemstone Smalltalk 数据库。构建一个专门的 Timeseries 对象就像一个魅力。我已经做了很多 Smalltalk,但我的同事们还没有,Gemstone 系统不仅仅是“跳进去,马上就开心”。而且我们希望摆脱 Smalltalk(尽管我希望市场能够做到这一点)。所以就这样了。
与 RRD(循环数据库)一起玩。一种新颖的方法,但我们不需要那么糟糕的压缩,并且被边缘触发,它不适用于我们的数据捕获模型。
一位朋友说服我使用 sqlite3。我可以再试一次。我的第一次尝试并没有那么好。我可能一直试图太聪明。我试图以“标准化”的方式做事。我发现我一开始就可以正常工作。但是获取设备子集的给定字段的“最新”值,变得有点毛茸茸(对我来说)SQL。这样做的速度有点令人失望。所以事实证明我也需要学习索引。我发现我正在进入一个我不想进入的洞。然后回到我们使用 Smalltalk DB 的地方,有很多专业知识,我是唯一可以使用它的人。
我以为我会走“自己动手”的路线。我的数据不是很大。磁盘便宜。而且我非常了解如何读/写文件。文件系统不是分层数据库吗?我敢肯定,“知情人士”对这种原始方法嗤之以鼻,但这种方法是最平易近人的。使用一点 python 代码,我使用目录进行结构化,然后为每个值使用 2 个文件方案(一个用于最新值,一个用于其余值的附加日志)。这工作正常。但我宁愿不对我还没有完全解决的皱纹负责。数据如何序列化到/从(现在只使用简单的字符串)涉及到同样多的代码。这种方法的一个好处是,虽然我可以编写 python 脚本来分析数据,有些事情可以用经典的命令行工具来完成。例如(显示所有最新 rssi 值的简单查询)。
ls Telemetry/*/*/rssi | xargs cat
我今天早上花了很多时间寻找替代品。增加了 NOSQL 站点。阅读 PyTables。扫描 ZODB 教程。PyTables 看起来非常适合我所追求的。命名表的层次结构建模时间序列。但我认为 PyTables 还不能与 python3 一起使用(至少,还没有适用于 python3 的 debian/ubuntu 包)。ZODB 也是如此。而且恐怕我对许多不同的 NOSQL 数据库所做的事情了解得不够多,甚至无法尝试其中一个。
征求意见
我发现自己比开始时更加困惑和困惑。我可能太天真了,以至于我会发现一些可能更“一劳永逸”的东西,并且在这一点上已经过去了。您有任何建议和方向,将不胜感激。如果有人可以给我一个食谱,我可以在没有大量开销/教育/入口的情况下满足我的需求,我肯定会将其标记为答案。