Q:监控历史数据是如何存储的?

监控历史数据的存储使用两个存储介质,老数据使用本地硬盘存储,最近的几个小时(可以配置)的数据除了落盘之外,也会缓存到内存里一份,提升监控数据的查询效率。
监控数据量很大,其价值随着时间锐减,越是新数据越有价值,所以业界的普遍做法是会对老数据做降采样归档处理,我们也不例外,老数据使用rrdtool存储,rrdtool自带降采样归档算法,自动完成这个动作。最近的数据缓存到内存里一份,但是内存毕竟比较昂贵,容量比较小,所以内存的数据会被压缩存储,使用的算法是facebook公开的Gorilla(其论文地址:https://www.vldb.org/pvldb/vol8/p1816-teller.pdf
数据查询的时候,如果查询的时间范围落到了内存缓存的部分,可以直接返回,效率高,如果内存的数据不够,则需要从硬盘上读取数据,效率会相对差一些。最近几分钟的数据尚未落盘(每15分钟flush一次到硬盘),如果用户要查询的时间范围是最近一天,那既包含了硬盘的一部分数据,也包含了内存的一部分数据,需要做一个merge操作,将merge之后的数据返回

Q:历史数据保存策略

原始数据存储最近的720个点
再老一点的数据,6个点采样为一个点,存11520个点
更老一点的数据,180个点采样为一个点,存1440个点
最老的数据,1080个点采样为一个点,存2880个点

如果数据上报频率是10秒,上面的策略意味着:
最近2小时是原始数据
最近8天的数据是分钟粒度归档
最近1月的数据是半小时粒度归档
最近1年的数据是6小时粒度归档

Q:历史数据备份方案

如上所述老旧数据会被降采样,如果想保存较长时间(比如一年)的原始数据,可以搭建OpenTSDB的集群,我们支持将数据转发一份到OpenTSDB,OpenTSDB底层是HBase,故而需要搭建HBase集群。监控数据没有高峰低谷,每个周期都会上报监控数据,量很大,存储一年的原始数据,成本就已经非常非常高,慎重考虑。
具体配置方式是修改transfer的配置文件,将OpenTSDB的接口地址配置进来即可。
个人意见:监控老旧数据的备份意义不大,监控事件、监控事件的报警现场数据是值得永久存储的,量也小,当前是在数据库里,数据库自身支持主从方案,也有成熟的备份恢复机制。