假设我需要在站点上实现一个小部件,它允许用户通过图表查看处理器负载统计数据。将允许用户选择统计数据的详细程度:具有极小的精度、日期、月份和年份的精度。处理器负载的数据每秒钟提供一次。
我应该如何设计保存处理器负载数据的表,以便有效地查询数据库中的统计信息(或者,我应该对每个统计数据使用单独的表)?
目标数据库管理系统是MySQL。
发布于 2014-09-17 11:41:47
一种方法是创建一个表,并按一周中的一天(或其他一些标准)对其进行分区。超过一周的数据被移到历史表中,确保“活动”表不会变得太大。
我认为每个统计数据都有不同的表可能不是件好事,因为每次都需要加入它们。
分区时,请记住,分区的最大数目是1024 http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations.html#partitioning-limitations-max-partitions。
发布于 2014-09-17 16:48:05
数据应该被划分成不同的表--您提到的时间框架、分钟、日、月、年等。目标是减少服务器(mysql或web)或客户端(例如js )上的处理。你想要快速抓取数据并快速显示,对吗?
这需要在观察到每个表时处理对每个表的插入,或者更有可能只将数据插入分钟表,然后将数据聚合到附表中的其他表中。MapReduce工具可以帮助数据的聚合。
在关系持久性模型(mysql)中这样做的问题是,这些数据是非常关键的/面向值的(http://en.wikipedia.org/wiki/NoSQL#Key-value_商店)。当然,您可以在mysql中做您正在谈论的事情,我假设您将有一个查找表或一个host_id列,以便将这些指标与您正在监视的服务器关联起来。一个包含度量(load)的大型表,然后是一个使用外键(host_id)监视的主机的表,用于约束和加入这两个表。
如果您认为这是针对键/值持久性模型的,那么另一种解决方案是利用类似redis或dynamodb (在AWS中)的方法,为每个受监视的主机创建一组表(min、小时、日等),并为键使用时间戳(值就是加载)。如果不想为每个唯一的主机创建一组表,也可以简单地将host_id放在键的前面。顺便说一句,每种方法都有缺点。我能想到的第一件事是,除非您使用哈希技术,否则您将对同一台服务器执行特定的攻击。例如,在AWS中,您的密钥检索方法是(键的)散列,它将负载分散到表实例(实际上是存储数据的磁盘上):http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html。
还有很多其他的密钥/值存储系统,mongodb也是您可以研究的东西:http://en.wikipedia.org/wiki/MongoDB。
发布于 2014-09-17 22:37:44
为此目的,MySQL绝对是过度的。还有另一个非常有用的软件,专门用于存储各种统计数据- RRDtool。
RRDtool不是关系型数据库管理系统,它没有索引、查询等等。只有预定义容量的循环表(每DB只有一个),在填充到末尾时从头一行覆盖。RRDtool存储的不是精确的读数,而是一些粒度的平均值。对于每个表,您可以定义不同的粒度,并将自动处理传入的数据。然后,您可以以时间戳的形式引用数据,开始-结束和RRDtool会以适当的粒度自动返回数据集。
RRDtool有各种接口,返回数据作为CSV、XML,甚至非常酷的情节。
如果您想要存储负载,RRDtool是您选择的工具。
https://dba.stackexchange.com/questions/76820
复制相似问题