Zabbix Summary
Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。他能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
前段时间工作需要,从零开始完成了xx省xx运营商电话助理项目整个zabbix监控系统,记录一下。
目录
- Zabbix 结构
- Zabbix 部署
- 疑难问题
- 总结
Zabbix 结构
总的来说,zabbix的设计思想就是zabbix agent采集数据发往zabbix server,zabbix server用于数据处理、告警,zabbix server web用于展示数据和修改配置。
Zabbix 部署
-
安装docker
运维已安装..
- 安装mysql
- docker pull mysql:5.6 // 下载mysql镜像
- docker image ls // 查看所有镜像
- docker run –name mysqltemp -e MYSQL_DATABASE=”zabbix_server” -e MYSQL_ROOT_PASSWORD=***** -d -i -p 3306:3306 –restart=always mysql:5.6 // 启动未映射本地目录的临时mysql,–rm表示退出后删除容器
- docker cp xxxx:/var/lib/mysql /data/zabbix/mysql/data // 复制docker内部数据文件到本地目录
- docker cp xxxx:/etc/mysql /data/zabbix/mysql/conf // 复制docker内部配置文件到本地目录
- docker stop xxxx // 停止老的服务
- docker rm xxxx // 删除老的服务
- docker run –name mysql -p 3306:3306 -v /data/zabbix/mysql/data:/var/lib/mysql -v /data/zabbix/mysql/conf:/etc/mysql -e MYSQL_DATABASE=”zabbix_server” -e MYSQL_ROOT_PASSWORD=”*****” -d -i –restart=always mysql:5.6 –character-set-server=utf8 –collation-server=utf8_bin // 正式启动,命令位置很重要!
- 安装zabbix server 3.4.6
- 上传 zabbix-server-mysql-centos-3.4.6.tar.gz
- docker load -i zabbix-server-mysql-centos-3.4.6.tar.gz // 加载image
- docker run –name zabbix-server-mysql -v /etc/localtime:/etc/localtime -v /data/zabbix/zabbix_server/alertscripts:/usr/lib/zabbix/alertscripts -v /data/zabbix/zabbix_server/externalscripts:/usr/lib/zabbix/externalscripts -v /data/zabbix/zabbix_server/config/zabbix_server.conf:/etc/zabbix/zabbix_server.conf -e DB_SERVER_HOST=”10.88.188.10” -e DB_SERVER_PORT=”3306” -e MYSQL_DATABASE=”zabbix_server” -e MYSQL_USER=”root” -e MYSQL_PASSWORD=”*****” -e ZBX_ALLOWROOT=1 -e ZBX_USER=root -e ZBX_TIMEOUT=30 -e ZBX_LOGTYPE=file -e ZBX_LOGFILE=/var/logs/zabbix/zabbix_server.log -p 10051:10051 -t -d zabbix/zabbix-server-mysql:centos-5.0.2
- 安装zabbix server web
- 上传 zabbix-web-nginx-mysql-centos-3.4.6.tar.gz
- docker load -i zabbix-web-nginx-mysql-centos-3.4.6.tar.gz // 生成image
- docker run –name zabbix-web-nginx-mysql -v /etc/localtime:/etc/localtime -e DB_SERVER_HOST=”10.88.188.10” -e MYSQL_DATABASE=”zabbix_server” -e MYSQL_USER=”root” -e MYSQL_PASSWORD=”*****” -e ZBX_SERVER_HOST=”10.88.188.10” -e PHP_TZ=”Asia/Shanghai” -p 8000:8080 -p 8843:443 -d zabbix/zabbix-web-nginx-mysql:centos-5.0.2
疑难问题
问题1:docker部署mysql失败
现象是未映射文件的时候,mysql可以成功部署,一旦将data映射出去,docker启动mysql就报错。这个问题大概花了2天时间解决,看起来不久,实际上花个整整两天在一个问题上,人都要裂开了。
解决问题的路径:
1. 复制报错信息Google,边看解答边尝试,包括自己瞎改启动命令…未解决
2. Google搜索 docker部署mysql,对比启动命令是否有误,发现基本一致,只有部分命令的位置不同,未做修改
3. 偶然发现一篇文章说docker命令对位置是敏感的,尝试了一下把映射文件的命令放在前面,问题解决
问题2:监控数据入库瓶颈
监控方案中有一个各服务api调用监控,整体思路是各方发监控数据到mq,由一个专门的收集服务进行消费入库,但最开始每秒只能消费400条数据(低配mac mini单机),完全达不到上线要求。
解决问题的路径:
1. 首先怀疑是mongo数据入库有性能瓶颈,原先是来一条数据就插一条,现改为:来数据的时候存到内存中,如果当前时间减去上次入库的时间大于1s,将内存中的数据批量入库并清理内存。此次处理后每秒可消费2000条数据。
2. 第一个方案有个问题是上次入库后,继续往内存里存数据,但还没到1s数据就暂时没了,下次又数据过来可能是5s后,这就导致了监控会不准,错失告警。现改为:创建一个临时的数组存储数据,开启间隔1s的定时任务用于批量入库,由于定时任务跑在另外的线程,误打误撞又提高了性能,此次处理后每秒可消费4000条数据。基本满足12w用户下的qps需求
3. 为什么不开启多线程去消费数据呢?使用ThreadPool,QPS达到12000条/s (单机),再去除一些不必要的监控数据,可以承受600w用户
问题3:监控图表断层
监控系统运行一段时间后,发现部分图表出现断层,官方文档说明
Q: 我的图形中有一些点而不是线或者有一些空白,为什么会这样?
A: 数据丢失,这种情况的发生有多种原因——Zabbix数据库的性能问题、Zabbix服务器问题、网络问题、监控设备问题…
╮(╯▽╰)╭,这不是等于没说。
通过查日志发现,这些监控项调用脚本的时候超时了,于是修改了server、agent的config中的timeout参数,基本修复了问题。
╮(╯▽╰)╭,过几天又出现了。 timeout=30后依然超时,将代码写的mongo查询语句翻译成真正的mongo查询语句登上数据库去试了一下,确实超时,当时库中已经有了2000w条数据。首先想到加索引(事实上也只知道这个),然而已经该加的都加的。跟同事讨论后决定定时删数据,业务监控的历史数据没什么存在价值,将数据量降下来,查询也就快了。
╮(╯▽╰)╭,过几天又出现了。 这次真是绞尽脑汁,最后google有翻到一篇文章,说使用zabbix agent active模式,就是监控数据由agent主动发起,而不是server主动去拿,如果server主动去拿,在监控项比较多的情况下会吃不消。此次修改后,基本修复了问题。
╮(╯▽╰)╭,特殊情况下又出现了。 有几台测试服务器在做压测,导致cpu load异常升高,这种情况下暂时就不处理了。
总结
作为一个客户端开发,接到这样的任务其实压力很大,很多都是知识盲区,所幸最后稳稳地运行在线上。
学到了很多Linux的知识,还尝试了一下Java程序性能调优。