小团队 DevOps 实践之监控告警

距上次 Chat 之后月余,安然度过春节,终于把这部分内容的实践做完了,写一篇文章与大家分享一下。残念的是日志采集这块还没做到位,留待以后再说。

开发团队的工作有三:开发、查问题、解决问题。往往在开发测试环境中查问题较容易,而线上排障困难,大部分情况只能考查日志查 SQL。

在 DevOps 实践中,监控告警环节应该对开发团队透明,这样开发可以通过了解和回溯故障时段的各项指标更方便的排除可疑项、推断问题源,再有的放矢的定位解决问题。

本文概要:

  1. Zabbix 安装
  2. Zabbix 配置服务器监控
  3. Zabbix 配置 MySQL 监控
  4. Grafana 安装
  5. Grafana 集成 Zabbix
  6. Grafana 监控业务数据

基础知识

系统无中断地执行其功能的能力,我们称之为高可用性(High Availability,HA)。度量系统运行情况的指标最常用的是:MTBF(Mean Time Between Failure,即平均无故障工作时间)、MTTR(Mean Time To Repair,即平均修复时间)、MTTF(Mean Time To Failure,即平均失效时间)。

  • MTBF:就是从新的产品在规定的工作环境条件下开始工作到出现第一个故障的时间的平均值。MTBF 越长表示可靠性越高正确工作能力越强 。
  • MTTR:是指可修复产品的平均修复时间,就是从出现故障到修复中间的这段时间。MTTR 越短表示易恢复性越好。
  • MTTF:系统平均能够正常运行多长时间,才发生一次故障。系统的可靠性越高,平均无故障时间越长。

而度量高可用性的方式是根据系统损害、无法使用的时间,以及由无法运作恢复到可运作状况的时间,与系统总运作时间的比较。计算公式为:

 A = MTBF / (MTBF + MTTR)
可用性 年故障时间
99.9999% 32秒
99.999% 5分15秒
99.99% 52分34秒
99.9% 8小时46分
99% 3天15小时36分

我们常常听人说系统达到了4个9,5个9的可用性,说的就是小数点后面9的个数。衡量一个团队能承载多大业务规模的一个简单的方法就是看这个团队维护的系统历史数据的 MTBF 和 MTTR 两个指标。从直观感受上,人的沟通效率往往是低下的,软件系统是必然会出故障的。如果没有监控系统,线上出现问题只能依靠人工反馈问题、人工排查处理问题,高可用无从谈起,甚至连指标都无法做精确的统计。

为了提高 MTTR,要做到出现故障后尽快发现故障,尽快定位故障原因,尽快修复,尽量不造成新的故障。做好监控能帮我尽快发现故障,我们选择了 Zabbix。

Zabbix 可以监控网络、服务器、数据库、Web 站点、虚拟机、应用、存储设备等。它支持通过可用性检测、自动发现、Agent 等多种方式进行数据采集,对服务器性能要求低、支持分布式管理,扩展性强、方便与其他系统集成,可以查询历史数据并内置了数据清理机制,还有多种告警管理和设置功能。缺点有展示的图表较为单调、无法自定义聚合图表展示、二次开发较为复杂等。然而结合 Grafana 做图表展示算是一个不错的方案。

Zabbix 安装

我们没有选择最新版本的 Zabbix ,而选择了2.4.1。相比新版本而言老版本在旧系统上安装维护更容易,兼容性更好。

安装 Server

Zabbix 是使用 PHP 开发的,可以通过官方 yum 源安装,我们选择以 MySQL 作为数据库的版本。

rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm yum install zabbix-web-mysql zabbix-server-mysql

MySQL 创建数据库 zabbix,增加用户 zabbix,设置用户权限。

create database zabbix character set utf8 collate utf8_bin;grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';

导入初始化数据

导入过程如下:

cd /usr/share/doc/zabbix-server-mysql-2.4.1/create/mysql -uroot zabbix < schema.sqlmysql -uroot zabbix < images.sqlmysql -uroot zabbix < data.sql

Nginx 配置

配置过程如下:

server{    listen  9070;    root /usr/share/zabbix;        client_max_body_size 5m;        client_body_buffer_size 128k;    location / {        index index.php;    }    location ~ \.php?$    {        fastcgi_pass  127.0.0.1:9000;        fastcgi_index index.php;    set $PHP_VALUE "post_max_size=16M; \n max_execution_time=300; \n max_input_time=300; \n always_populate_raw_post_data=-1;";    fastcgi_param PHP_VALUE $php_value;    include fastcgi_params;                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;                fastcgi_param SCRIPT_NAME $fastcgi_script_name;    }        location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {                expires max;                log_not_found off;        }        location ~ /\.ht {        deny all;        }        location ~ /\. {        deny all;        }    access_log /var/log/nginx/zabbix.access.log main;    error_log  /var/log/nginx/zabbix.error.log error;}

通过 yum 安装 Agent

安装过程如下:

rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm yum install zabbix-agent -yhostname="server"`ifconfig -a eth0|grep 172 |awk -F ':' '{print $2}' |awk '{print $1}'` sed -i -e "s/Server=127.0.0.1/Server=172.16.16.110/g" -e "s/ServerActive=127.0.0.1/ServerActive=172.16.16.110/g" /etc/zabbix/zabbix_agentd.confsed -i -e "s/Hostname=Zabbix server/Hostname=$hostname/g"  /etc/zabbix/zabbix_agentd.conf

这里是根据我们局域网的 IP 地址写的 Shell 来自动替换客户端中的配置,这样就可以主动连上服务端并注册。

启动 Server

启动代码如下:

service zabbix-server start

这里我直接用nginx + php-fpm 环境运行 zabbix,而非常规的 Apache。打开浏览器访问http://server_ip:9070/ 进入安装向导界面,如下图。

小团队 DevOps 实践之监控告警_第1张图片

按照提示检查 PHP 环境,如果参数不对就去改 php.ini 配置文件:

小团队 DevOps 实践之监控告警_第2张图片

设定数据库连接配置:

小团队 DevOps 实践之监控告警_第3张图片

Zabbix 的 Agent 都会启动一个服务监听一个端口,默认 10051。

小团队 DevOps 实践之监控告警_第4张图片

小团队 DevOps 实践之监控告警_第5张图片

安装顺利结束后输入用户名 Admin,初始密码 zabbix,即可登录。

小团队 DevOps 实践之监控告警_第6张图片

中间遇到任何问题卡住了不要慌打开日志文件(/var/log/zabbix/zabbix_server.log)检查具体是哪里出错了。

Zabbix 配置服务器监控

登录以后来配置本机的监控。在配置主机的界面创建一个新主机:

小团队 DevOps 实践之监控告警_第7张图片

IP 就填本机:127.0.0.1。

小团队 DevOps 实践之监控告警_第8张图片

选择内置的 Linux 系统监控模板:

小团队 DevOps 实践之监控告警_第9张图片

创建后我们看到列表中 Z 图标变绿后开始正常工作:

enter image description here

运行一段时间后就可以通过图表监控看到监控机器上的历史数据图片:

小团队 DevOps 实践之监控告警_第10张图片

Zabbix 配置 MySQL 监控

除了配置基本的硬件负载情况的监控外,我们可以定制监控 MySQL。

在 Agent 机器上配置,过程如下:

vim /var/lib/zabbix/.my.cnf [mysql] host     = localhost user     = zabbix password = zabbix socket   =/tmp/mysql.sock [mysqladmin] host     = localhost user     = zabbix password = zabbix socket   =/tmp/mysql.sock 

编辑监控 MySQL 的脚本,代码如下:

vim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.confUserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/var/lib/zabbix mysql -N | awk '{print $$2}'UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema=\"$1\"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name=\"$2\"");" | HOME=/var/lib/zabbix mysql -N'UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c aliveUserParameter=mysql.version,mysql -V

修改完重启 Agent,代码如下:

servide zabbix-agent restart

直接用命令检查监控脚本是否生效:

zabbix_get -s 127.0.0.1 -p10050 -k "mysql.size"

成功后在 Zabbix 界面中设置主机关联 MySQL 监控模板 Template App MySQL:

小团队 DevOps 实践之监控告警_第11张图片

更新后收集一段时间数据:

小团队 DevOps 实践之监控告警_第12张图片

Grafana 安装

官方提供 rpm 安装包,直接下载安装即可,过程如下:

wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.6.3-1.x86_64.rpm sudo yum localinstall grafana-4.6.3-1.x86_64.rpm service grafana-server start /sbin/chkconfig --add grafana-server 

Grafana 配置关联 Zabbix

Grafana 底层是用 SQLite 存储的,不需要额外配置数据库,安装方便,默认 Web 地址为“http://IP:3000/”,初始账户密码为“admin / admin”。

grafana-cli plugins install alexanderzobnin-zabbix-app

安装 Grafana 的 Zabbix 应用后在界面中激活:

小团队 DevOps 实践之监控告警_第13张图片

配置数据源,类型选择 Zabbix,配置 Zabbix 的 jsonrpc 地址、用户、密码等信息:

小团队 DevOps 实践之监控告警_第14张图片

就可以关联到 zabbix 数据了:

小团队 DevOps 实践之监控告警_第15张图片

小团队 DevOps 实践之监控告警_第16张图片

Grafana 支持编写 SQL 在指定的 MySQL 数据源中执行并自动生成图表,我们在业务中的统计即可无需额外开发系统来查看。初始化工作只需要在 Grafana 中创建一个 MySQL 类型的数据源,如下图所示。

小团队 DevOps 实践之监控告警_第17张图片

小团队 DevOps 实践之监控告警_第18张图片

小团队 DevOps 实践之监控告警_第19张图片

实践总结

可以看到我们安装 Zabbix 和 Grafana 是很方便的,然而具体配置要考虑性能问题时就需要深入了解其原理。

在客户端与服务端之间通讯有推拉两种模型,由客户端主动把数据推给服务端或者服务端主动去拉取客户端数据。

  • 推模型:客户端主动上报,需要客户端配置上报服务器,不上报时说明客户端出现故障,服务端如果压力过大可能导致丢数据,因此看不到数据的现象与不上报相似。
  • 拉模型:服务端主动定时轮询各个客户端的数据,调用超时时可能是网络故障或客户端出现故障,服务端的压力是可控的,然而数据的实时性稍差。

Zabbix 既支持推模型也支持拉模型。可以在服务端设置主动调用客户端的某个指标,也可以设置客户端主动上报指标。

Grafana 是通过调用 Zabbix 的 json-rpc 接口获取数据的,除此之外,Grafana 还可以设置监控分析长期历史趋势,就是将监控到的多条短期数据汇总为一条数据而形成新的数据。

Zabbix 和 Grafana 都有配置报警的功能,可以设定达到某一临界值之后给指定用户发邮件或者短信。大家可以自行安装后探索,本文不再赘述。

通过这两个系统的搭建,我们把监控做到了兼顾硬件、软件、业务数据的监控和可视化。开发查问题时可以自助排除运维管理的机器层面的问题,提升查问题的效率。

参考资料

  • Zabbix Documentation 2.4
  • nginx 环境下安装 Zabbix 菜鸟版
  • Zabbix 系列之配置邮件报警
  • Zabbix 监控 MySQL 性能
  • CentOS 6.4下快速部署 Zabbix 2.4
  • Zabbix 实战企业监控之 MySQL 监控
  • Grafana 官方下载地址

本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。

阅读全文: http://gitbook.cn/gitchat/activity/5a90b15af2e5dc2ca621af01

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

你可能感兴趣的:(小团队 DevOps 实践之监控告警)