距上次 Chat 之后月余,安然度过春节,终于把这部分内容的实践做完了,写一篇文章与大家分享一下。残念的是日志采集这块还没做到位,留待以后再说。
开发团队的工作有三:开发、查问题、解决问题。往往在开发测试环境中查问题较容易,而线上排障困难,大部分情况只能考查日志查 SQL。
在 DevOps 实践中,监控告警环节应该对开发团队透明,这样开发可以通过了解和回溯故障时段的各项指标更方便的排除可疑项、推断问题源,再有的放矢的定位解决问题。
本文概要:
系统无中断地执行其功能的能力,我们称之为高可用性(High Availability,HA)。度量系统运行情况的指标最常用的是:MTBF(Mean Time Between Failure,即平均无故障工作时间)、MTTR(Mean Time To Repair,即平均修复时间)、MTTF(Mean Time To Failure,即平均失效时间)。
而度量高可用性的方式是根据系统损害、无法使用的时间,以及由无法运作恢复到可运作状况的时间,与系统总运作时间的比较。计算公式为:
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 ,而选择了2.4.1。相比新版本而言老版本在旧系统上安装维护更容易,兼容性更好。
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
配置过程如下:
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;}
安装过程如下:
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 来自动替换客户端中的配置,这样就可以主动连上服务端并注册。
启动代码如下:
service zabbix-server start
这里我直接用nginx + php-fpm
环境运行 zabbix,而非常规的 Apache。打开浏览器访问http://server_ip:9070/
进入安装向导界面,如下图。
按照提示检查 PHP 环境,如果参数不对就去改 php.ini 配置文件:
设定数据库连接配置:
Zabbix 的 Agent 都会启动一个服务监听一个端口,默认 10051。
安装顺利结束后输入用户名 Admin,初始密码 zabbix,即可登录。
中间遇到任何问题卡住了不要慌打开日志文件(/var/log/zabbix/zabbix_server.log
)检查具体是哪里出错了。
登录以后来配置本机的监控。在配置主机的界面创建一个新主机:
IP 就填本机:127.0.0.1。
选择内置的 Linux 系统监控模板:
创建后我们看到列表中 Z 图标变绿后开始正常工作:
运行一段时间后就可以通过图表监控看到监控机器上的历史数据图片:
除了配置基本的硬件负载情况的监控外,我们可以定制监控 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:
更新后收集一段时间数据:
官方提供 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 底层是用 SQLite 存储的,不需要额外配置数据库,安装方便,默认 Web 地址为“http://IP:3000/”,初始账户密码为“admin / admin”。
grafana-cli plugins install alexanderzobnin-zabbix-app
安装 Grafana 的 Zabbix 应用后在界面中激活:
配置数据源,类型选择 Zabbix,配置 Zabbix 的 jsonrpc 地址、用户、密码等信息:
就可以关联到 zabbix 数据了:
Grafana 支持编写 SQL 在指定的 MySQL 数据源中执行并自动生成图表,我们在业务中的统计即可无需额外开发系统来查看。初始化工作只需要在 Grafana 中创建一个 MySQL 类型的数据源,如下图所示。
可以看到我们安装 Zabbix 和 Grafana 是很方便的,然而具体配置要考虑性能问题时就需要深入了解其原理。
在客户端与服务端之间通讯有推拉两种模型,由客户端主动把数据推给服务端或者服务端主动去拉取客户端数据。
Zabbix 既支持推模型也支持拉模型。可以在服务端设置主动调用客户端的某个指标,也可以设置客户端主动上报指标。
Grafana 是通过调用 Zabbix 的 json-rpc 接口获取数据的,除此之外,Grafana 还可以设置监控分析长期历史趋势,就是将监控到的多条短期数据汇总为一条数据而形成新的数据。
Zabbix 和 Grafana 都有配置报警的功能,可以设定达到某一临界值之后给指定用户发邮件或者短信。大家可以自行安装后探索,本文不再赘述。
通过这两个系统的搭建,我们把监控做到了兼顾硬件、软件、业务数据的监控和可视化。开发查问题时可以自助排除运维管理的机器层面的问题,提升查问题的效率。
本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。
阅读全文: http://gitbook.cn/gitchat/activity/5a90b15af2e5dc2ca621af01
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。