我必须开发一个系统来跟踪/监控蜂窝网络中的性能。
该域包括一组分层元素,每个元素都有一组相关的计数器,这些计数器会定期(每 15 分钟)报告一次。系统应收集这些计数器值(以大型 XML 文件的形式提供)并定期在两个维度上聚合它们:时间(从 15 小时到每天)和层次结构(低级到高级元素)。聚合通常是一个简单的 SUM,但有时需要平均值/最小值/最大值等。当然,对于元素维度聚合,它需要按层次结构分组(将所有子项分组到一个父记录)。用户应该能够定义和查看 KPI(关键绩效指标)——即各种计数器上的一些计算。KPI 可能只需要一个元素、多个元素(为每个元素生成一个数据系列)或作为多个元素的聚合(导致聚合数据的一个数据系列)。
系统大约有 10-15 个用户,每小时可能有 20-30 个查询。查询响应时间应该是几秒钟(对于包含许多元素和较长时间段的非常大的报告,最多为 10-15)。
在高层次上,这是流程:
- 解析和输入计数器数据- 有一组 XML 文件,其中包含元素的计数器数据的定期更新。所有文件的大小约为 4GB / 15 分钟(因此大约 400GB/天)。
- 每小时聚合- 每小时一次所有收集的计数器,所有元素都应该聚合 - 与元素相关的每 4 条记录聚合成一个每小时记录,应该存储。
- 每日聚合- 每天一次,2 个所有收集的计数器,所有元素都应该聚合 - 每 24 条与一个元素相关的记录被聚合为一个每日记录。
- 元素聚合- 对于每个时间维度聚合,可能需要沿元素的层次结构聚合 - 子元素的所有记录都聚合到父元素的一个记录中。
- KPI 定义- 用户应该有某种方式来定义 KPI。KPI 是基于相同粒度(时间维度)的计数器的计算定义。计算可能(并且将)涉及多个元素级别(例如 p1.counter1 + sum(c1.counter1),其中 p1 是 c1 中一个或多个记录的父级)。
用户交互——用户可以选择一个或多个元素和一个或多个计数器/KPI、使用的粒度、查看的时间段以及是否聚合所选数据。
在聚合的情况下,结果是一个数据系列,其中包括每个相关时间点的所有选定元素的“加起来”值。在“SQL”中:
SELECT p1.time SUM(p1.counter1) / SUM(p1.counter2) * SUM(c1.counter1) FROM p1_hour p1, c1_hour c1 WHERE p1.time > :minTime and p1.time < :maxTime AND p1.id in : id_list 并加入 GROUP BY p1.time
如果不需要聚合,则需要保留 p1 中的标识符并为每个选定元素提供一个数据系列
SELECT p1.time, p1.id, SUM(p1.counter1) / SUM(p1.counter2) * SUM(c1.counter1) FROM p1_hour p1, c1_hour c1 WHERE p1.time > :minTime and p1.time < :maxTime AND p1.id in :id_list 并加入
系统必须为 15 分钟、小时和每日记录保留 10、100 和 1000 天的数据。以下是大小估计,仅考虑 4 字节的整数列用于存储,类型 P 的元素有 400 个计数器,类型 C 的元素有 50 个,类型 GP 的元素有 400 个:
当它加起来时,我假设基于 DDL(实际上,数据库优化存储)到 3.5-4 TB 的数据加上索引可能需要大约 20-30% 的额外数据。对于子“表”,每个表可以获得接近 20 亿条记录。
值得注意的是,随着网络的发展,我会不时添加计数器(可能每 2-3 个月)。
我曾经使用 Oracle 实现了一个非常相似的系统(尽管数据可能更少)。这一次我可能不会使用商业数据库,必须恢复到开源解决方案。此外,随着无 SQL 和专用时间序列数据库的日益普及,也许关系不是要走的路?
你会如何处理这样的发展?可以使用的产品有哪些?
经过几天的研究,我想出了以下几点
- 使用 MySQL / PostGres
- InfluxDB(或类似产品)
- 卡桑德拉 + 火花
- 其他的?
如何使用每种解决方案,每种方法的优点/缺点是什么?如果可以,请详细说明或建议支持这种开发的整体(硬件)架构。
欢迎提出意见和建议 - 最好来自有类似项目经验的人。