上一篇提到了shinken,这是一个完全重写过的nagios-like系统,如果想尽可能的在原有nagios知识基础上进行高性能的分布式扩展,那么可以使用mod_gearman模块。这个模块可以从github.com上直接获取使用,地址是: https://github.com/sni/mod_gearman 当然,我们这里依然是直接采用了OMD分发的方式,事实上github上也是建议直接采用omd部署,包括升级也可以直接omd update~~(因为从源代码编译的话,在nagios3.2.2版本之前还需要打个patch才能支持eventhandler,既然都得重编译,直接搞新的得了) 在github的“How it works”和“Common Scenarios”两章节里,详细的用图例说明了mod_gearman的工作原理和各种配置情形。我这里就不重复贴了。大概的说,就是可以把nagios配置检测项中的hosts/services/eventhandlers/hostgroups/servicegroups都单独成队列,然后启动多个worker有针对性的完成队列里的任务,最后也是用单独的result队列回收检测结果。 嗯,从原理上来讲,hosts/services/eventhandlers的队列,属于load balance范围,而hostgroups/servicegroups的队列,属于distribute范围。 (mod_gearman还有send_gearman程序用来load balance接收NSCA分布式监控程序的数据,这里就不说了)
概念讲完了,现在说配置。 要启用mod_gearman,方法和上篇启用shinken一样简单,运行omd config命令,在Distribute选项中选择Mod_gearman为on,然后omd start即可。 注意,omd分发中只带了mod_gearman.so和client/worker/init脚本,你必须自己yum install gearmand安装jobserver才行。 在配置完成重启动的时候,OMD就会自动的修改nagios.cfg里的broker_module配置为:
broker_module=.../mod_gearman.o server=localhost:4730 eventhandler=yes services=yes hosts=yes
同时启动1个
/omd/sites/monitor/version/sbin/gearmand --port=4730 --pid-file=/omd/sites/monitor/tmp/run/gearmand.pid --daemon --job-retries=0 --threads=10 --log-file=/omd/sites/monitor/var/log/gearman/gearmand.log --verbose=2 --listen=localhost
老文章里写的gearmand默认端口都是7003,因为跟AFS冲突,所以现在的版本默认都是4730了; 同时启动3个
/omd/sites/monitor/bin/mod_gearman_worker -d --config=/omd/sites/monitor/etc/mod-gearman/worker.cfg --pidfile=/omd/sites/monitor/tmp/run/gearman_worker.pid
OK,现在这5个worker,会由gearmand平均分配hosts/services/eventhandlers任务。一个基础的load balance就完成了。
下一步就是前面命令里用到了的~/etc/mod-gearman/worker.cfg配置文件了。
debug=0
config=/omd/sites/monitor/etc/mod-gearman/port.conf
eventhandler=yes
services=yes
hosts=yes
#hostgroups=name2,name3
#servicegroups=name1,name2,name3
encryption=yes
keyfile=/omd/sites/monitor/etc/mod-gearman/secret.key
logfile=/omd/sites/monitor/var/log/gearman/worker.log
min-worker=3
max-worker=50
idle-timeout=10
max-jobs=500
spawn-rate=1
fork_on_exec=no
show_error_output=yes
workaround_rc_25=off
以上是默认生成的配置文件。主要是定义最小的worker数量,最大的worker数量,最多运行的任务数量,等待超时时间,有等待任务时派生新worker的速度,是否为每个插件采用fork方式执行(这里注释写的是默认yes,但是OMD生成配置默认却是no,不知为何);另一部分配置就是关于lb和dist的了:hosts/services/eventhandlers的yes/no控制是否lb,hostgroups/servicegroups控制dist哪些group到具体的worker上。 假设我们现在有3个servicegroup,分别叫name1/name2/name3,那么开启选项后运行omd reload命令。查看gearmand的状态如下:
OMD[monitor]:~$ telnet 127.0.0.1 4730
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
Escape character is '^]'.
status
check_results 0 0 1
worker_localhost 0 0 1
servicegroup_name1 0 0 3
servicegroup_name2 0 0 3
servicegroup_name3 0 0 3
host 0 0 3
service 0 0 3
eventhandler 0 0 3
dummy 0 0 5
.
表示有3个worker注册在gearman的这几个任务下了。 (如果不用OMD,那么上面这些修改配置,分别启动worker指定不同配置等等动作,都要自己完成,参见github里的Installation章节From Source部份)