for {explore_world; eat_food; sleep}
Time-stamp: <2013-10-29 20:18:19 datastream>
最近更新了一下自己的业余项目metrictools。相比上次写博客时的设计,新的框架基本做到了分布式和高可用了。
程序大的框架基本没有什么变动。比较明显的改进是:
metrictools在设计的时候被划分为好几个子程序:
目前为止所有的处理部分都可以是分布式,通过额外的配置,所有子系统可以做到高可用了。
最近重新对比了一下collectd
和statsd
。
感觉statsd处理数据的理念相当不错,非常适合程序嵌入监控。相对于拿到监控数据,被监控程序本身的高速运行更加重要。
collectd对数据的描述更加细致,比较适合后期挖掘处理。
可能在处理的时候,udp丢包会导致统计不对。但是udp丢包本身就是被监控的情况。 如果是tcp模式,那么最坏的情况是因为监控程序挂了,可能会导致整个业务流程堵住。当然http模式会好一些,但是依旧消耗太多。 在这里我更加欣赏Statsd的处理方式。 Statsd的client端不进行数据聚合统计,只是单纯的将数据用udp方式推送出来。
程序的无状态可能会带来额外的数据获取调用消耗,但是额外带来的好处是可以分布式部署。
使用消息队列带来了额外的可用性和扩展性。如果使用程序直接接受处理,那么扩展能力无法做到线性。
使用redis最大的问题在于数据的多少,如果数据很多那么redis可能无法存储。所以在使用redis做完数据存储的时候,需要额外的程序去处理老旧数据。 使用database(包含NoSQL),最大的问题是磁盘处理速度会拖慢整个系统的处理效率。
常见的监控体系种很重要的一点是报警。一般使用阈值报警,但是阈值的设置可能需要额外的维护和经验值调整。 算法报警的好处是能自动检测异常,但是对于处理磁盘容量缓慢变满的情况可能不是非常灵敏。
自定义编写的agent在处理数据上可能会有优势,但是会引入额外的开发成本。而使用现成的开源工具例如collectd,statsd会在部署上会有优势。