一、监控知识概述
1.1 为什么要使用监控
- 1)对系统不间断实时监控;
- 2)实时反馈系统当前状态;
- 3)保证服务可靠性安全性;
- 4)保证业务持续稳定运行;
1.2 如何进行监控,比如监控磁盘使用率
- 1)如何查看磁盘使用率 df -h;
- 2)监控磁盘的那些指标 block、 inode;
- 3)如何获取具体的信息 df -h|awk '///{print(NF-1)}';
- 4)获取的数值到达多少报警 80%;
1.3 流行的监控工具
- 1)Zabbix
- 2)Lepus(天兔)数据库监控系统
- 3)Open-Falcon 小米
- 4)Prometheus(普罗米修斯, Docker、 K8s)
1.4 如果到一家新公司,如何入手监控
- 1)硬件监控 路由器、交换机、防火墙
- 2)系统监控 CPU、内存、磁盘、网络、进程、 TCP
- 3)服务监控 nginx、 php、 tomcat、 redis、 memcache、 mysql
- 4)WEB 监控 请求时间、响应时间、加载时间
- 5)日志监控 ELk(收集、存储、分析、展示)
- 6)安全监控 Firewalld、 WAF(Nginx+lua)、安全宝、牛盾云、安全狗
- 7)网络监控 smokeping 多机房
- 8)业务监控 活动引入多少流量、产生多少注册量、带来多大价值
二、单机时代如何进行监控
2.1 CPU 监控
命令: w、 top、 htop、 glances
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us 用户态: 跟用户的操作有关 35%
sy 系统态: 跟内核的处理有关 60%
id CPU 空闲:
2.2 内存监控
命令: free
$ free -h
total used free shared buff/cache available
Mem: 977M 105M 724M 6.6M 148M 729M
Swap: 1.0G 0B 1.0G
内存的计算方式,使用如下python脚本:
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
# 收集程序所占用的物理内存大小,占所有物理内存的比例
# OS: Centos 6.7 Python: 2.7.6
# __author__:Dahlhin
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
物理内存为:%s
百分比为:%.2f%%'% (program,mem_total,mem_percent))
使用方法:
$ python2.7 test.py mysqld
进程名称:mysqld
物理内存为:86664
百分比为:1.06%
参考网址:https://www.cnblogs.com/dachenzi/p/6812317.html
2.3 磁盘监控
命令: df、 iotop
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.80 25.32 33.36 221034 291193
设备名 每秒传输次数 每秒读大小 每秒写大小 读的总大小 写的总大小
2.4 网络监控
命令: ifconfig、 route、 glances、 iftop、 nethogs、 netstat
单位换算
Mbps 100Mbps/8
MB 12MB
iftop 中间的<= =>这两个左右箭头,表示的是流量的方向。
TX:发送流量、 RX:接收流量、 TOTAL:总流量
#查看 TCP11 中状态
netstat -an|grep ESTABLISHED
netstat -rn # 查看路由信息
netstat -lntup
三、zabbix监控快速安装
参考zabbix官方手册!
3.1配置zabbix仓库
由于下载的其中指向的是zabbix官网,可能会下载失败,所以需要手动更换为阿里云的zabbix源!
$ vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/$basearch/
enabled=1
gpgcheck=0
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=https://mirrors.aliyun.com/zabbix/non-supported/rhel/7/$basearch/
enabled=1
gpgcheck=0
3.2 安装zabbix所需软件包
$ yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent
3.3 安装并初始化数据库
$ yum install -y mariadb-server
$ systemctl start mariadb && systemctl enable mariadb
$ mysql
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit;
使用 MySQL 来导入 Zabbix server 的初始数据库 schema 和数据,
$ zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
3.4 为zabbix server配置数据库
$ vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
$ systemctl start zabbix-server && systemctl enable zabbix-server
$ ss -lnt | grep 10051 # 确认端口已经在监听
3.5 ZABBIX 前端配置
$ vim /etc/httpd/conf.d/zabbix.conf
# 修改为当前的时区
php_value date.timezone Asia/Shanghai
$ systemctl start httpd && systemctl enable httpd
$ ss -lnt | grep 80
zabbix前端可以在浏览器中通过http://IP/zabbix/进行访问,默认的用户名/密码:Admin/zabbix
配置zabbix-web中文显示:
$ yum -y install wqy-microhei-fonts
$ cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/zabbix/assets/fonts/graphfont.ttf
# 修复中文乱码
四、快速监控主机
安装zabbix-agent,需注意:zabbix-server版本可以高于zabbix-agent版本,但是zabbix-agent版本不可以高于zabbix-server版本!建议版本选择一致!
zabbix-server主机执行zabbix_server -V
命令可以查看zabbix-server版本信息!
4.1 安装、配置zabbix-agent
$ rpm -ivh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.25-1.el7.x86_64.rpm
$ vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.88.1 # 修改为zabbix-server地址
$ ss -lnt | grep 10050 # 确认端口正在监听的状态
4.2 zabbix-server测试获取zabbix-agent端数据
$ yum -y install zabbix-get.x86_64
$ zabbix_get -s 192.168.88.2 -p 10050 -k "system.uptime"
508
# -s:指定zabbix agent端的IP地址;
# -p:指定zabbix agent端的监听端口;
# -k:指定监控项;
# 如果有输出结果,则表示zabbix server可以获取zabbix agent的数据,配置成功;
4.3 zabbix-web页面,添加主机
4.4 zabbix-agent端监控失败,排查思路
- 检查IP地址和端口;
- 检查firewalld和SELinux;
- 检查zabbix-agent端配置文件;
- 重新加载zabbix-agent配置文件;
- 查看zabbix-agent日志信息;
五、zabbix监控基础架构
zabbix-agent(收集数据)
——>zabbix-server(数据分析、报警)
——>数据库(数据存储)
——>zabbix-web(数据展示)
架构图:
六、zabbix架构拆分数据库
6.1 准备一台mysql数据库(192.168.88.2),安装数据库(保证数据库版本一致);
$ yum install mariadb-server -y
$ systemctl start mariadb && systemctl enable mariadb
6.2 创建zabbix数据库,网络授权;
$ mysql
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit;
6.3 在旧的数据库上备份zabbix库,然后恢复到新的数据库;
$ mysqldump -uroot --databases zabbix --single-transaction > `date +%F%H`-zabbix-sql
$ cat 2020-10-0816-zabbix-sql | mysql -h 192.168.88.2 -uzabbix -pzabbix zabbix
# 通过远程的方式导入到192.168.88.2的zabbix数据库中
6.4 修改zabbix-server配置文件指向数据库的IP地址
$ vim /etc/zabbix/zabbix_server.conf
DBHost=192.168.88.2 # 只修改数据库连接地址
$ systemctl restart zabbix-server
6.5 修改zabbix-web配置文件指向数据库的IP地址
$ vim /etc/zabbix/web/zabbix.conf.php
$DB['SERVER'] = '192.168.88.2'; # 修改数据库地址
$ systemctl restart httpd
该方式不适合在生产环境使用,只适合在测试环境使用!因为会丢数据,主要的就是实现的思路!
七、自定义监控
7.1 自定义监控项
① 监控系统的登录状态,如果登录的xshell超过两个用户则触发报警
② 在zabbix-agent端自定义监控项,使用UserParameter
$ vim /etc/zabbix/zabbix_agentd.conf
# 添加以下内容
UserParameter=login.number,uptime | awk '{print $4}'
③ 重启zabbix-agent
$ systemctl restart zabbix-agent
④ 检查zabbix-agent端上自定义监控项是否生效
$ zabbix_agentd -p # 获取zabbix-agent端所有的监控项内容
$ zabbix_agentd -p | grep login.number
login.number [t|1]
⑤ zabbix-server测试是否可以获取到zabbix-agent端上的自定义监控项的值
$ yum -y install zabbix-get.x86_64 # 安装zabbix-get软件包
$ zabbix_get -s 192.168.88.2 -k login.number
1
⑥ web界面添加监控项
7.2 自定义触发器——>动作——>通知
① 自定义触发器
手动测试,触发故障,使zabbix面板报警!
② 启用动作
③ 创建报警媒介
④ 定义收件人信息
⑤ 验证邮箱收到的消息
7.3 值映射
创建一个监控22端口的监控项!
效果已经产生!
7.4 监控TCP11种状态
① zabbix-agent编写监控文件(传参的形式)
$ vim /etc/zabbix/zabbix_agentd.d/tcp_status.conf
UserParameter=tcp_state[*],netstat -ant|grep -wc $1
$ systemctl restart zabbix-agent
② zabbix-server测试是否可以获取到值
$ zabbix_get -s 192.168.88.2 -k tcp_state[LISTEN]
6
$ zabbix_get -s 192.168.88.2 -k tcp_state[TIME_WAIT]
44
③ zabbix-web添加模板、创建监控项
11种状态,也可挨个添加,也可选择克隆!自行完成!
④ zabbix-agent使用该模板
7.5 自定义触发器多条件
监控系统的内存可用百分比,如果低于25%,并且使用swap超过5%,则触发报警!
① zabbix-agent 编写监控文件监控内存使用百分比
$ vim /etc/zabbix/zabbix_agentd.d/mem_ava.conf
UserParameter=mem.ava,free -m | awk '/^Mem/{print $NF/$2*100}'
② 重启zabbix-agent,agent与server测试是否可以获取到值
$ systemctl restart zabbix-agent
$ zabbix_agentd -p | grep mem.ava # agent测试取值
mem.ava [t|75.1279]
$ zabbix_get -s 192.168.88.2 -k mem.ava # server测试取值
75.2303
③ zabbix-web添加监控项
④ 基于该监控项创建触发器
使用dd if=/dev/zero of=/dev/null bs=500M count=1024
压低内存,测试报警!
⑤ zabbix-agent编写监控文件监控swap分区使用百分比
$ vim /etc/zabbix/zabbix_agentd.d/mem_ava.conf
# 末尾添加
UserParameter=swap.use,free -m | awk '/Swap/{print $3/$2*100}'
$ systemctl restart zabbix-agent
$ zabbix_agentd -p | grep swap.use # agent测试取值
0 [t|75.1279]
$ zabbix_get -s 192.168.88.2 -k swap.use # server测试取值
0
⑥ zabbix-web添加监控项
⑦ 配置多条件触发器
使用dd if=/dev/zero of=/dev/null bs=1024M count=1024
压低内存,测试报警!
邮件内容,信息不是太明确,所以进行以下修改!
⑧ 常用触发器表达式
and # 并且
or # 或者
last() # 比对最新的值
avg() # 平均值
diff() # 比对上一次文件内容
nodata() # 收不到数据进行报警
(5m) # 表示最近5分钟得到值
(#5) # 表示最近5次得到的值
⑨ 配置故障消息
消息内容如下:
报警主机:{HOST.NAME1}
报警服务:{ITEM.NAME1}
报警Key1: {ITEM.KEY1}: {ITEM.VALUE1}
报警Key1: {ITEM.KEY2}: {ITEM.VALUE2}
严重级别:{TRIGGER.SEVERITY}
$ swapoff -a
$ swapon -a
# 释放swap分区空间
重新使用dd if=/dev/zero of=/dev/null bs=1024M count=1024
压低内存,测试报警!
邮件内容如下: