线上服务异常的定位、处理与优化的探索 - 第六章 监控与自动运维平台

监控与自动运维平台

 

Zabbix简介

 

Zabbix是一个开源的监控平台,基于C/S方式采集数据,并使用B/S的Web方式展示数据。具有主机性能、数据库性能、Web应用、CPU、IO状态、硬盘、存储空间、连接数、应用服务状态、接口等百余项监控功能,并提供详细的报表、图表展示,以及按照配置的触发器生成指定的健康报告等。基于Zabbix提供的API接口,也可以进行一定程度的开发对接到我们的产品中。同时也支持分布式监控服务部署,在监控机性能良好情况下,可以同时支持多达万余台服务器同时监控和跟踪。

  • 全文基于最新zabbix4.0讲解。
  • 示例使用CentOS7.4,模拟正式环境服务器操作系统。

引入的意义

 

为什么监控

 

主动对系统不间断的实时监控,实时反馈系统当前状态,保证系统业务持续稳定的运行,而不是被动的告警。发现问题能及时定位,及时快速解决,减少故障率,避免影响扩大。所以监控也是整个产品交付和运维及其重要的一个环节,其次对监控的历史数据进行评估和推测,也是对业务稳定性的一种评估。

怎么监控

 

在没有使用监控平台前,我们通常使用一些零散工具进行监控,例如:

# top 查看CPU利用率、内存利用率、进程利用率

 

 

 

# free -m 查看物理机内存具体情况

 

 

 

# df -h 查看当前分区硬盘利用率(根分区以及其他分区使用情况)

 

 

 

# iftop 查看网络流量

 

 

 

但这些命令/工具都是临时性的,不具有存储功能,随看随走,无法追溯历史数据和全面分析,同时也只能在服务宕机、服务异常时我们才会主动去查看,只能事后分析,无法做到事前预警!

想下一下,如果我们将来承接一个巨大的财务共享中心/企业中台项目,按照微服务架构设计,假设需要几十台应用+数据库服务器,那么我们直接使用这些命令/工具调试,将难以对所有服务器进行统一监控和分析,工作量和工作难度将会是一个噩梦。

引入监控工具/平台,帮助我们更好的实现对服务的监控和跟踪,使用图表方式也更加直观方便我们分析数据。根据分析去升级或改造相应的故障节点,从而达到快速定位、分析线上服务问题。

 

 

 

要监控什么

 

硬件监控

温度、硬件故障……

系统监控

CPU、内存、硬盘、网卡流量、进程数量……

应用监控

WebLogic、JBoss、Tomcat、Nginx、Oracle、MySql、Redis……

日志监控

系统日志、服务日志、错误日志……

API 监控

接口可用性、响应时间……

业务监控

填单数量、凭证数量、活跃用户……

平台架构与组件

 

Zabbix Server

 

Zabbi Server负责处理监控数据,并将处理过的数据固化到ZabbixDB。Zabbix Server默认使用10051端口作为数据接收端口。

Zabbix Web

 

ZabbixWeb是一套PHP语言编写的Web应用程序,向用户提供一个可视化、可配置的操作台。所展示的数据来源为ZabbixDB中的数据。同时也支持使用Grafana进行大屏展示功能。

Zabbix Agent

 

ZabbixAgent是一个客户端,负责收集服务器的监控数据并传送给Zabbix Server,每台需要被监控的服务器都必须安装。Zabbix Agent默认使用10050端口。

Zabbix Proxy

 

ZabbixProxy是一个代理服务,当我们监控的主机较多时,直连Zabbix Server会产生过多进程,极大影响Zabbix Server处理监控数据的性能。此时可以配置让每台被监控的服务器的客户端:Zabbix Agent将收集到数据传送给Zabbix Proxy,由代理服务再传送到数据到Zabbix Server。

Zabbix Java GetWay

 

作用同Zabbix Proxy,适用于监控Java语言所开发的应用的各项性能。

组件功能示意图

 

 

 

 

架构示意图

 

 

 

 

组件选取与安装

 
  • 安装方式有两种

1:部署包方式,yum install,本例使用此方式。

2:源码包方式,下载源码包,手动编译,make install方式。

  • 安装要求:

规模

平台

CPU/内存

数据库

受监控的主机数量

小型

CentOS

1 CPU cores/2GB

MySQL InnoDB

100

中型

CentOS

2 CPU cores/2GB

MySQL InnoDB

500

大型

RedHat

4 CPU cores/8GB

PostgreSQL

>1000

极大型

RedHat

16 CPU cores/16GB

PostgreSQL

>10000

安装Zabbix Server

 
  1. 修改镜像地址

将操作系统的源地址更改为阿里云镜像,避免部分软件因政策原因无法访问导致安装失败。

# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

  1. 修改部分设置

# systemctl stop firewalld.service 关闭防火墙firewall

# systemctl disable firewalld.service 禁止firewall开机启动

# vi /etc/selinux/config 修改selinux

SELINUX=disabled

 

 

 

  1. 配置zabbix的yum源

# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm

# yum clean all

 

 

 

  1. 修改 zabbix仓库的地址,使用阿里云镜像

# vim /etc/yum.repos.d/zabbix.repo

https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/$basearch/

https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/$basearch/debuginfo/

https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/$basearch/

 

 

 

  1. 安装libiksemel.so.3()(64bit)依赖包

# yum install -y http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/iksemel-1.4-6.sdl7.x86_64.rpm

 

 

 

  1. 安装zabbix-server、mysql、zabbix-agent
  • 安装时若没有安装PHP环境,会自动安装PHP相关的包和httpd。因为zabbix的Web管理端是基于PHP开发的。安装过程中,会遇到2次选择y/N选项,一律选择y即可

# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent

 

 

 

 

 

 

  1. 安装、配置、初始化、创建和导入数据库MariaDB(MySql的一个开源分支)

# yum install mariadb* -y

 

 

 

 

 

 

# systemctl start mariadb.service 启动mariadb

# systemctl enable mariadb.service 设置开机启动mariadb

# mysql_secure_installation 初始化mariadb

 

 

 

 

 

 

创建zabbix所使用的数据库,并赋权与刷新。

mysql -uroot -p密码

create database zabbix character set utf8 collate utf8_bin;

grant all privileges on zabbix.* to 'zabbix'@'%' identified by 'zabbixpwd';

flush privileges;

 

 

 

导入数据库

mysql -uroot -p密码 -Dzabbix < /usr/share/doc/zabbix-server-mysql-4.0.18/create.sql

 

 

 

  1. 修改zabbix 与php的配置

# vi /etc/zabbix/zabbix_server.conf 修改zabbix数据库配置文件

DBHost=192.168.3.92

DBName=zabbix

DBUser=zabbix

DBPassword=zabbixpwd

 

 

 

 

 

 

# vi /etc/httpd/conf.d/zabbix.conf 修改zabbix时区

php_value date.timezone Asia/Shanghai

 

 

 

# vim /etc/php.ini 修改PHP时区

 

 

 

修改乱码,Windows下找一个字体,覆盖此目录字体即可:graphfont.ttf

# cd /usr/share/zabbix/assets/fonts/

 

 

 

修改zabbix-agentd的server地址为zabbix server的地址

# vim /etc/zabbix/zabbix_agentd.conf

重启zabbix-agent

# systemctl enable zabbix-agent.service

# systemctl restart zabbix-agent.service

 

 

 

 

 

  1. 安装Zabbix Get工具

zabbix_get是一个调试工具,用于从Zabbix Server直接使用命令行的方式获取被监控的主机的信息,通常用来检测被监控的主机是否已经正常配置了。

# yum install zabbix-get.x86_64

 

 

 

  1. 启动和初始化zabbix

启动zabbix,并重启ApacheHttp,因为刚才修改了Apache的时区配置。如遇启动异常,检查下selinux是否未关闭。

# systemctl enable zabbix-server

# systemctl start zabbix-server

# systemctl restart httpd.service

 

 

 

进入zabbix的Web端程序初始化,在浏览器中输入:ip地址/zabbix

 

 

 

检查状态全部是OK证明环境信息配置无误

 

 

 

配置数据库连接信息

 

 

 

 

 

 

默认用户名:Admin 注意A大写

默认密码:zabbix

 

 

 

安装Zabbix Agent

 
  • 注意:在被需要纳入监控的服务器上只需要安装Zabbix Agent即可。
  1. 修改镜像地址

# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

  1. 配置zabbix的yum源

# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm

 

 

 

  1. 修改 zabbix仓库地址,使用国内阿里云

# vim /etc/yum.repos.d/zabbix.repo

https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/$basearch/

https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/$basearch/debuginfo/

https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/$basearch/

 

 

 

  1. 安装 zabbix Agent

# yum install zabbix-agent -y

 

 

 

  1. 修改 zabbix Agent配置

# vi /etc/zabbix/zabbix_agentd.conf

DebugLevel=3 日志等级

Server=192.168.3.92 ZabbixServer地址

ListenPort=10050 ZabbixAgent监听的端口

ListenIP=192.168.3.91 本机的IP

ServerActive=192.168.3.92 主动检查地址,填写ZabbixServer地址

Hostname=192.168.3.91 一般用本机IP作为名称即可,Web端配置需要使用此名称。

配置文件中的其他配置勿动!

  1. 启动 zabbix Agent

重启zabbix-agent

# systemctl enable zabbix-agent.service

# systemctl restart zabbix-agent.service

 

 

 

  1. 检测 zabbix Agent配置(需要切换到Zabbix Server中操作)

检测已经安装zabbix Agent的主机,是否正常连接到Zabbix Server监控主机。

# zabbix_get -s 192.168.3.91 -p 10050 -k "system.uname"

# zabbix_get -s 192.168.3.91 -p 10050 -k "system.cpu.load[all,avg1]"

 

 

 

  1. 安装 zabbix Java GateWay网关

此步骤为安装 zabbix Java gateWay网关,用于监控JVM信息,如应用服务器Jboss的JVM各项指标信息。

yum install zabbix-java-gateway.x86_64 -y

 

 

 

 

 

配置与使用

 

配置监控的顺序

 

 

 

模板介绍

 

模板是集多个应用、监控项、触发器、图形、聚合图形、自动发现、web监测的一组实体,一个模板可以应用到多个主机。Zabbix自带多个模板,足以满足日常监控和运维使用。同时也支持自定义创建模板、宏、模板之间的宏继承。

菜单:配置>模板

 

 

 

类别

模板

服务监控

Template App HTTP Service

Template App HTTPS Service

Template App Telnet Service ……

硬件资源监控

Template OS AIX

Template OS HP-UX

Template OS Linux

Template VM VMware

Template OS Windows……

应用监控

Template App Apache Tomcat JMX

Template App Generic Java JMX……

数据库监控

Template DB MySQL

网络设备监控

Template Module Interfaces SNMPv2

Template Net Network Generic Device SNMPv2……

使用模板创建主机

 

主机(Host)是指要监控的网络实体,支持物理服务器、网络交换机、虚拟机、应用等。

菜单:配置>主机>创建主机

主机页签

  • 主机名称:此名称必须是被监控主机上安装的Zabbix Agent中配置的名称,查看6.4.2章节配置
  • 可见名称:zabbix界面显示的名称
  • 群组:多台主机组成一个群组,如费控应用组,支持自定义组
  • IP地址:被监控主机的IP
  • 端口:被监控主机上安装的Zabbix Agent中配置的端口,默认10050

 

 

 

模板页签

  • 1:选择模板,支持多选
  • 2:点击”添加”,加入到链接的模板中
  • 3:点击”更新”,主机创建完毕

 

 

 

主机状态为:已启用

 

 

 

监控项

 

一个监控项是一个独立的指标,模板中自带了多个监控项。监控项可以独立挂在主机,也可以附属到模板中,由主机与模板关联。当模板中的监控项不完全满足时,可以修改,也可以自定义新的监控项来满足要求。

菜单:配置>主机>监控项>创建监控项/修改原有监控项

 

 

 

触发器

 

触发器是评估采集到的数据的一种表达式。使用监控项收集数据后,评估数据的工作交给触发器,通过构造触发器的表达式和给预警的定阀值,当超过阀值后触发器将被触发,并变更状态为PROBLEM/OK,同时触发”动作”。同监控项一样,模板中也自带了很多触发器规则,当无法满足要求时可以修改原有触发器规则,也可以自定义新的触发器表达式。

菜单:配置>主机>触发器>创建触发器/修改原有触发器

 

 

 

图形创建于展示

 

Zabbix中的图形是一个方便展示数据流向、关联问题、分析历史数据的一组报表数据,支持自定义图形和图形聚合的样式。

图形展示菜单:监测>图形

 

 

 

自定义图形菜单:配置>主机>图形>创建图形/修改原有图形

 

 

 

媒介、动作、用户与Email告警配置

 

告警媒介指的是告警方式,支持Email、Jabber、SMS短信、脚本(企信、钉钉)等。

自定义或修改报警媒介类型:管理>报警媒介类型>Email\Jabber\SMS

告警信息发送Email配置

 

 

 

动作指得是当主机监控项收集的数据满足触发器阀值时(OK、PROBLEM),通过告警媒介触发的一系列告警动作。

自定义或修改动作:配置>动作>创建动作

动作页签

 

 

 

操作页签

 

 

 

恢复页签

 

 

 

告警主机:{HOSTNAME1}

告警时间:{EVENT.DATE} {EVENT.TIME}

告警等级:{TRIGGER.SEVERITY}

告警信息: {TRIGGER.NAME}

告警项目:{TRIGGER.KEY1}

问题详情:{ITEM.NAME}:{ITEM.VALUE}

当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

事件ID:{EVENT.ID}

用户在Zabbix中一般指的是用于管理、维护、接收告警信息的管理员,Zabbix支持自定义用户组,并且权限只能分配给用户组

新建\设置用户(用户组)菜单:管理>用户>新建\修改

用户信息页签

 

 

 

报警媒介页签

 

 

 

告警示例

 

 

 

 

 

 

企信告警配置

 

 

 

 

在”我的企业”中找到企业ID(corpid),这个参数接口需要使用。

应用管理>应用>自建>创建应用,填写必须信息。

 

 

 

 

 

 

记录AgentId、Secret,这两个参数接口需要使用。

1:获取TOKEN,请求方式GET(HTTPS)

https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=企业ID&corpsecret=SECRET

2:发送消息,请求方式POST(HTTPS)

https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN

{

"touser" : "接收消息人账号",

"msgtype" : "text",

"agentid" : 应用ID(AgentId),

"text" : {"content" : "消息内容"},

"safe":0

}

编写Python脚本,work.weixin.py

 1 #!/usr/bin/python
 2 
 3 # -*- coding: utf-8 -*-
 4 
 5 #zabbix企业微信消息推送脚本
 6 
 7 import requests
 8 
 9 import json
10 
11 import sys
12 
13 import os
14 
15 import logging
16 
17 #日志设置
18 
19 logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',datefmt = '%a, %d %b %Y %H:%M:%S',filename = os.path.join('/usr/zabbix/log/','work.weixin.log'),filemode = 'a')
20 
21 #企业ID
22 
23 p_corpid='ww231337716ffd7dc6'
24 
25 #应用secret
26 
27 p_secret='rzpDmpxzjw2fIaA_-zZZOUZnyIxfyhcNXUH2z2fG5Vs'
28 
29 #应用AgentID
30 
31 p_agentid=1000002
32 
33 #告警消息接收用户
34 
35 p_touser='zhengboning'
36 
37 #告警消息内容
38 
39 message=sys.argv[1]
40 
41 #获取accesstoken
42 
43 token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + p_corpid + '&corpsecret=' + p_secret
44 
45 req=requests.get(token_url)
46 
47 accesstoken=req.json()['access_token']
48 
49 #发送消息
50 
51 msg_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken
52 
53 params={
54 
55 "touser": p_touser,
56 
57 "msgtype": "text",
58 
59 "agentid": p_agentid,
60 
61 "text": {"content": message},
62 
63 "safe":0
64 
65 }
66 
67 req=requests.post(msg_url, data=json.dumps(params))
68 
69 #print req
70 
71 logging.info('告警消息-->' + message)
72 
73 logging.info('---------------------------------------------------------------')

 

找到zabbix的默认脚本目录alertscripts,将work.weixin.py上传到此目录

# find / -name alertscripts

# chmod +x work.weixin.py

添加报警媒介类型:管理>报警媒介类型>创建媒体类型

注意,这一步脚本参数需要填写宏变量表达式{ALERT.MESSAGE}

 

 

 管理>用户>修改用户报警媒介为企业微信

 

 

 

 

配置>动作>修改操作、恢复操作的”送到类型”

 

 

 

测试验证推送企业微信消息结果:

 

 

 

更多

 
  • 篇幅有限,zabbix章节未详尽介绍功能与配置,zabbix不仅包含文中所提及的内容,还包括:自动部署、网络发现、自动注册、监控DB、监控Web应用服务器(堆内存、线程、GC等等),以及大屏展示插件。

官方文档:https://www.zabbix.com/documentation/4.0/zh/manual

posted @ 2022-12-05 20:38  江湖危险快点跑  阅读(182)  评论(0编辑  收藏  举报