5

我有一个有效的实时监控程序,但它的类架构太复杂了。这让我非常不安。让我从解释程序开始。

用户交互

这是一个带有用户交互的监控程序。这意味着,用户可以选择不同的维度、不同的指标,包括它们、排除它们或分组它们,并且每次实时图表都会根据用户的决定而变化。

来自 DB 的示例日志数据

Req Success OrderFunction 5 60ms WebServer2
Req Failed  OrderFunction 2 176ms WebServer5
Resp Success SuggestFunction 8 45ms WebServer2

转换

所以每一行对每一列都很重要。它必须像这样在客户端。因为用户可以选择查看成功的 OrderFunctions 或 WebServer2 上的所有功能或所有失败的请求等。我需要这些列之间的所有关系来执行这些操作。

另一件事是这些是来自数据库的值。我还查找了这些值,这些值包含用户需要查看的文本。就像 Req 是 Request 一样,Resp 是 Response。

我知道您可以将这个问题视为一般问题。但我正在努力寻找一种方法。可能是这种类架构在业界有名。我只是来这里寻求一些建议,以引导我走上正确的道路。

非常感谢

4

1 回答 1

1

每 3 分钟 15k 条记录,听起来很像我以前在数据中心的网络监控应用程序中看到的(在那种环境中,snmp 会变得非常嘈杂)。我们要做的是确定我们需要多少数据,需要多长时间,在什么粒度级别,以及这些信息用于确定使用哪种汇总策略——还有,我们愿意多少存储空间解决问题。使用汇总策略,您可以随时间组合行,通过合并它们的列,您可以确保对数据库的大小有一个有限的限制。

这些天可能有更新的工具,但我曾经使用 RRD ( http://oss.oetiker.ch/rrdtool/ ) 和 BerkeleyDB 来解决这些类型的监控问题。您也许还可以利用一些软件重复数据删除,在这种方法中,如果发现一行与前一行相似,您只需根据其列的内容来更新计数。我们曾经这样做是为了防止事件风暴淹没 NOC 屏幕并导致技术人员错过关键事件。顺便说一句,我会将此作为评论留下,但 stackoverflow 做的这件事阻止了我,我昨天才开始在这里回答问题。

因此,为了更完整,以您的数据为例:

Req Success OrderFunction 5 60ms WebServer2
Req Failed  OrderFunction 2 176ms WebServer5
Resp Success SuggestFunction 8 45ms WebServer2

我假设 Req/Resp 是仅有的两个值 - 对应于请求和响应?如果是这种情况,请将该列设为二进制,1 位 - 无论它是否是请求。第二列,成功/失败 - 听起来像是一个 1 位或最坏的三进制 2 位字段。可能可以枚举函数(OrderFunction、SuggestFunction 等)——或者如果您在此处进行重复数据删除,您可以将其设为位掩码。您也可以为此使用外键进入连接表。在枚举选项中,假设您有少于 256 个但超过 128 个,使用一个字节。如果您可能在事件重复数据删除解决方案中将它们卷起来以保存行,特别是当它们像那样快速进入时,并且您有 256 个选项,那么您的位掩码需要那么多位,除非不是每个排列都需要表示,在这种情况下,请计算出最大排列数,这就是重复数据删除正确汇总的位掩码中的位数。下一列有 5,2 和 8,我不确定它代表什么,是某种整数还是只是一个字节?毫秒可以表示,具体取决于您的 SQL 方言和您希望需要表示的最大毫秒数,使用 int 或无符号短整数,或者可能只是短整数(基本上约为 32.7 秒)。如果您使用 short 或 unsigned short,只需确保在您的应用程序逻辑中将超出最大值的值表示为最大值,而不是零。最后一列看起来像代表您的服务器的字符串,因此这可能是您用来帮助指导重复数据删除或汇总的列。因此,您也许可以将其设为外键。

无论如何,RRD 曾经非常好,但我已经有近十几年没有使用它了——我收回这一点,我已经十几年没有使用 RRD 了:)。我确信 BerkeleyDB 对于这类事情仍然是一个很好的数据库——所以看看那些工具和类似的工具,我相信它会产生一个很好的解决方案。

希望有帮助!

于 2013-06-16T04:27:39.173 回答