运维监控平台之zabbix详解2
1、Zabbix架构
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
Zabbix的运行架构如下图所示:
2、组件
zabbix由以下几个组件部分构成:
1)、Zabbix Server:负责接收agent发送的报告信息的核心组件,所有配置,统计数据及操作数据均由其组织进行;
2)、Database Storage:专用于存储所有配置信息,以及由zabbix收集的数据;
3)、Web interface:zabbix的GUI接口,通常与Server运行在同一台主机上;
4)、Proxy:可选组件,常用于分布监控环境中,代理Server收集部分被监控端的监控数据并统一发往Server端;
5、Agent:部署在被监控主机上,负责收集本地数据并发往Server端或Proxy端;
3、进程
默认情况下zabbix包含5个程序:zabbix_agentd、zabbix_get、zabbix_proxy、zabbix_sender、zabbix_server,另外一个zabbix_java_gateway是可选,这个需要另外安装。下面来分别介绍下他们各自的作用。
zabbix_agentd
客户端守护进程,此进程收集客户端数据,例如cpu负载、内存、硬盘使用情况等。
zabbix_get
zabbix工具,单独使用的命令,通常在server或者proxy端执行获取远程客户端信息的命令。通常用户排错。例如在server端获取不到客户端的内存数据,我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。
zabbix_sender
zabbix工具,用于发送数据给server或者proxy,通常用于耗时比较长的检查。很多检查非常耗时间,导致zabbix超时。于是我们在脚本执行完毕之后,使用sender主动提交数据。
zabbix_server
zabbix服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的数据最终都是提交到server
备注:当然不是数据都是主动提交给zabbix_server,也有的是server主动去取数据。
zabbix_proxy
zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里。
zabbix_java_gateway
zabbix2.0之后引入的一个功能。顾名思义:Java网关,类似agentd,但是只用于Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。
4、zabbix监控环境中相关术语
主机(host):要监控的网络设备,可由IP或DNS名称指定;
主机组(host group):主机的逻辑容器,可以包含主机和模板,但同一个组织内的主机和模板不能互相链接;主机组通常在给用户或用户组指派监控权限时使用;
监控项(item):一个特定监控指标的相关的数据;这些数据来自于被监控对象;item是zabbix进行数据收集的核心,相对某个监控对象,每个item都由"key"标识;
触发器(trigger):一个表达式,用于评估某监控对象的特定item内接收到的数据是否在合理范围内,也就是阈值;接收的数据量大于阈值时,触发器状态将从"OK"转变为"Problem",当数据再次恢复到合理范围,又转变为"OK";
事件(event):触发一个值得关注的事情,比如触发器状态转变,新的agent或重新上线的agent的自动注册等;
动作(action):指对于特定事件事先定义的处理方法,如发送通知,何时执行操作;
报警媒介类型(media):发送通知的手段或者通道,如Email、Jabber或者SMS等;
模板(template):用于快速定义被监控主机的预设条目集合,通常包含了item、trigger、graph、screen、application以及low-level discovery rule;模板可以直接链接至某个主机;
前端(frontend):Zabbix的web接口
5、zabbix安装
上篇文章我们介绍过了在LNMP环境下 zabbix-server的安装,因此这里就不再说明了,这里简单说明下环境规划及zabbix-agent的安装,操作系统都是centos6.7
两台服务器都安装zabbix-agent [root@ansible ~]# wget [root@ansible ~]# rpm -ivh zabbix-release-3.0-1.el6.noarch.rpm Preparing... ########################################### [100%] 1:zabbix-release ########################################### [100%] [root@ansible ~]# yum -y install zabbix-agent
[root@ansible ~]# vim /etc/zabbix/zabbix_agentd.conf 修改配置文件
Server=172.16.80.117 #这个地址填写zabbix-server所在的ip,默认是127.0.0.1
[root@ansible ~]# /etc/init.d/zabbix-agent start
Starting Zabbix agent: [ OK ]
6、监控第一台主机(172.16.80.128)
zabbix配置流程基本如下
Host groups(主机组)→Hosts(主机)→Applications(监控项组)→Items(监控项)→Triggers(触发器)→Event(事件)→Actions(处理动作)→User groups(用户组)→Users(用户)→Medias(告警方式)→Audit(日志审计)
配置步骤是 configuration---->hosts---->create host
接下来选择templates选项卡,输入关键字linux,我们选择第一个模块
之后我们就可以看到我们刚才添加的那台主机172.16.80.128,红色方框里面是什么意思我们在上面已经说明相关概念了,这里就不再说明,过一会儿就可以出图了
7、用户参数User parameters
有时候当我们监控的项目在zabbix预定义的key中没有定义时,这时候我们可以通过编写zabbix的用户参数的方法来监控我们要求的项目item。形象一点说zabbix代理端配置文件中的User parameters就相当于通过脚本获取要监控的值,然后把相关的脚本或者命令写入到配置文件中的User parameter中然后zabbix server读取配置文件中的返回值通过处理前端的方式返回给用户。
7.1 用户参数的语法
UserParameter=<key>,<command>
其中UserParameter为关键字,key为用户自定义key名字可以随便起,<command>为我们要运行的命令或者脚本。
一个简单的例子:
UserParameter=ping,echo 1
代理程序程序将会永远的返回1当我们在服务器端添加item的key为 ping时候。
稍微复杂的例子
UserParameter=mysql.ping,/usr/bin/mysqladmin -uroot -p123456 ping | grep -c alive
当我们执行mysqladmin -uroot ping命令的时候如果mysq存活要返回mysqld is alive
,我们通过grep–c来计算mysqld is alive的个数,如果mysql存活着个数为1,如果不存活很明显mysqld is alive的个数为0,通过这种方法我们可以来判断mysql的存活状态。
对于zabbix代理程序程如果mysql存活状态序将当返回1,如果mysql不存活状态将返回0,当我们在服务器端添加item的key为mysql.ping时候。
7.2 让key接受参数
通过让key也接受参数的方法使item添加时更具备了灵活性,例如系统预定义key :vm.memory.size[<mode>],其中的mode模式就是用户要接受的参数,当我们填写为free时则返回的为内存的剩余大小,如果我们填入的为userd时这返回的是内存已经使用的大小。
相关语法
在/etc/zabbix/zabbix_agentd.conf中配置参数,写法如下。
UserParameter=key,command
除了上面这种写法,还支持参数传递的写法,具体如下。
UserParameter=key[*],command $1 $2 $3 ….
描述
Key:Key的值在主机系统中必须是唯一的,其中*代表命令中接受的参数
命令:客户端系统中可执行的命令
例1:
UserParameter=ping[*],echo $1
ping[0] - will always return '0'
ping[aaa] - will always return 'aaa'
注意:
1.用户自定义参数一定要包含一个key和一个命令,也可以是一个脚本
2.key在整个系统是唯一的
3.用户自定义参数返回值,最大返回512兆
4.自定义完后,重启服务测试Key
可以看到该命令执行的结果是返回状态码200 说明网站正常
[root@ansible ~]# vim /etc/zabbix/zabbix_agentd.conf 修改客户端配置文件 UnsafeUserParameters=1 UserParameter=http_check,/usr/bin/curl -o /dev/null -s -w %{http_code} $1 [root@ansible ~]# /etc/init.d/zabbix-agent restart Shutting down Zabbix agent: [ OK ] Starting Zabbix agent: [ OK ] 在zabbix-server测试 [root@centos02 ~]# zabbix_get -s 172.16.80.128 -p 10050 -k "http_check[172.16.80.128]"
为监控端添加相应的item,triggers,graphs
http_check['172.16.80.128']
最后我们来看下截图情况,中间我们会模拟下httpd停掉的情况
8、通过zabbix监控nginx的状态 nginx配置 ###status server{ listen 80; server_name status.martin.org; location / { stub_status on; access_log off; } }
访问测试
Activeconnections:对后端发起的活动连接数;
server accepts 7:nginx总共处理了29179个连接;
handled:成功创建了29179次握手;
requests:总共处理了34952请求。
Reading:nginx读取客户端的header数;
Writing: nginx返回给客户端的header数;
Waiting: nginx请求处理完成,正在等待下一请求指令的连接。
编写检测nginx的脚本
[root@centos02 tools]# vim nginx.sh #!/bin/bash BKUP_DATE=`/bin/date +%Y%m%d` LOG="/var/log/nginx.log" HOST=status.martin.org PORT="80" # Functions to return nginx stats function active { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| grep 'Active' | awk '{print $NF}' } function reading { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| grep 'Reading' | awk '{print $2}' } function writing { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| grep 'Writing' | awk '{print $4}' } function waiting { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| grep 'Waiting' | awk '{print $6}' } function accepts { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| awk NR==3 | awk '{print $1}' } function handled { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| awk NR==3 | awk '{print $2}' } function requests { /usr/bin/curl "http://$HOST:$PORT" 2>/dev/null| awk NR==3 | awk '{print $3}' } # Run the requested function $1
[root@centos02 alertscripts]# cp /tools/nginx.sh /application/zabbix-server/share/zabbix/alertscripts/ [root@centos02 alertscripts]# chown zabbix.zabbix nginx.sh [root@centos02 alertscripts]# chmod +x /application/zabbix-server/share/zabbix/alertscripts/nginx.sh [root@centos02 alertscripts]# vim /etc/zabbix/zabbix_agentd.conf UserParameter=nginx.accepts,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh accepts UserParameter=nginx.handled,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh handled UserParameter=nginx.requests,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh requests UserParameter=nginx.connections.active,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh active UserParameter=nginx.connections.reading,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh reading UserParameter=nginx.connections.writing,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh writing UserParameter=nginx.connections.waiting,/application/zabbix-server/share/zabbix/alertscripts/nginx.sh waiting [root@centos02 alertscripts]# /etc/init.d/zabbix-agent restart Shutting down Zabbix agent: [ OK ] Starting Zabbix agent: [ OK ]

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Apache与Nginx比较
Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是linux内核2.6以后才出现的。下面通过比较Apache和Nginx工作原理来比较。 传统Apache都是多进程或者多线程来工作,假设是多进程工作(prefork),apache会先生成几个进程,类似进程池的工作原理,只不过这里的进程池会随着请求数目的增加而增加。对于每一个连接,apache都是在一个进程内处理完毕。具体是 recv(),以及根据 URI 去进行磁盘I/O来寻找文件,还有 send()都是阻塞的。其实说白了都是 apche 对于套接字的I/O,读或者写,但是读或者写都是阻塞的,阻塞意味着进程就得挂起进入sleep状态,那么一旦连接数很多,Apache必然要生成更多的进程来响应请求,一旦进程多了,CPU对于进程的切换就频繁了,很耗资源和时间,所以就导致apache性能下降了,说白了就是处理不过来这么多进程了。其实仔细想想,如果对于进程每个请求都没有阻塞,那么效率肯定会提高很多。 Nginx采用epoll模型,异步非阻塞。对于Nginx来说,把一个完整的连接请求处理都划分成了事...
- 下一篇
nginx网站被持续***1个月后最终防攻策略
nginx网站被持续被×××1个月后最终防攻策略 上上个月架构全部迁移上云以后,总的来说比较稳定,业务量也上来,可爱的坏人也来了,7X24小时不停恶意×××我的网站,第一次收到报警是网站流入流量1分钟以内连续3次超过1000000bps,换算下1M/s秒,平时没那么大流量的啊,当时刚好在朋友家玩,于赶紧开本本远程连接检查,发现全是访问同一个页面的请求,而且是正常访问http 200,应该是被恶意×××了。 发现问题:发现问题第一反应,赶紧将请求地址截图发给开发们看看,问问这个具体是什么?最后得知是为短信验证码接口,据后来统计在被持续×××的一个多小时中损失16000多条短信。 解决问题: 一期防×××策略:发现问题当然要立马解决了,当时思路就是统计nginx日志,当单个ip在10秒钟内访问 /account/sendPhoneCode次数超过5次,就禁用这个ip,正常用户不可能有么大的访问量,于是就有了下面的防***shell脚本。 这个脚本加在定时任务里每分钟执行一次,半夜0点自动重启动防火墙,释放IP,基本上防止了***,大概使用了半个月。 #!/bin/bash #write...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长