一、概述
Zabbix是一款企业级运维监控系统,在运维领域已有广泛的应用。而本文,将主要考虑将其引入测试工作当中,对系统的整体及各服务进程的资源消耗进行实时监控,以期能够为性能测试分析、问题定位提供有效的数据支撑。当然,zabbix可以做的远不止这些,此处仅以测试领域为主场景进行介绍。
Zabbix架构由zabbix-server、数据库、web组件、zabbix-agent 四部分组成。其中zabbix-agent需要安装在被监控端,将数据采集后传给zabbix-server。Zabbix-server再将信息处理存储于数据库(一般是mysql)。web组件将数据展示给用户。
二、Zabbix服务端docker化部署
Zabbix服务端主要由zabbix-server、数据库、web组件三部分组成。为简化安装步骤,采用docker化部署。
docker官方仓库已有zabbix的相关镜像,如果环境可以连接互联网,那么直接执行以下命令即可,依次启动容器即可:
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e MYSQL_ROOT_PASSWORD="zabbix" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e MYSQL_ROOT_PASSWORD="zabbix" \
--link mysql-server:mysql \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e MYSQL_ROOT_PASSWORD="zabbix" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
如果环境在内网,则可先将下载好的docker镜像导入内网环境,后续步骤同上。
参考上传docker镜像至内网服务器命令如下:
docker image load -i xxx.tar
至此,zabbix服务端就已安装好了。可以通过登录web页面 http://xx.xx.xx.xx
用户名密码:Admin/zabbix (xx.xx.xx.xx为你的虚拟机ip)
三、Zabbix agent 批量分发部署
Zabbix服务端只有一个,但zabbix-agent、及采集脚本需要下发至各个被监控节点。此处使用ansible来实现批量部署、配置agent。
自动部署相关文件git下载地址:
https://github.com/ZengHongfu/zabbix
将以上文件下载至zabbix-server所在虚拟机,如下图:
编辑hosts文件,配置好待监控的主机信息,如下:
[vm]
10.113.43.140 name=acmp_140 zabbix_server=10.113.14.243 ansible_ssh_pass=Admin
10.113.43.152 name=acmp_152 zabbix_server=10.113.14.243 ansible_ssh_pass=Admin
解释如下:
第一列:待监控的主机ip
第二列:待监控的主机名字
第三列:zabbix-server所在虚拟机IP
第四列:待监控的主机的后台密码
然后执行以下命令进行批量部署配置:
echo '' > /root/.ssh/known_hosts
ansible-playbook -i hosts send_zabbix_agent.yml
解释如下:
通过ansible-playbook执行编排好的任务,编排内容详情见send_zabbix_agent.yml文件,内容如下:
---
- hosts: vm
remote_user: root
tasks:
- name: Create data directory
file: path=/root/zabbix state=directory owner=root group=root
- name: cp zabbix_ageent_rpm to host
copy: src=./zabbix-agent-4.2.1-1.el7.x86_64.rpm dest=/root/zabbix/ owner=root group=root mode=0555
- name: install zabbix-agent
yum: name=/root/zabbix/zabbix-agent-4.2.1-1.el7.x86_64.rpm state=present
- name: cp zabbix_base_script to host
copy: src=./cloud.conf dest=/etc/zabbix/zabbix_agentd.d/ owner=root group=root mode=0644
- name: cp zabbix_scripts to host
copy: src=./scripts dest=/root/zabbix/ owner=root group=root mode=0555
- name: midify_agent_config -->Server
shell: sed -n '/^Server=/p' /etc/zabbix/zabbix_agentd.conf | xargs -i sed -i 's/^{}/Server={{zabbix_server}}/g' /etc/zabbix/zabbix_agentd.conf
- name: midify_agent_config -->ServerActive
shell: sed -n '/^ServerActive=/p' /etc/zabbix/zabbix_agentd.conf | xargs -i sed -i 's/^{}/ServerActive={{zabbix_server}}/g' /etc/zabbix/zabbix_agentd.conf
- name: midify_agent_config -->Hostname
shell: sed -n '/^Hostname=/p' /etc/zabbix/zabbix_agentd.conf | xargs -i sed -i 's/^{}/Hostname={{name}}/g' /etc/zabbix/zabbix_agentd.conf
- name: open port 10050
shell: iptables -A INPUT -p tcp --dport 10050 -j ACCEPT
- name: restart zabbix-agent
service: name=zabbix-agent state=restarted
- name: set zabbix-agent start when boot
shell: chkconfig zabbix-agent on
至此,zabbix-agent以及scripts目录下的脚本都已部署配置到了所有被监控主机。剩下的事就是在web页面使用zabbix了。
四、Zabbix使用指南
4.1 zabbix常用基本概念
我们用到的常见概念主要有模板、监控项、主机、触发器、聚合图形。此处仅对这几项进行简单介绍,想了解更多的内容,请移步官方文档:https://www.zabbix.com/documentation/4.0/zh/manual
4.1.1 zabbix模板
模板内包含多个监控项、触发器、应用(相当于监控项的分组)。通俗一点来讲,就是模板定义了它要去监控什么数据,以及对监控结果的响应措施。
当一个模版链接到一个主机后,主机会继承这个模版中的所有对象。简单而言,一组预先定义好的检查会被快速应用到主机上。
创建一个模板:
配置---->模板---->创建模板
在模板内创建一个应用集:
配置---->模板---->进入已有的模板的详情页---->应用集---->创建应用集
在模板内创建一个监控项:
配置---->模板---->进入已有的模板的详情页---->监控项---->创建监控项
4.1.2 zabbix监控项
最为核心的就是监控项,它定义了我们想要监控什么数据。
进入添加监控项页面,如下图:
设置完成,点击添加即可,如下图监控项已成功添加 :
4.1.3 zabbix触发器
Zabbix触发器也是非常重要的,作用就是定义告警条件,并检查监控项采集的数据,一旦满足条件,就触发告警(告警方式多样化:可zabbix检测页面告警,邮件告警,自定义方式告警等等)
现已上一节创建的监控项为例,假设当用户进程的CPU占用超过10%时,就触发告警。
在模板内创建一个触发器:
配置---->模板---->进入已有的模板的详情页---->触发器---->创建触发器
做如下配置即可:
4.1.4 主机
主机就是被监控对象。添加步骤如下:
配置---->主机---->创建主机
做如下配置即可:
接下来为主机关联模板
4.1.5聚合图形
我们使用聚合图形主要是将几个有关联的数据放在一起进行对比观察。如下步骤添加:
监测---->聚合图形---->创建聚合图形
点击新建的聚合图形的构造函数进行配置:
点击‘更改’在对应位置添加图形:
相同方式,共添加3个监控项如下:
至此,聚合图形添加完成,就可以通过聚合图形观察数据走势。
之后查看聚合图形:
监测---->聚合图形---->所有聚合图形列表---->点击查看某个聚合图形
效果如下:
4.2 zabbix扩展监控项的开发
Zabbix自带了许多常用(通用的,基础的)的监控项,但结合我们自己的平台,可能需要更多定制的监控项。所以需要扩展监控项。为了扩展脚本规范化,便于后期维护。可以将我们扩展的监控项的key统一为这样的格式:cloud.info[script-name,arg1,arg2,...]
例如:cloud.info[get_top,cpu,"/usr/bin/mongod"]
它是这样工作的:在zabbix agent端,存在如下配置:/etc/zabbix/zabbix_agentd.d/cloud.conf,内容如下:
UserParameter=cloud.info[*],/root/zabbix/scripts/cloud_zabbix.sh "$1" "$2" "$3" "$4"
也就是说,我们扩展的监控项(cloud.info)是在agent端调用脚本/root/zabbix/scripts/cloud_zabbix.sh来获取数据的,而脚本/root/zabbix/scripts/cloud_zabbix.sh再根据传入的参数(script-name)来调用其它脚本。 cloud_zabbix.sh内容如下:
#!/bin/bash
filepath=$(dirname "$0")
if [ $# -lt 2 ];then
echo "Invalid parameter! $*"
exit 1
fi
filename=$1
if [ -f "${filepath}/${filename}.sh" ];then
file="${filepath}/${filename}.sh"
elif [ -f "${filepath}/${filename}.py" ];then
file="${filepath}/${filename}.py"
else
exit 1
fi
shift
ps -aux | grep "$file $*" | grep -v "grep" >/dev/null 2>&1
if [ $? = 1 ]; then
$file $*
else
echo "The same command running!"
fi
现在以添加监控服务器的swap分区使用量为例,简述扩展监控项的开发步骤如下。
a、编写脚本get_free.sh,可通过传参获取到free的相关数据,下发至被监控端,如下:
#!/bin/bash
if [ "$1" == "Mem" ];then
if [ "$2" == "used" ]; then
res=$( free | awk 'NR==2{print $3/1024}' )
else
echo "Parameter error !"
fi
elif [ "$1" == "Swap" ];then
if [ "$2" == "used" ]; then
res=$( free | awk 'NR==3{print $3/1024}' )
else
echo "Parameter error !"
fi
else
echo "Parameter error !"
fi
if [ $res ];then
echo $res
fi
效果如下:
b、在zabbix上添加监控项 Swap used
4.3 其他注意事项
附:修改时区方法如下
在容器zabbix-web-nginx-mysql 内,
编辑 /etc/php7/conf.d/99-zabbix.ini 将 data.timezone=Asia/Shanghai
#cat /etc/php7/conf.d/99-zabbix.ini
max_execution_time=600
memory_limit=128M
post_max_size=16M
upload_max_filesize=2M
max_input_time=300
; always_populate_raw_post_data=-1
max_input_vars=10000
; date.timezone=Europe/Riga
date.timezone=Asia/Shanghai //修改此处的
; session.save_path=/var/lib/php7
由于修改此配置重启容器之后,修改的内容会被还原,所以直接使用kill 了php-fpm7的进程杀掉
由于容器中有supervisord管理php-fpm kill掉fpm主进程很快也会被重启此时发现zabbix的页面时间已经和系统时间一致