监控系统是整个运维环节,乃至整个产品生命周期中最重要的一个环节,事前及时预警发现故障,事后提供数据用于追查定位问题。
#生活中:
1.超市监控,防内外偷
2.交通监控:测速,违章
#企业中:
1.系统的监控:实际是对系统不间断的实时监控
2.实时反馈系统当前状态,我们监控某个硬件,或者是某个系统,都是需要能实时看到当前系统的状态,是正常,异常或者是故障
3.保证服务可靠性安全性,我们监控的目的就是要保证系统,业务能够正常运行
4.保证业务持续稳定运行,如果我们对的监控做的很完善,即使出现故障,能第一时间接收到故障报警,在第一时间处理解决,保证业务持续性的稳定运行(通常,第一时间知道业务宕机的都是用户)
1.CACTI 网络监控
2.NAGIOS 系统监控
3.zabbix 分布式监控 关系型数据库
4.open-falcon 小米监控产品
5.普罗米修斯 监控docker,K8S 时序数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G5vOlJLi-1615878129888)(D:\linux\zabbix监控系统\img\image-20210311092646206.png)]
- 监控服务器可用性和数据丢失
- 监控服务器的响应性。
- 了解服务器容量、用户负载和服务器速度。
- 检测并防止任何可能影响服务器的问题。
#硬件层面
如果说到硬件,肯定要先说服务器用的什么型号?
--物理服务器,选型 Dell R710 720 730
IDRAC自带一个远程管理卡,安装上一个软件包之后,就可以监控
--如果不使用Dell的IDRAC那就使用zabbix的IPMI接口监控硬件
1)cpu温度
2)风扇转速
3)磁盘是否损坏
4)CMOS电池电量
5)内存是否损坏
#系统层面
1)cpu:使用率,负载
2)内存:使用率
3)磁盘:使用率,IO
4)进程
#网络层面:
1)网络设备:路由器,交换机
2)网卡入口流量
3)网卡出口流量
4)带宽的峰值
--使用zabbix的snmp方式监控
#应用层面
1)MySQL模板:主从复制是否有延迟(zabbix监控模板)
2)redis:主从复制是否有延迟
监控思路:zabbix没有固定模板,可以在主库中set一个key为时间戳,然后从库会同步这个时间戳(动态)写脚本时会获取这两个时间戳,做对比
3)NFS:磁盘挂载状况
4)tomcat:JVM监控,老年代,新生代,永久带,full-gc,垃圾回收
5)rsync的同步情况,MD5校验文件是否被篡改
#业务层面
1)URL的监控
2)API的监控
3)nginx的状态码
4)tomcat的exception
5)请求时间
6)响应时间
7)加载时间
8)渲染时间
Zabbix监控组件主要包括:Zabbix Server、Zabbix Proxy、Zabbix Agent;其中Zabbix Server包括:Web GUI、Database、Zabbix Server。
#每个组件的作用:
abbix Server:负责接收agent发送的报告信息的核心组件,所有配置,统计数据及操作数据均由其组织进行;
Database:用户存储所有配置信息,以及存储由Zabbix Server收集到的数据;
Web GUI:Zabbix的interface接口,通常与Server运行在同一台主机上;
Zabbix Proxy:常用于分布监控环境中,代理Server收集部分被监控的监控数据并统一发往Server端;(通常大于500台主机需要使用)
Zabbix Agent:部署在被监控主机上,负责收集本地数据发往Server端或Proxy端
Zabbix分布式监控系统监控客户端的方式常见有三种:Agent、SNMP、IPMI。
Agent:Zabbix可以基于自身zabbix_agent客户端插件监控OS的状态,例如CPU、内存、硬盘、网卡、文件等。
SNMP:Zabbix通过SNMP协议监控网络设备或windows主机等。通过设定SNMP的参数将相关监控数据传送至服务端,交换机、防火墙等网络设备一般都支持SNMP协议。
IPMI(Intelligent Platform Management Interface):智能平台管理接口,即主要应用于设备的物理特性,包括:温度、电压、电扇工作状态,电源供应以及机箱入侵等。IPMI最大的优势在于无论OS的开机还是关机状态下,只要接通电源就可以实现对服务器的监控。
Zabbix监控客户端分为主动监控与被动监控。Zabbix监控客户端默认为被动模式,可以修改为主动模式,只需要在客户端配置文件中添加 StartAgents=0。
Zabbix主动模式:Agent主动请求server获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy,zabbix agent首先向ServerActive配置的IP请求获取active items,获取并提交active items数据至server/proxy。
Zabbix被动模式:Server向agent请求获取监控项的数据,agent返回数据,server打开一个TCP连接,Server发送请求agent.ping,Agent接收到请求并且响应,Server处理接收到的数据。
#概念 解释说明
主机(host) #被监控的网络设备,可以写IP或者DNS;
主机组(host group) #主机组用于管理主机,可以批量设置权限;
监控项(item) #具体监控项,items值由独立的keys进行识别;
触发器(trigger) #为某个items设置触发器,达到触发器会执行action动作;
事件(event) #达到某个触发器,称之为一个事件;
动作(action) #对于特定事件事先定义的处理方法,默认可以发送信息及发送命令;
报警升级(escalation) #发送警报或执行远程命令的自定义方案,如隔5分钟发送一次警报,共发送5次等。
媒介(media) #发送通知的方式,可以支持Mail、SMS、Scripts等;
通知(notification) #通过设置的媒介向用户发送的有关某事件的信息;
远程命令 #达到触发器,可以在被监控端执行命令;
模板(template) #可以快速监控被监控端,模块包含:item、trigger、graph、screen、application;
web场景(web scennario) #用于检测web站点可用性,监控HTTP关键词;
web前端(frontend) #Zabbix的web接口;
图形(graph) #监控图像;
屏幕(screens) #屏幕显示;
幻灯(slide show) #幻灯显示
可参考:https://cloud.tencent.com/developer/article/1426555
1)w
2)top
3)htop
4)glances (yum install glances -y)
5)uptime
#不管什么命令监控,查看CPU,我们都必须了解,系统的用户和内核态
us: 用户态 跟用户的操作有关35%
sy: 内核态 跟内核的处理有关65%
id: cpu空闲
#当我们执行一个命令的时候,很快就能出来结果,但是他都占用了哪些时间呢?
--例:
[root@db02 ~]# time ls
anaconda-ks.cfg mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz school.sql t100w.sql world.sql
real 0m0.002s #真实执行时间
user 0m0.000s #用户执行时间
sys 0m0.002s #系统执行时间
1)free
free -m
free -h
2)top
3)glances
4)htop
#如何查看单个进程占用内存?
--进程占用内存公式
pmem = VmRSS / MemTotal * 100
process mem = 虚拟内存 / 总内存 * 100
[root@web02 ~]# cat mem.py
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
# 收集程序所占用的物理内存大小,占所有物理内存的比例
# Python: 2.7.6
import sys
import os
from subprocess import Popen,PIPE
def get_pid(program):
'获取目标程序的PID列表'
p = Popen(['pidof',program],stdout=PIPE,stderr=PIPE)
pids,stderrput = p.communicate()
# pids = p.stdout.read() #这种方法也是可以的
# 这里也可以对stderrput来进行判断
if pids:
return pids.split()
else:
raise ValueError
def mem_calc(pids):
'计算PIDs占用的内存大小'
mem_total = 0
for pid in pids:
os.chdir('/proc/%s' % pid)
with open('status') as fd:
for line in fd:
if line.startswith('VmRSS'):
mem = line.strip().split()[1]
mem_total += int(mem)
break
return mem_total
def mem_percent(mem):
'计算程序内存占用物理内存的百分比'
with open('/proc/meminfo') as fd:
for line in fd:
if line.startswith('MemTotal'):
total = line.strip().split()[1]
percent = (float(mem)/int(total)) * 100
return percent
def main():
try:
program = sys.argv[1]
pids = get_pid(program)
except IndexError as e:
sys.exit('%s need a Program name ' % __file__)
except ValueError as e:
sys.exit('%s not a Process Name or not Start' % program )
mem_total = mem_calc(pids)
percent = mem_percent(mem_total)
return program,mem_total,percent
if __name__ == '__main__':
program,mem_total,mem_percent=main()
print('进程名称:%s\n物理内存为:%s\n百分比为:%.2f%%'% (program,mem_total,mem_percent))
1)df
df -h
文件系统 容量 已用 可用 已用% 挂载点
df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
2)iotop
3)iostat
4)dstat
5)glances
1)glances
2)iftop
3)nethogs #可以查看某个进程所使用的流量
4)ifconfig
5)route
1)netstat
netstat -an
[root@db02 ~]# netstat -an|awk '/^tcp/ {print $NF}'|sort|uniq -c
3 ESTABLISHED
7 LISTEN
[root@db02 ~]# netstat -an|awk '/^tcp/ {++state[$NF]} END {for(key in state) print key," \t" ,state[key]}'
LISTEN 7
ESTABLISHED 3
2)ss
[root@db02 ~]# ss -n|awk '{print $2}'|sort|uniq -c
90 ESTAB
1 State
--生产场景需求
如何每1分钟监控当前系统的内存使用状态,如果可用低于100MB则发送邮件。同时打印当前还剩余多少内存
1.如何获取内存的状态信息 free -m
2.如何获取内存的可用状态 free -m|awk '/Mem/{print $NF}'
3.如何进行数字的比对,高于100MB不处理,低于100MB,发送邮件。
4.如何每分钟执行
--脚本:[root@db02 ~]# vim free.sh
#!/bin/bash
while true;do
free_av=$(free -m|awk '/^Mem/{print $NF}')
Hostname=$(hostname)_$(hostname -I|awk '{print $2}')
Date=$(date +%F)
if [ $free_av -lt 100 ];then
echo "$Date: ${Hostname},内存低于100MB,还有${free_av}MB内存可用"
fi
sleep 2
done
[root@db02 ~]# sh free.sh
2020-10-12: web02_,内存低于100MB,还有20MB内存可用
2020-10-12: web02_,内存低于100MB,还有6MB内存可用
2020-10-12: web02_,内存低于100MB,还有5MB内存可用
[root@db02 ~]# dd < /dev/zero > /dev/null bs=2000M
随着时间的推移,用户不断增多,服务消耗的内存越来越多,当系统内存不足的时候,可能会导致系统产生oom(out of memory)
1.当系统内存不足时就会大量使用swap(虚拟内存)
2.当系统大量使用swap的时候,系统会特别卡
注意:有时可能内存还有剩余300M或者500M,但是swap依然被使用
[root@db02 ~]# dd < /dev/zero > /dev/null bs=2000M
[root@db02 ~]# tail -f /var/log/messages
Out of memory: Kill process 29957 (dd) score 366 or sacrifice child
Killed process 29957 (dd) total-vm:2532680kB, anon-rss:1416508kB, filers:0kB
#使用脚本+定时任务的方法,进行监控,并使用邮件报警
#!/bin/bash
nginx_process=`ps -ef|grep -c [n]ginx`
if [ $nginx_process -lt 2 ];then
echo "目前nginx进程数是:$nginx_process"|mail -s "完犊子nginx挂了" 133411023@qq.com
fi
内存和磁盘
Zabbix同时需要物理内存和磁盘空间。刚开始使用Zabbix,建议128MB物理内存和256MB可用磁盘空间。然而, 具体需要的内存大小和磁盘空间要根据主机数量和监控参数而定。如果你计划对监控的参数进行长期保存,你应该考虑至少在数据库中预留几个GB的空间,以用来保留历史数据。 每个Zabbix的守护进程需要与数据库服务器建立多个连接。分配给连接的内存数量,取决于数据库引擎的配置。
CPU
根据监控参数及选择的数据库引擎,Zabbix,特别是Zabbix数据库,可能需要大量的CPU资源
下表是几个硬件配置的示例:
名称 | 平台 | CPU/内存 | 数据库 | 监控主机数量 |
---|---|---|---|---|
小型 | CentOS | 虚拟应用 | MySQL InnoDB | 100 |
中型 | CentOS | 2 CPU cores/2GB | MySQL InnoDB | 500 |
大型 | RedHat Enterprise Linux | 4 CPU cores/8GB | RAID10 MySQL InnoDB or PostgreSQL | >1000 |
巨大型 | RedHat Enterprise Linux | 8 CPU cores/16GB | 快速RAID10 MySQL InnoDB or PostgreSQL | >10000 |
具体的配置极其依赖于Active Item数量和轮询频率。如需要进行大规模部署,强烈建议将数据库进行独立部署。
对于Zabbix稳定运行而言,服务获得精确的系统时间是非常重要的。[ntpd](http://www.ntp.org/) 是一个最流行的用于同步主机和其他服务器之间的时间的后台程序。对于所有运行Zabbix组件的系统,强烈建议这些系统的时间保持同步。
之前做了优化就不必再关
RHEL 7:
# rpm -ivh https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
RHEL 6:
# rpm -ivh https://repo.zabbix.com/zabbix/3.4/rhel/6/x86_64/zabbix-release-3.4-1.el6.noarch.rpm
RHEL 5:
# rpm -ivh https://repo.zabbix.com/zabbix/3.4/rhel/5/x86_64/zabbix-release-3.4-1.noarch.rpm
[root@db02~]# yum -y install zabbix-server-mysql zabbix-web-mysql
[root@zabbix ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
获取https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
警告:/var/tmp/rpm-tmp.NlJfKB: 头V4 RSA/SHA512 Signature, 密钥 ID a14fe591: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zabbix-release-3.4-2.el7 ################################# [100%]
[root@zabbix ~]# yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent mariadb-server
#启动数据库
[root@zabbix ~]# systemctl start mariadb
#连接数据库
[root@zabbix ~]# mysql
#创建zabbix库
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
#退出数据库
MariaDB [(none)]> exit
#进入SQL文件目录
[root@zabbix ~]# cd /usr/share/doc/zabbix-server-mysql-3.4.15/
#导入SQL文件
[root@zabbix zabbix-server-mysql-3.4.15]# zcat create.sql.gz |mysql zabbix
#检查导入结果
MariaDB [(none)]> show databases;
MariaDB [(none)]> use zabbix
MariaDB [zabbix]> show tables;
#创建用户
MariaDB [zabbix]> grant all on zabbix.* to zabbix@'localhost' identified by '123';
MariaDB [zabbix]> grant all on zabbix.* to zabbix@'10.0.0.%' identified by '123';
[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=123
[root@zabbix ~]# systemctl start zabbix-server
[root@zabbix ~]# systemctl enable zabbix-server
[root@zabbix ~]# netstat -lntup
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 5129/zabbix_server
1.安装ntp时间服务
[root@zabbix ~]# yum install ntpdate -y
2.关闭默认的时间同步,然后再进行设置
[root@zabbix ~]# timedatectl set-ntp no
3.查看
[root@zabbix ~]# timedatectl status
4.列出可用时区
[root@zabbix ~]# timedatectl list-timezones
5.设置
[root@zabbix ~]# timedatectl set-timezone "Asia/Shanghai"
6.更新当前系统时间
[root@zabbix ~]# ntpdate ntp1.aliyun.com
[root@zabbix ~]# vim /etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai
[root@zabbix ~]# systemctl start httpd
[root@zabbix ~]# systemctl enable httpd
#访问:http://10.0.0.71/zabbix
防止使用浏览器访问Zabbix的时候字符集显示的问题
[root@db02 ~]# yum -y install wqy-microhei-fonts
[root@db02 ~]# cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf
用户名:Admin
密码:zabbix
Zabbix在安装后只定义了两个用户。
- 'Admin' 用户是Zabbix的一个超级管理员,拥有所有权限。
- 'Guest' 用户是一个特殊的默认用户。如果你没有登陆,你访问Zabbix的时候使用的其实是“guest”权限。默认情况下,“guest”用户对Zabbix中的对象没有任何权限。
点击 *创建用户(Create user)* 以增加用户。
在添加用户的表单中,确认将新增的用户添加到了一个已有的[用户组](https://www.zabbix.com/documentation/3.4/manual/config/users_and_usergroups/usergroup),比如'Zabbix administrators'。
默认情况下,没有为新增的用户定义媒介(media,即通知发送方式) 。如需要创建,可以到'媒介(Media)'标签下,然后点击*增加(Add)*。
在这个对话框中,为用户输入Email地址。
你可以为媒介指定一个时间活动周期,(访问[时间周期说明](https://www.zabbix.com/documentation/3.4/manual/appendix/time_period)页面,查看该字段格式的描述)。默认情况下,媒介一直是活动的。你也可以通过自定义[触发器严重等级](https://www.zabbix.com/documentation/3.4/manual/config/triggers/severity)来激活媒介,默认所有的等级都保持开启。
点击*新增(Add)*,然后在用户属性表单中点击*新增(Add)*。新的用户将出现在用户清单中。
[root@db02 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
获取https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
警告:/var/tmp/rpm-tmp.lM3M2e: 头V4 RSA/SHA512 Signature, 密钥 ID a14fe591: NOKEY
准备中... ################################# [100%]
file /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX from install of zabbix-release-3.4-2.el7.noarch conflicts with file from package zabbix-release-3.0-1.el7.noarch
file /etc/yum.repos.d/zabbix.repo from install of zabbix-release-3.4-2.el7.noarch conflicts with file from package zabbix-release-3.0-1.el7.noarch
#客户端安装zabbix-agent端
[root@db02 ~]# yum install zabbix-agent -y
#修改配置文件
[root@db02 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=10.0.0.71
ServerActive=10.0.0.71
#启动客户端
[root@db02 ~]# systemctl start zabbix-agent
#添加开机自启
[root@db02 ~]# systemctl enable zabbix-agent
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-agent.service to /usr/lib/systemd/system/zabbix-agent.service.
#检查10050端口
[root@db02 ~]# netstat -lntup
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 9204/zabbix_agentd
#添加监控之前我们必须保证10050端口可以通信
[root@zabbix ~]# telnet 10.0.0.52 10050
Trying 10.0.0.52...
Connected to 10.0.0.52.
Escape character is '^]'.
Connection closed by foreign host.
*****注意:关闭或者挂起虚拟机时,在开机时,一定要同步时间
[root@db02 ~]# yum install ntpdate -y
[root@db02 ~]# ntpdate ntp1.aliyun.com
[root@db02 ~]# hwclock -w
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5MzH7ZAL-1615878129915)(D:\linux\zabbix监控系统\img\image-20210316085528703.png)]
检测中 >> 最新数据
在最新数据中需要筛选,
输入ip或者名字都能够搜索出来
### 查看图像
检测中 >> 图形
选择正确的主机。选择要查看的图形即可出图
#找到本地盘下:C:\Windows\Fonts,我自己选择的是楷体常规
[root@zabbix ~]# cd /usr/share/zabbix/fonts
[root@zabbix fonts]# ll
总用量 0
lrwxrwxrwx 1 root root 33 1月 5 10:39 graphfont.ttf -> /etc/alternatives/zabbix-web-font
#上传
[root@zabbix fonts]# rz
#删除原来的字体
[root@zabbix fonts]# rm -rf graphfont.ttf
#给字体改名
[root@zabbix fonts]# mv simkai.ttf graphfont.ttf
[root@zabbix fonts]# ll
-rw-r--r-- 1 root root 11787328 3月 2 2019 graphfont.ttf
#再次刷新页面
重启启动虚拟机后,要先重启数据库
***注意:一定要先重启数据库,然后再重启zabbix-server
如果httpd没有加入开机自启的话,再启动一下httpd