今天和哥儿们晚上遛弯的时候,说到他正在做的一个工作,和cacti相关。
(Q1)当时说到cacti监控服务器很多的情况下如何处理性能瓶颈。
现有的处理方式是:架设多个stand-alone cacti server,对device进行分组,每个server独立维护一个group。以此分担服务压力。但是这样的问题是,运维成本很高。
(Q2)同时还提到的一个问题是:在增加新的device之后,容易出现各种各样的问题,所以需要重启整个catci服务。
当时散步时候,我们的设想是:
(Q1)磁盘IO瓶颈。在300sec 的interval里面,要写入大量的rrd文件。设想了一个使用小型的(2-3台服务器)存储集群,将rrd写入到该系统,提高IO性能。
(Q2)可以通过做一个主从结构,两个catci server, 前端用一个反向代理如nginx proxy 或者 HAproxy,在需要重启的时候做一个主从切换。
回家后查了一下资料,发现问题可能不是这么简单。
(Q2)可能存在的原因是cache没有清理,可以尝试在更新device之后,做一下配置和当前指令的重建:如
rebuild_poller_cache
参考:http://www.cacti.net/downloads/docs/html/scripts.html
当然,反向代理和主从结构是万金油方案,在无法从根子上解决问题的时候,就这样在不影响对外服务的情况下重启,也行得通。
(Q1)提到的性能问题可能是两方面的原因:
一个是数据采集的手段。我在google “cacti 优化”,看到一篇文章《cacti性能优化笔记(面向大规模集群的监控管理)[转]》http://www.wenzizone.cn/?p=264
里面提到用 spine 模式 代替 cmd.php。
我下载源码看了下这个叫做spine的扩展包。里面有两个关键的文件:
nft_popen.h 和 poller.h
具体的实现方式是 fork多个子进程,每个子进程处理一个host_id,通过将cmd.php的串行处理模式改成并行处理模式来提高数据采集的效率。
当然,从源码中可以看到,这里对数据库的查询量还是比较大的,这篇文章提到的数据库创建索引是很有必要的。
cacti的官网也提供了一个 多poller模式设计方案的RFC讨论:http://forums.cacti.net/viewtopic.php?t=24869
不过由于cpu核数等硬件条件的限制,单个服务器进行数据采集可能不够(就算是多线的),
我有查到了这样一个东东:http://docs.cacti.net/userplugin:multipollerserver
其官网:http://www.cacti-multipollerserver.de/
这样就构建了一个多个worker 一个master的模式,具体参考其官网介绍,Variante 1 - 3,下图是最简模式:
当然,这个模式还是没有解决第二个方面:磁盘IO。
多个pollerserver通过nfs同时写入,我比较怀疑其性能。
就我个人的意见,与其都写入master,不如做一个反转,pollerserver写到本地,master做多个mount point,远程读取需要的rrd文件。
当然,这样做的一个前提是,需要对rrd在master上的目录组织进行调整,比如按照
ROOT
|__poller1
|____host1
|_____device1
|_____device2
|____host2
|__poller2
|____host3
|____host4
进行处理。这样能不能成立,我还不是很确定。毕竟还没有用过catci。
最终的布局应该是:
Master|_____/usr/local/rrd_root
worker/poller a |
|_______/usr/local/poller_a/ ---------------mount------------- ./poller_a/
worker/poller b |
|_______/usr/local/poller_b/ ---------------mount------------- ./poller_b/
worker/poller c |
|_______/usr/local/poller_c/ ---------------mount------------- ./poller_c/
先在multipollerserver的交流区提出问题(http://forums.cacti.net/viewtopic.php?f=19&t=47368&p=248017#p248017),等等反馈意见看下。
当然还有两个可以参考的例子是:
插件boost 的实现:http://docs.cacti.net/plugin:boost 不过这个优化可能更上面说的目录结构没有关联。
如果需要自己实现的话,可能需要参考的是 catci 源码 cli/structure_rra_paths.php
echo "Structured RRA Paths Utility, Copyright 2008-2013 - The Cacti Group\n\n";
echo "A simple command line utility that converts a Cacti system from using\n";
echo "legacy RRA paths to using structured RRA paths with the following\n";
echo "naming convention: <path_rra>/host_id/local_data_id.rrd\n\n";
这里是一个命令行工具,将目录组织成:
ROOT
|___host1
|_device1
|_device2
的结构。
如果要自己做改动,应该在multipollerserver的源码中,在执行将 host和poller绑定完毕之后,更新数据库的rrd目录,
ROOT
|___poller1
|___host1
|____device1
|____device2