Zabbix

监控服务介绍

逻辑布局

整体布局

常见的监控服务

开源监控软件:cacti、naglos、zabbix、smokeping、open-falcon等

Cacti

官网:https://www.cacti.net/
github:https://github.com/Cacti/cacti

1
2
3
Cacti是基于LAMP平台展现的网络流量监测及分析工具,通过SNMP技术或自定义脚本从目标设备/主机获取监控指标信息;其次进行数据存储,调用模板将数据存到数据库,使用rrdtool存储和更新数据,通过rrdtool绘制结果图形;最后进行数据展现,通过Web方式将监控结果呈现出来,常用于在数据中心监控网络设备

目前还有很多 数据中心、IDC服务商 还在用Cacti

缺点:只针对物理设备、虚拟机这样有固定IP地址的设备,不适合容器

Nagios

官网:https://www.nagios.org/

1
Nagios用来监视系统和网络的开源应用软件,利用其众多的插件实现对本机和远端服务的监控,当被监控对象发生异常时,会及时向管理员告警,提供一批预设好的监控插件,用户可以之间调用,也可以自定义Shell脚本来监控服务,适合各企业的业务监控,可通过Web页面显示对象状态、日志、告警信息,分层告警机制及自定义监控相对薄弱

缺点:报警机制比较简单,无法实现分组报警、递归报警等功能

SmokePing

官网地址:https://oss.oetiker.ch/smokeping/

1
Smokeping是一款用于网络性能监测的开源监控软件,主要用于对IDC的网络状况,网络质量,稳定性等做检测,通过rrdtool制图方式,图形化地展示网络的时延情况,进而能够清楚的判断出网络的即时通信情况

可以监测全国各地连接到网站的网速,类似 站长之家 的某些测速功能

Open-falcon

官网:https://www.open-falcon.org/
github:https://github.com/XiaoMi/open-falcon
文档:https://book.open-falcon.org/zh_0_2/contributing.html

1
2
小米公司开源出来的监控软件open-falcon(猎鹰),监控能力和性能较强
插件很多,部署复杂

夜莺

官网:https://n9e.didiyun.com/

1
滴滴出品,一款经过大规模生产环境验证的、分布式高性能的运维监控系统,基于 Open-falcon 二次开发

Zabbix

官网:https://www.zabbix.com/cn/

1
2
3
Zabbix是一个企业级解决方案,支持实时监控数千台服务器,虚拟机和网络设备,采集百万级监控指标,适用于任何IT基础架构、服务、应用程序和资源的解决方案

目前使用较多的开源监控软件,可横向扩展、自定义监控项、支持多种监控方式、可监控网络与服务等

缺点:zabbix使用mysql,数据库部分容易成为瓶颈

Prometheus

针对容器环境的开源监控软件

商业监控解决方案

Zabbix使用场景及系统概述

https://www.zabbix.com/cn/features

使用场景

网络服务器虚拟机应用服务数据库Web安全

系统概述

主要功能

数据采集问题检测可视化告警 & 修复安全 & 认证轻松部署自动发现分布式监控Zabbix API

数据采集

所有监控系统的工作原理都类似,都需要采集被监控对象的数据

周期性时序数据

1
2
3
4
5
- 主机/对象:服务器、路由器、交换机、存储、防火墙、IP、PORT、URL、自定义监控对象…
- 服务器较少时,采集时间可以快点,两三分钟一次
- URL 就是 API
- 自定义监控对象,通过写脚本实现
- 采集目标:监控项,指标数据(metrics data)

数据采集方式:

  1. zabbix-agent 采集本机数据,然后发送给 zabbix-proxy
  2. zabbix-proxy 将数据发送给 zabbix-server
    注意:不是实时转发,zabbix-proxy 也搭配 mysql,负责临时存储数据
  3. zabbix-server 只和zabbix-proxy保持连接即可,将数据存储到 mysql,结束采集

如果不安装(或者无法安装)agent客户端,可以使用特定的协议进行数据采集:

1
2
3
4
5
- SNMP:适用于路由器、交换机等网络设备
- Telnet
- ssh
- IPMI:物理机上如果有IPM接口,可以采集cpu温度、风扇传输等硬件信息
- JMX:监控java
数据存储

监控数据存储系统

1
2
3
4
5
6
7
- SQL: MySQL/MariaDB(Zabbix)
- NoSQL:Redis(Open-falcon)
- rrd: Round Robin Database(Cacti) 环形存储,始终保存一年的数据,一年前的覆盖掉

prometheus:时序数据库
zabbix:MySQL
cacti:rrd
数据类型
1
2
3
4
- 历史数据: 每个监控项采集到的每个监控值,查询时可能会造成数据库负载过大,开发和测试也会查看
- 趋势数据: 趋势表里主要保留某个监控项一个小时内历史数据的最大值、最小值和平均值以及该监控项一个小时内所采集到的数据个数

趋势数据是对历史数据的筛选,历史数据保存时间短一些,30天足以,趋势数据保存时间长一些,可以设置为一年
阈值

可按照预定义的阈值等级实现分层报警,可以80%,不过要考虑基数,Zabbix用的好不好,就看阈值设置的好不好,需要慢慢优化

告警机制

email、短信、微信、语音、故障自治愈(zabbix通知服务器重启,需事先写好脚本,针对物理机和虚拟机)

初级运维 –> 中级运维/高级运维 –> 架构师 –> 总监 –> CTO

1
2
host (host groups) <- templates		# 从模板继承告警配置
host -> items -> triggers -> action (条件-conditions, 操作-operations) # 自定义告警配置
数据展示
1
2
- zabbix web:基于nginx+php
- grafana:以zabbix为数据源,展示更为绚丽的界面

Zabbix 规划及部署

目前最新的LTS版本是5.0,5.0和之前版本有明显区别,但是文档还是英文的,所以目前学习还是以4.0为准

下载页面:https://www.zabbix.com/cn/download

规划

  • 数据库:CPU和磁盘IO一定要快,内存最好32G,磁盘要大,zabbix的监控数据会远大于业务数据量
  • zabbix server:zabbix server 直接装在物理机
    • CPU:16核
    • 磁盘:RAID10、500G
    • 内存:8G(监控几十个节点),16G(监控几百个节点),32G(监控两千个节点)

实验:

部署环境:服务器系统 ubuntu 18.04.5 / Centos 7.x

主机类型 IP地址
zabbix server 10.0.1.21
zabbix 主动代理 10.0.1.22
zabbix 被动代理 10.0.1.23
mysql master 10.0.1.24
mysql slave 10.0.1.25
web server1 10.0.1.26
web server2 10.0.1.27

yum/apt 安装

  1. Install Zabbix repository

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3+bionic_all.deb
    $ls
    zabbix-release_4.0-3+bionic_all.deb
    $dpkg -c zabbix-release_4.0-3+bionic_all.deb #查看dep包的内容
    ...
    #zabbix.list:官方提供的源
    -rw-r--r-- root/root 118 2019-07-30 16:34 ./etc/apt/sources.list.d/zabbix.list
    ...
    $dpkg -i zabbix-release_4.0-3+bionic_all.deb #安装dep包
    $vim /etc/apt/sources.list.d/zabbix.list #修改zabbix源
    #deb http://repo.zabbix.com/zabbix/4.0/ubuntu bionic main
    #deb-src http://repo.zabbix.com/zabbix/4.0/ubuntu bionic main
    deb https://mirrors.aliyun.com/zabbix/zabbix/4.0/ubuntu bionic main #替换为阿里云的源
    deb-src https://mirrors.aliyun.com/zabbix/zabbix/4.0/ubuntu bionic main
    $apt update
  2. 安装Zabbix server,Web前端,agent

    1
    2
    3
    [root@zabbix-server ~]$apt install zabbix-server-mysql zabbix-frontend-php zabbix-agent
    [root@zabbix-server ~]$systemctl disable mysql.service # 数据库单独装,把自带的禁用掉
    [root@zabbix-server ~]$systemctl stop mysql.service
  3. 安装、配置 mysql

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [root@mysql-master ~]$apt search mysql-server	# 确保mysql版本不低于5.7
    [root@mysql-master ~]$apt install mysql-server mysql-client

    [root@mysql-master ~]$mysql -uroot -p
    # 创建 zabbix_server 数据库
    mysql> create database zabbix_server character set utf8 collate utf8_bin;
    # 创建 zabbix_server 用户
    mysql> create user zabbix_server@'10.0.%.%' identified by '123456';
    mysql> grant all privileges on zabbix_server.* to zabbix_server@'10.0.%.%';

    [root@mysql-master ~]$vim /etc/mysql/mysql.conf.d/mysqld.cnf
    [mysqld]
    bind-address = 0.0.0.0 # 修改监地址,默认监听127.0.0.1,修改为0.0.0.0

    [root@mysql-master ~]$systemctl restart mysql.service

    数据库初始化:

    1
    [root@zabbix-server ~]$zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix_server -p123456 -h10.0.1.24 zabbix_server
  4. 为 Zabbix server 配置数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 编辑配置文件 /etc/zabbix/zabbix_server.conf
    [root@zabbix-server ~]$vim /etc/zabbix/zabbix_server.conf
    DBHost=10.0.1.24
    DBName=zabbix_server
    DBUser=zabbix_server
    DBPassword=123456

    [root@zabbix-server ~]$grep '^[a-Z]' /etc/zabbix/zabbix_server.conf
    LogFile=/var/log/zabbix/zabbix_server.log
    LogFileSize=0
    PidFile=/var/run/zabbix/zabbix_server.pid
    SocketDir=/var/run/zabbix
    DBHost=10.0.1.24
    DBName=zabbix_server
    DBUser=zabbix_server
    DBPassword=123456
    SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
    Timeout=4
    AlertScriptsPath=/usr/lib/zabbix/alertscripts
    ExternalScripts=/usr/lib/zabbix/externalscripts
    FpingLocation=/usr/bin/fping
    Fping6Location=/usr/bin/fping6
    LogSlowQueries=3000
  5. 为Zabbix前端配置PHP

    1
    2
    3
    4
    5
    6
    7
    # 编辑配置文件 /etc/zabbix/apache.conf
    [root@zabbix-server ~]$vim /etc/zabbix/apache.conf
    # php_value date.timezone Europe/Riga
    php_value date.timezone Asia/Shanghai # 修改时区

    # 重启 zabbix 和 apache 服务
    [root@zabbix-server ~]$systemctl restart zabbix-server zabbix-agent apache2
  6. 浏览器访问 http://10.0.1.21/zabbix,然后根据提示一步步配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Database type	MySQL
    Database server 10.0.1.24
    Database port 3306
    Database name zabbix_server
    Database user zabbix_server
    Database password 123456

    Zabbix server 10.0.1.21 # ip 和 主机名 均可
    Zabbix server port 10051
    Zabbix server name zabbix_server # 这里随便写

    # 如果以后更改配置,需要修改两个文件
    # /etc/zabbix/zabbix_server.conf
    # /usr/share/zabbix/conf/zabbix.conf.php # 生成的配置在此文件中

    默认的账号 Admin,密码 zabbix

  7. 默认只能显示英文,所以需要汉化

    1
    2
    3
    4
    5
    6
    7
    8
    # 安装简体中文语言环境
    [root@zabbix-server ~]$apt install language-pack-zh*
    # 增加中文语言环境变量
    [root@zabbix-server ~]$vim /etc/environment
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    LANG="zh_CN.UTF-8" # 添加此行
    # 重新设置本地配置
    [root@zabbix-server ~]$dpkg-reconfigure locales

    1
    2
    # 配置好后,需要重启apacha、php-fpm
    [root@zabbix-server ~]$systemctl restart apache2 php-fpm

    但是,还有部分页面乱码,需要更换默认的字体包:

    从 windows(位于 C:\Windows\Fonts) 系统中挑一个顺眼的字体包,上传到服务器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@zabbix-server fonts]$pwd
    /usr/share/zabbix/assets/fonts # 注意目录
    [root@zabbix-server fonts]$ls | tr ' ' \n
    graphfont.ttf # 默认字体
    simhei.ttf # 刚上传的 黑体
    simkai.ttf # 刚上传的 楷体,这两个都可以,其他的不一定可以


    [root@zabbix-server include]$pwd
    /usr/share/zabbix/include # 注意目录
    # 修改默认字体为黑体,楷体也可以
    [root@zabbix-server include]$sed -i 's/graphfont/simkai/' defines.inc.php
    [root@zabbix-server include]$systemctl restart apache2 php-fpm

    编译安装

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

    把 apt 安装的 zabbix-server、zabbix-proxy、zabbix-agent 等软件的 service 文件拷贝出来备用,然后恢复快照

    具体详见脚本 script-apt

    注意:

    1. server 和 proxy 不能安装在同一台主机

    2. 如果是centos,安装依赖参考:

      1
      yum install gcc libxml2-devel net-snmp net-snmp-devel curl curl-devel php phpbcmath php-mbstring mariadb mariadb-devel -y
    3. 汉化操作需要手动执行,脚本没有实现这个功能,不要忘记重启php-fpm

Zabbix 监控入门基础

  1. 了解业务结构
  2. 监控
  3. 业务优化

zabbix 概念

配置

  • 模板:

    • 键值(key):最基础的指令,每个键值表示一项数据,比如 system.hostname 表示主机名,zabbix内置了 一些,如果不够用,可以自定义(需要在zabbix_agentd.conf中指定)
    • 监控项(item):主要是由 键值 + 更新周期 组成
    • 应用集:对监控项分组,功能类似的监控项的合集
    • 触发器:据监控项的返回值对比预先设置的阈值,触发器会触发动作
      • 表达式:功能一般选择 last
    • 图形:
    • 自动发现:
    • web场景/web检测:
  • 主机群组

    • 1
  • 主机

    • d
  • 维护

    • w
  • 动作

    • 动作:动作由触发器触发,触发动作选项用来限制触发器的范围,一般选主机群组,只有该主机群组中的主机的触发器可以触发动作,多个触发条件可以选择和/或的关系

    • 操作:动作的操作会调用报警媒介,发送到指定用户,毕竟数据库出问题,需要发给DBA,发给网络工程师也不管用

      • 默认操作步骤持续时间:发送周期,一般配置 60s,即60秒发一次

      • 默认标题 和 消息内容:用{}包裹的变量是宏,zabbix所有内置的宏,参考:官方文档

        1
        2
        3
        4
        # 示例:
        {ALERT.SENDTO} # 报警脚本参数,值来自于用户报警媒介配置,可能是邮件、手机号等等
        {ALERT.SUBJECT} # 报警脚本参数,默认值由动作配置
        {ALERT.MESSAGE} # 报警脚本参数,默认值由动作配置
    • 恢复操作:解决完报警信息后,恢复信息也要发送

    • 更新操作:

  • 关联事件

    • 4
  • 自动发现:添加/移除/更改元素时执行自动操作

    https://www.zabbix.com/cn/auto_discovery
    https://www.zabbix.com/documentation/4.0/zh/manual/discovery/network_discovery

    • 网络发现:定期扫描、发现设备类型,IP,状态,运行时间/停机时间等,并采取预定义的操作。
    • 低级别发现(LLD):自动为设备上不同元素创建监控项,触发器和图形。
    • 主动agent自动注册 使用Zabbix agent自动开始监控新设备
  • 服务

    • 2

管理

  • agent代理程序:即 proxy
  • 报警媒介类型:把报警信息通知给用户的方式,可以配置邮件、短信、微信(通过脚本实现)等方式,以qq邮件为例,将qq邮箱和用户关联起来,发生报警后,qq邮箱作为发件人将报警信息发送到用户的邮箱中
  • 用户

zabbix server

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

zabbix server 是整个 zabbix 软件的核心程序。
zabbix server是所有配置、统计和操作数据的中央存储中心,也是zabbix监控系统的告警中心。
基本的 zabbix server 的功能分解成为三个不同的组件。他们是:zabbix server、web前端和数据库。

zabbix proxy

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

zabbix proxy 代表 zabbix server 采集监控数据,减轻 zabbix server 的 cpu 和 io 开销。
zabbix proxy 从受监控设备采集监控数据,先将数据缓存到本机数据库,然后传输到所属的 zabbix server。

zabbix agent

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

proxy 和 agent 都是代理,但前者是 服务端,后者是客户端

zabbix agent 部署在被监控目标上,以主动监控本地资源和应用程序(硬盘、内存、处理器统计信息等)。

zabbix agent 收集本地的操作信息并将数据报告给 zabbix server 用于进一步处理。一旦出现异常 (例如硬盘空间已满或者有崩溃的服务进程),zabbix server 会主动警告管理员指定机器上的异常。

zabbix agents 的极高效率缘于它可以利用本地系统调用来完成统计数据的采集。

默认监听在 10051 端口。

sender

主要用于测试的命令,例如:如果 Zabbix agent 收集不到数据,可以用这个命令发一下测试数据,看一下是 Zabbix agent 的问题还是网络问题

get

主要用于测试的命令,可以与 Zabbix agent 进行通信,并从 Zabbix agent 那里获取所需的信息

注意:只有 zabbix_agentd.conf 中 Server 配置的 ip 才能从该主机上 get 到数据

监控tomcat

所有的监控,配置步骤都是一样的:

  1. 创建主机
  2. 给主机添加模板

主动与被动监控模式

主动和被动都是相对 agent 来说的,被动模式配置简单,所以默认是被动模式

  • 被动检查:zabbix server(或 proxy)向 agent 要数据,agent 才工作,否则就不工作
  • 主动检查:agent 从 zabbix server 获取监控项列表,然后定期采集数据,主动发送给 zabbix server

被动模式

被动模式下,zabbix server会根据主机关联的模板中的监控项和数据采集间隔时间,周期性的打开随机端口并向zabbix agent服务器的10050发起tcp连接,然后发送获取监控项数据的指令,即zabbix server发送什么指令,zabbix agent就收集什么数据,zabbix server什么时候发送zabbix agent就什么时候采集,zabbix server不发送zabbix agent就闲着,所以zabbix agent也不用关心其监控项和数据采集周期间隔时间

优点就是配置简单,缺点是会加大 zabbix server 的工作量,在数百甚至数千台服务器的环境下会导致 zabbix server 需要轮训向每个 zabbix agent 发送数据采集指令,如果 zabbix server 负载很高还会导致不能及时获取到最新数据

主动模式

主动模式下,zabbix agent 主动向 zabbix server 的10051端口发起 tcp 连接请求(zabbix agent配置文件中指定zabbix server的IP或者主机名),获取到自己的监控项和数据采集周期等信息,然后再周期性的采集指定的数返回给 zabbix server

主动模式可以有效减轻 zabbix server 的压力,推荐使用主动模式

配置主动模式:

  1. 修改 zabbix agent 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # zabbix_agentd.conf
    PidFile=/usr/local/zabbix/run/zabbix_agentd.pid
    LogFile=/tmp/zabbix_agentd.log
    LogFileSize=0
    Server=10.0.1.21 # 被动模式下,指定zabbix server的ip,如果全部监控项都是主动模式,则可注释此项
    StartAgents=3
    ServerActive=10.0.1.21 # 重点,开启主动模式,指定zabbix server的ip
    Hostname=10.0.1.26 # zabbix agent本机的ip
    Timeout=30
    Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf
  2. 生成主动模式模板
    完全克隆zabbix内置的Template OS Linux模板,命名为:Template OS Linux-active,修改监控项的类型,可以单独改,也可以批量更新

  3. 最后把主动模式模板添加到主机上

zabbix proxy

zabbix proxy架构

zabbix proxy对比zbbbix server

功能 zabbxy proxy zabbix server
量级 请量级 相对重量级
图形 带图形控制界面
可以独立工作 是,可以独立采集数据并存储 是,即数据采集、存储、分析、展示于一体
易维护 是,配置完成后基本无需管理 维护也不难
独立数据库 保留少量最近数据 保留指定时间内的所有数据
报警通知 不支持发送邮件通知 支持邮件、短信等告警机制(基于调用脚本)

zabbix proxy部署与使用

zabbix proxy 的大版本必须要和 zabbix server 版本一致,否则会出现兼容性问题

apt/yum安装zabbix proxy

https://www.zabbix.com/documentation/4.0/zh/manual/installation/install_from_packages/debian_ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 安装软件仓库配置包
$wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-2+bionic_all.deb
$dpkg -i zabbix-release_4.0-2+stretch_all.deb
$sed -i 's@http://repo.zabbix.com@https://mirrors.aliyun.com/zabbix@' /etc/apt/sources.list.d/zabbix.list
$apt update
# 安装 SERVER/PROXY/前端
$apt install zabbix-proxy-mysql
$cat /lib/systemd/system/zabbix-proxy.service # 这里的service文件没有看懂
[Unit]
Description=Zabbix Proxy (MySQL/MariaDB)
Documentation=man:zabbix_proxy
After=network.target mysql.service

[Service]
Type=simple
User=zabbix
Group=zabbix
ExecStart=/usr/sbin/zabbix_proxy --foreground
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

# 配置数据库
略...

编译安装zabbix proxy

  1. 编译安装,参考脚本…
  2. 修改被监控主机的配置文件,Server 和 ServerActive
  3. 管理 -> agent代理程序 -> 创建代理(注意名称要和zabbix_proxy.conf中的hostname对应起来) -> 修改主机的“由agent代理程序监测”参数

zabbix 监控案例实战

  1. 自定义监控项
  2. 通过脚本采集监控项数据
  3. zabbix agent获取监控项数据
  4. 自定义模板和图形及触发器
  5. 验证数据

监控Linux TCP连接状态

  1. 监控TCP连接数脚本

    1
    2
    3
    [root@zabbix-web1 ~]#cat /usr/local/zabbix/data/tcp_conn.sh
    #!/bin/bash
    ss -ant | awk -v TCP_STAT=$1 -v s=0 '$1==TCP_STAT {++s} END {print s}'
  2. zabbix agent添加自定义监控项

    1
    2
    3
    4
    5
    6
    [root@web1 etc]$vim zabbix_agentd.conf
    ...
    UserParameter=tcp_status[*],/bin/bash /usr/local/zabbix/data/tcp_conn.sh $1 $2
    ...
    [root@web1 etc]$chmod a+x zabbix_agentd.conf
    [root@web1 etc]$systemctl restart zabbix-agent
  3. zabbix server测试监控项数据

    1
    2
    3
    4
    5
    6
    [root@zabbix bin]$./zabbix_get -s 10.0.1.26 -p 10050 -k tcp_status[TIME-WAIT]
    1
    [root@zabbix bin]$./zabbix_get -s 10.0.1.26 -p 10050 -k tcp_status[ESTAB]
    2
    [root@zabbix bin]$./zabbix_get -s 10.0.1.26 -p 10050 -k tcp_status[LISTEN]
    9
  4. zabbix web导入模板
    配置-模板-导入

  5. 将TCP监控模板关联至主机

  6. 验证监控数据

监控Memcached

  1. 安装 memcached

  2. 监控脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    [root@web1 data]$grep '^[^#]' /etc/memcached.conf    
    -d
    logfile /var/log/memcached.log
    -m 64
    -p 11211
    -u memcache
    -l 127.0.0.1
    -P /var/run/memcached/memcached.pid

    [root@web1 data]$echo -e "stats\nquit" | nc 127.0.0.1 11211
    STAT pid 5590
    STAT uptime 725
    STAT time 1613618905
    STAT version 1.5.6 Ubuntu
    STAT libevent 2.1.8-stable
    STAT pointer_size 64
    STAT rusage_user 0.072870
    STAT rusage_system 0.048580
    STAT max_connections 1024
    STAT curr_connections 1
    STAT total_connections 4
    STAT rejected_connections 0
    STAT connection_structures 2
    STAT reserved_fds 20
    STAT cmd_get 0
    STAT cmd_set 0
    STAT cmd_flush 0
    STAT cmd_touch 0
    STAT get_hits 0
    STAT get_misses 0
    STAT get_expired 0
    STAT get_flushed 0
    STAT delete_misses 0
    STAT delete_hits 0
    STAT incr_misses 0
    STAT incr_hits 0
    STAT decr_misses 0
    STAT decr_hits 0
    STAT cas_misses 0
    STAT cas_hits 0
    STAT cas_badval 0
    STAT touch_hits 0
    STAT touch_misses 0
    STAT auth_cmds 0
    STAT auth_errors 0
    STAT bytes_read 35
    STAT bytes_written 3795
    STAT limit_maxbytes 67108864
    STAT accepting_conns 1
    STAT listen_disabled_num 0
    STAT time_in_listen_disabled_us 0
    STAT threads 4
    STAT conn_yields 0
    STAT hash_power_level 16
    STAT hash_bytes 524288
    STAT hash_is_expanding 0
    STAT slab_reassign_rescues 0
    STAT slab_reassign_chunk_rescues 0
    STAT slab_reassign_evictions_nomem 0
    STAT slab_reassign_inline_reclaim 0
    STAT slab_reassign_busy_items 0
    STAT slab_reassign_busy_deletes 0
    STAT slab_reassign_running 0
    STAT slabs_moved 0
    STAT lru_crawler_running 0
    STAT lru_crawler_starts 1275
    STAT lru_maintainer_juggles 774
    STAT malloc_fails 0
    STAT log_worker_dropped 0
    STAT log_worker_written 0
    STAT log_watcher_skipped 0
    STAT log_watcher_sent 0
    STAT bytes 0
    STAT curr_items 0
    STAT total_items 0
    STAT slab_global_page_pool 0
    STAT expired_unfetched 0
    STAT evicted_unfetched 0
    STAT evicted_active 0
    STAT evictions 0
    STAT reclaimed 0
    STAT crawler_reclaimed 0
    STAT crawler_items_checked 0
    STAT lrutail_reflocked 0
    STAT moves_to_cold 0
    STAT moves_to_warm 0
    STAT moves_within_lru 0
    STAT direct_reclaims 0
    STAT lru_bumps_dropped 0
    END

    [root@web1 data]$cat memcache_monitor.sh
    #!/bin/bash
    echo -e "stats\nquit" | nc 127.0.0.1 11211 | grep "STAT $1" | awk '{print $3}'
  3. zabbix agent添加自定义监控项

  4. zabbix server测试监控项数据

  5. zabbix web制作模板

    1. 创建模板
    2. 创建监控项
    3. 创建触发器
    4. 创建图形
  6. 模板关联主机

  7. 验证监控项数据

监控Redis

  1. 安装Redis

  2. 监控脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    [root@web1 data]$redis-cli -h 127.0.0.1 -p 6379 info			# 所有info
    ...
    [root@web1 data]$redis-cli -h 127.0.0.1 -p 6379 info clients # 客户端相关info
    # Clients
    connected_clients:1 # 当前连接数
    client_longest_output_list:0
    client_biggest_input_buf:0
    blocked_clients:0
    [root@web1 data]$redis-cli -h 127.0.0.1 -p 6379 info memory # 内存相关info
    # Memory
    used_memory:839288 # 已用内存
    used_memory_human:819.62K
    used_memory_rss:3846144
    used_memory_rss_human:3.67M
    used_memory_peak:841288
    used_memory_peak_human:821.57K
    used_memory_peak_perc:99.76%
    used_memory_overhead:832134
    used_memory_startup:782504
    used_memory_dataset:7154
    used_memory_dataset_perc:12.60%
    total_system_memory:2065870848
    total_system_memory_human:1.92G
    used_memory_lua:37888
    used_memory_lua_human:37.00K
    maxmemory:0
    maxmemory_human:0B
    maxmemory_policy:noeviction
    mem_fragmentation_ratio:4.58
    mem_allocator:jemalloc-3.6.0
    active_defrag_running:0
    lazyfree_pending_objects:0
  3. zabbix agent添加自定义监控项

  4. zabbix server测试监控项数据

  5. zabbix web模板制作

    1. 创建模板
    2. 创建触监控项:当前连接数监控项、已用内存监控项
    3. 创建触发器:当前连接数触发器、已用内存触发器
    4. 创建图形:Redis当前连接数图形、Redis已用内存图形
  6. 模板关联主机

  7. 验证监控项数据

监控 Nginx

  1. 安装nginx

  2. 监控脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/bin/bash
    nginx_active() {
    curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | grep 'Active' | awk '{print $NF}'
    }
    nginx_reading() {
    curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | grep 'Reading' | awk '{print $2}'
    }
    nginx_writing() {
    curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | grep 'Writing' | awk '{print $4}'
    }
    nginx_waiting() {
    curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | grep 'Waiting' | awk '{print $6}'
    }
    nginx_accepts() {
    curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | awk NR==3 | awk '{print $1}'
    }
    nginx_handled() {
    curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | awk NR==3 | awk '{print $2}'
    }
    nginx_requests() {
    curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | awk NR==3 | awk '{print $3}'
    }

    case $1 in
    active)
    nginx_active
    ;;
    reading)
    nginx_reading
    ;;
    writing)
    nginx_writing
    ;;
    waiting)
    nginx_waiting
    ;;
    accepts)
    nginx_accepts
    ;;
    handled)
    nginx_handled
    ;;
    requests)
    nginx_requests
    ;;
    esac
  3. zabbix agent添加自定义监控项

    1
    2
    3
    4
    [root@web1 etc]$cat zabbix_agentd.conf
    ...
    UserParameter=nginx_status[*],/usr/local/zabbix/data/nginx_status.sh $1
    ...
  4. 导入Nginx监控模板

  5. 模板关联主机

  6. 验证监控数据

SNMP 监控

SNMP:Simple Network Management Protocol,简单网络管理协议,TCP/IP协议簇的一个应用层协议

Linux 设备通过 agent 监控,网络设备通过 SNMP 协议监控,主要用于监控华为、思科等网络设备

SNMP有三个版本:目前主要使用的是 v2c 版本

1
2
3
SNMP v1		# 团体名(Community Name)认证
SNMP v2c # 团体名认证,它在兼容SNMP v1的同时又扩充了SNMP v1的功能
SNMP v3 # 基于用户的安全模型(USM,User-Based Security Model)的认证机制

SNMP数据交互

SNMP管理进程与代理进程之间为了交互信息,定义了5种报文:

1
2
3
4
5
get-request			# 从代理进程处提取一个或多个参数值
get-response # 返回的一个或多个参数值。这个操作是由代理进程发出的
trap # 代理进程主动发出的报文,通知管理进程有某些事情发生
get-next-request # 从代理进程处提取一个或多个参数的下一个参数值
set-request # 设置代理进程的一个或多个参数值

SNMP组织结构

SNMP结构非常复杂,一套完整的SNMP系统主要包括以下几个方面:

  1. SNMP报文协议
  2. 管理信息结构(SMI, Structure of Management Information),一套公用的结构和表示符号
  3. 管理信息库(MIB,Management Information Base),管理信息库包含所有代理进程的所有可被查询和修改的参数
  4. OID(Object Identifiers),一个OID是一个唯一的键值对,用于标识具体某一个设备的某个具体信息(对象标识),如端口信息、设备名称等

SNMP MIB

MIB是OID的集合。MIB是基于对象标识树的,对象标识是一个整数序列,中间以”.”分割,这些整数构成一个树型结构,类似于 DNS或Unix的文件系统,MIB被划分为若干个组,如system、 interfaces、 a t(地址转换)和ip组等。iso. org.dod.internet.private.enterprises(1.3 .6 .1.4.1)这个标识,是给厂家自定义而预留的,比如华为:1.3.6.1.4.1.2011,华三:1.3.6.1.4.1.25506

SNMP OID

OID 就是对象标识

snmpwalk工具可以使用SNMP的get请求查询指定OID入口的所有OID树信息。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能

ubuntu中版本较新,这里以centos7为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$yum -y install net-snmp-utils
$snmpwalk -h
USAGE: snmpwalk [OPTIONS] AGENT [OID]
–h:显示帮助。
–v:指定snmp的版本, 1或者2c或者3。
–c:指定连接设备SNMP密码。 # 重点
–V:显示当前snmpwalk命令行版本。 # 重点,其实基本上也就只用这俩参数
–r:指定重试次数,默认为0次。
–t:指定每次请求的等待超时时间,单为秒,默认为3秒。
–l:指定安全级别:noAuthNoPriv|authNoPriv|authPriv。
–a:验证协议:MD5|SHA。只有-l指定为authNoPriv或authPriv时才需要。
–A:验证字符串。只有-l指定为authNoPriv或authPriv时才需要。
–x:加密协议:DES。只有-l指定为authPriv时才需要。
–X:加密字符串。只有-l指定为authPriv时才需要。

[root@zabbix-server ~]#snmpwalk -v 2c -c 123456 10.0.58.108 1.3.6.1.2.1.1.1
iso.3.6.1.2.1.1.1.0 = STRING: "Linux centos7 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64"

[root@zabbix-server ~]#snmpwalk -v 2c -c 123456 10.0.58.108 1.3.6.1.2.1.1.5
iso.3.6.1.2.1.1.5.0 = STRING: "centos7"

配置zabbix

使用zabbix 自带的SNMP,要先修改团体名称,否则 会因为团体名不一致导致zabbix没有权限去获取被监控服务器的snmp利用率

监控 MySQL

监控MySQL连接数、主从同步、同步延迟等

percona-monitoring-plugins

percona 官方出了专门的监控管理软件,所以已经停止维护 percona-monitoring-plugins,以下使用旧的版本

  1. 监控脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [root@mysql-master src]$wget https://downloads.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/debian/artful/x86_64/percona-zabbix-templates_1.1.8-1.artful_all.deb

    $dpkg -c percona-zabbix-templates_1.1.8-1.artful_all.deb | awk '{print $NF}'
    ...
    ./var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh # 监控脚本,修改手动修改
    ./var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php # 设置mysql的用户名和密码
    ./var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf # userparameter
    ./var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml # 模板文件,直接导入即可
    ...
    $dpkg -i percona-zabbix-templates_1.1.8-1.artful_all.deb

    $cp /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh /usr/local/zabbix/data/
    $vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
    <?php
    ...
    $mysql_user = 'root';
    $mysql_pass = '123456';
    ...
  2. 新建模板:直接导入zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml即可

  3. 新建主机,并连接到刚创建的模板

自定义脚本监控MySQL

编写脚本监控脚本MySQL主从同步及延迟

slave机器上有两个关键的进程:

  • Slave_SQL_Running:负责自己的slave mysql进程
  • Slave_IO_Running:负责与主机的io通信
1
2
3
4
5
6
# 主从延迟,实际上只靠 Seconds_Behind_Master 这一个参数是不够的
mysql -uroot -p123456 -e "show slave status\G;" | grep "Seconds_Behind_Master:" | awk -F: '{print $2}'

mysql -uroot -e "show slave status\G;" | grep "Slave_IO_Running" | awk -F: '{print $2}' | sed 's/^[ \t]*//g'

mysql -uroot -e "show slave status\G;" | grep "Slave_SQL_Running:" | awk -F: '{print $2}' | sed 's/^[ \t]*//g'

自定义端口和进程监控

zabbix 内置相关key:

1
2
3
4
5
6
7
8
# 检查 TCP 端口 是否处于侦听状态。返回 0 - 未侦听;1 - 正在侦听
net.tcp.listen[port]
# 检查是否能建立 TCP 连接到指定端口。返回 0 - 不能连接;1 - 可以连接
net.tcp.port[<ip>,port]
# 检查服务是否运行并接受 TCP 连接。返回 0 - 服务关闭;1 - 服务运行
net.tcp.service[service,<ip>,<port>]
# 检查 TCP 服务的性能,当服务 down 时返回 0,否则返回连接服务花费的秒数
net.tcp.service.perf[service,<ip>,<port>]

故障自治愈功能

当zabbix 监控到指定的监控项异常的时候,通过指定的操作使故障自动恢复,通常是重启服务等一些简单的操作,也可以调用脚本执行比较复杂的操作

设置监控项和触发器,新建动作,在触发条件里面添加操作,在远程主机通过zabbix 客户端执行命令

  1. zabbix agent需要开启远程命令执行

    1
    2
    3
    # zabbix_agentd.conf
    EnableRemoteCommands=1 # 开启远程执行命令
    UnsafeUserParameters=1 # 允许远程执行命令的时候使用不安全的参数(特殊字符串)
  2. zabbix用户授权

    1
    2
    # /etc/sudoers
    zabbix ALL = NOPASSWD: ALL # 授权指定用户执行特殊命令不再需要密码,比如sudo等
  3. 创建动作
    配置–动作–创建动作

  4. 执行远程操作

  5. 验证自治愈功能

    将被测试的服务手动停止运行,验证能否自动启动或重启,更多操作可以远程执行脚本
    手动将Nginx、Tomcat等web服务停止后,验证zabbix agent能否自动启动或重启

grafana图形展示

grafana 本身只是一个图形显示工具,它独立于zabbix之外,通过zabbix提供的api获取数据,进行展示,其实不只是zabbix,它还可以搭配 prometheus、elasticsearch、mysql 等等,只要你提供数据,它都能给你展示出来

grafana 相比 zabbix 自带的web界面,更加好看

  1. 安装grafana服务
    https://grafana.com/grafana/download?platform=linux

    1
    2
    3
    sudo apt-get install -y adduser libfontconfig1
    wget https://dl.grafana.com/oss/release/grafana_7.4.2_amd64.deb
    sudo dpkg -i grafana_7.4.2_amd64.deb
  2. grafana安装并启用zabbix插件
    https://grafana.com/grafana/plugins/alexanderzobnin-zabbix-app

    1
    2
    3
    4
    5
    6
    7
    8
    grafana-cli plugins install alexanderzobnin-zabbix-app

    # 以上方式可能失败,推荐直接下载,然后移动到插件目录
    $wegt https://storage.googleapis.com/plugins-community/alexanderzobnin-zabbix-app/release/4.1.2/alexanderzobnin-zabbix-app-4.1.2.zip
    $unzip alexanderzobnin-zabbix-app-4.1.2.zip
    $mv alexanderzobnin-zabbix-app /var/lib/grafana/plugins/

    $systemctl restart grafana-server.service
  3. 启动zabbix插件

  4. 添加zabbix 数据源

    1. 添加mysql数据源

    2. 添加zabbix数据源

  5. 添加Dashboard

自定义基础监控模板

略…

结合pyhton脚本监控案例

kubernetes 集群状态监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@kubernetes-master1 ~]# cat /usr/local/zabbix/data/k8s_monitor.py
#!/usr/bin/env python
#coding:utf-8
#Author ZhangShiJie

import subprocess
success_list = []
error_list= []
def get_status():
obj = subprocess.Popen(("curl -sXGET http://10.20.15.209:8080/api/v1/nodes"),shell=True, stdout=subprocess.PIPE)
data = obj.stdout.read()
data1 = eval(data)
data2 = data1.get('items')
#print data2
for i in data2:
data3 = i.get('status')
for i in data3.get('conditions'):
if i.get('reason') == 'KubeletReady':
if i.get('type') == "Ready":
if i.get('status') == 'True':
success_list.append(i.get('status'))
elif i.get('status') == 'False':
error_list.append(i.get('status'))
else:
break
else:
error_list.append(i.get('status'))
#pass
else:
error_list.append(i.get('status'))

def count_status():
if len(error_list) == 0:
print 50
else:
print 100

def main():
get_status()
count_status()

if __name__ == "__main__":
main()

# chmod a+x /usr/local/zabbix/data/k8s_monitor.py

监控MongodbDB复制集状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#cat /usr/local/zabbix/data/mongodb_cluster_monitor.py
#!/bin/env python
#coding:utf-8
#Author: ZhangShiJie

import subprocess
success_list = []
error_list= []

def get_mongodb_status():
obj = subprocess.Popen(("echo 'rs.status()' | /usr/local/mongodb/bin/mongo -u user -p wswd --authenticationDatabase admin \
| grep health | awk -F':' '{print $2}' | awk -F',' '{print $1}'"),shell=True, stdout=subprocess.PIPE)
restful = obj.stdout.read()
data = restful.split()
for i in data:
if i == "1":
success_list.append(i)
else:
error_list.append(i)

def count_status():
if len(error_list) > 0:
print 100
else:
print 50

def main():
get_mongodb_status()
count_status()

if __name__ == "__main__":
main()

#chmod a+x /usr/local/zabbix/data/redis_llen.py

监控Redis列表长度

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@redis ~]#cat /usr/local/zabbix/data/redis_llen.py
#!/usr/bin/env python
#coding:utf-8
#Author ZhangShijie
import redis
def redis_conn():
pool=redis.ConnectionPool(host="10.20.0.252",port=6379,db=0)
conn = redis.Redis(connection_pool=pool)
data = conn.llen('api4-nginx-accesslog')
print(data)
redis_conn()

[root@redis ~]# chmod a+x /usr/local/zabbix/data/redis_llen.py

监控ELK集群状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@elk-s1 ~]# vim /usr/local/zabbix/data/els_status.py

#!/usr/bin/env python
#coding:utf-8
#Author ZhangShijie

import subprocess
false="false"
obj = subprocess.Popen(("curl -sXGET http://10.20.3.128:9200/_cluster/health?
pretty=true"),shell=True, stdout=subprocess.PIPE)
data = obj.stdout.read()
data1 = eval(data)
status = data1.get("status")
if status == "green":
print "100"
else:
print "50"

[root@elk-s1 ~]# chmod a+x /usr/local/zabbix/data/els_status.py

监控RabbitMQ集群节点状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#cat /usr/local/zabbix/data/rabbit_cluster_monitor.py
#!/bin/env python
#coding:utf-8
#Author: ZhangShiJie

import subprocess
running_list = []
error_list = []
false="false"
true="true"
def get_status():
obj = subprocess.Popen(("curl -sXGET -u guest:guest http://10.20.3.171:15671/api/nodes"),shell=True,stdout=subprocess.PIPE)
data = obj.stdout.read()
data1 = eval(data)
for i in data1:
if i.get("running") == "true":
running_list.append(i.get("name"))
else:
error_list.append(i.get("name"))
def count_server():
if len(running_list) < 3: #可以判断错误列表大于0或者运行列表小于3,3未总计的节点数量
print 100 #100就是集群内有节点运行不正常了
else:
print 50 #50为所有节点全部运行正常
def main():
get_status()
count_server()
if __name__ == "__main__":
main()

#chmoa a+x /usr/local/zabbix/data/rabbit_cluster_monitor.py

Zabbix 事件通知机制

出现故障报警的时候,可以通过不同方式通知管理员进行故障处理,尽快恢复业务

1
2
3
# zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts #报警脚本路径
ExternalScripts=/usr/lib/zabbix/externalscripts #外部脚本路径

报警的最核心就是把报警媒介配置好,包括它前后的部分

  1. 添加报警媒介(邮件、短信、微信)
  2. 将报警媒介添加到动作的操作中,这样通过动作,就将触发器和报警媒介关联起来了
  3. 将报警媒介添加到用户,这样,当有触发器报警,就会通过报警媒介通知到用户

邮件通知

短信通知

微信通知

略..,和短信通知差不多

Zabbix 自动化运维

批量部署 Agent

使用agent,实现agent的自动化批量安装,可以通过源码或apt等方式安装

API

通过 zabbix web 进行的操作,都提供对应的API,可以通过编程的方式实现

API简介:https://www.zabbix.com/documentation/4.0/zh/manual/api
API列表:https://www.zabbix.com/documentation/4.0/zh/manual/api/reference

动态发现主机