scalable cacti

今天和哥儿们晚上遛弯的时候,说到他正在做的一个工作,和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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值