第一章·监控系统-zabbix快速入门
监控系统概述
什么是监控
监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。
为什么做监控
1.系统的监控:实际上是对系统不间断的实时监控
2.实时反馈系统当前状态:我们监控某个硬件、或者某个系统,都是需要能实时看到当前系统的状态,是正常、异常、或者故障。
3.保证服务可靠性安全性:我们监控的目的就是要保证系统、服务、业务正常运行
4.保证业务持续稳定运行:如果我们的监控做得很完善,即使出现故障,能第一时间接收到故障报警,在第一时间处理解决,从而保证业务持续性的稳定运行。(往往,第一时间知道业务宕机的都是用户)
监控怎么来实现
面试常问
面试官:你们公司监控是如何做的?
监控软件我们使用的是zabbix,我们监控在不同的维度
硬件层面:
如果说到硬件,肯定要先说物理服务器用的什么型号? 物理服务器,选型,Dell R710 720 730 ...
IDRAC自带一个远程管理卡,安装上一个软件包之后,就可以监控
如果不使用dell的idrac那就使用zabbix的IPMI接口监控硬件
1)CPU温度
2)风扇转速
3)磁盘是否损坏
4)CMOS电池电量
5)内存是否损坏
6) ...
系统层面
1) CPU: CPU使用率、CPU的负载、CPU的核心数线程
2) 内存: 内存使用率、缓存区、缓存区
3) 磁盘: 磁盘使用率、磁盘大小、磁盘IO
4) 进程
5) TCP状态
6) 系统负载
7) ...
网络层面
1) 网络设备: 路由器,交换机
2) 网卡入口流量
3) 网卡出口流量
4) 带宽的峰值
5) ...
使用zabbix的snmp方式监控
应用层面
当然了最基本的就是各个服务的进程,端口号
一些特殊程序我们还需要额外监控
1) MySQL: 主从复制是否有延迟(zabbix监控模板)
2) redis: 主从复制是否有延迟
监控思路: zabbix没有固定模板,可以在主库中set一个key为时间戳,然后从库会同步这个时间戳(动态),写脚本时时获取这两个时间戳,做对比。
3)NFS:磁盘挂载状况
4)tomcat:JVM监控,老年代、新生代、永久带、full-gc、垃圾回收
5)rsync的同步情况,MD5校验文件是否被篡改
6)...
业务层面:
1)URL的监控
2)API的监控
3)nginx的状态码
4)tomcat的exception
5)请求时间
6)响应时间
7)加载时间
8)渲染时间
9)...
单机监控命令了解
1.CPU监控命令
1) w
## 负载
[root@web02 ~]# w
12:30:41 up 1 day, 8:10, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 10.0.0.1 五09 1.00s 0.00s 0.00s w
2) top
## CPU
[root@web02 ~]# top
[root@web02 ~]# top -n 1
top - 12:31:10 up 1 day, 8:11, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 100 total, 1 running, 99 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2030148 total, 1457796 free, 190464 used, 381888 buff/cache
KiB Swap: 1048572 total, 1048572 free, 0 used. 1652944 avail Mem
3) htop
## 美化的top
[root@web02 ~]# yum install -y htop
[root@web02 ~]# htop
CPU[| 0.7%] Tasks: 27, 38 thr; 1 running
4) glances
5)uptime
[root@web02 ~]# uptime
12:33:18 up 1 day, 8:13, 1 user, load average: 0.10, 0.08, 0.07
不管用什么命令监控,查看CPU,我们都必须了解,系统的用户态和内和态。
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us: 用户态 跟用户的操作有关35%
sy: 内和态 跟内核的处理有关65%
id: CPU空闲
当我们执行一个命令的时候,很快能出来结果,但是有多少人知道,这个很快,他都占用了哪些时间呢?
[root@web02 ~]# time ls
backup.sh group_vars_web_group
real 0m0.002s 真实执行时间
user 0m0.001s 用户执行时间
sys 0m0.001s 系统执行时间
6) lscpu
[root@web02 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 158
Model name: Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz
Stepping: 9
CPU MHz: 3000.001
CPU max MHz: 0.0000
CPU min MHz: 0.0000
BogoMIPS: 6000.00
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 6144K
NUMA node0 CPU(s): 0
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch epb fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt xsavec xgetbv1 dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
7) cat /proc/cpuinfo
[root@web02 ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 158
model name : Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz
stepping : 9
microcode : 0x8e
cpu MHz : 3000.001
cache size : 6144 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch epb fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt xsavec xgetbv1 dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
bogomips : 6000.00
clflush size : 64
cache_alignment : 64
address sizes : 42 bits physical, 48 bits virtual
power management:
2.监控内存
1) free
1)free
[root@web02 ~]# free -g
total used free shared buff/cache available
Mem: 0 0 0 0 0 0
Swap: 0 0 0
[root@web02 ~]# free -m
total used free shared buff/cache available
Mem: 972 234 158 8 579 528
Swap: 1023 0 1023
[root@web02 ~]# free -h
total used free shared buff/cache available
Mem: 972M 234M 158M 8.4M 579M 528M
Swap: 1.0G 264K 1.0G
2)top
3)glances
4)htop
5) lsmen
[root@web02 ~]# lsmem
RANGE SIZE STATE REMOVABLE BLOCK
0x0000000000000000-0x000000003fffffff 1G online no 0-7
Memory block size: 128M
Total online memory: 1G
Total offline memory: 0B
6) cat /proc/meminfo
[root@web02 ~]# cat /proc/meminfo
MemTotal: 995896 kB
MemFree: 159908 kB
MemAvailable: 541596 kB
Buffers: 116 kB
Cached: 489248 kB
SwapCached: 4 kB
Active: 418768 kB
Inactive: 227568 kB
Active(anon): 137052 kB
Inactive(anon): 28476 kB
Active(file): 281716 kB
Inactive(file): 199092 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 1048572 kB
SwapFree: 1048308 kB
Dirty: 20 kB
Writeback: 0 kB
AnonPages: 157000 kB
Mapped: 33420 kB
Shmem: 8556 kB
Slab: 107040 kB
SReclaimable: 57164 kB
SUnreclaim: 49876 kB
KernelStack: 4752 kB
PageTables: 22648 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1546520 kB
Committed_AS: 928904 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 177304 kB
VmallocChunk: 34359310332 kB
HardwareCorrupted: 0 kB
AnonHugePages: 51200 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 57216 kB
DirectMap2M: 991232 kB
DirectMap1G: 0 kB
后面这几个命令在看CPU的时候已经演示了。
如何查看单个进程占用内存?
#进程占用内存公式
pmem = VmRSS / MemTotal * 100
process mem = 虚拟内存 / 总内存 * 100
python脚本
[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))
[root@web02 ~]# python mem.py zabbix_agentd
进程名称:zabbix_agentd
物理内存为:12332
百分比为:1.24%
[root@web02 ~]# python mem.py zabbix_server
进程名称:zabbix_server
物理内存为:115300
百分比为:11.58%
[root@web02 ~]# python mem.py httpd
进程名称:httpd
物理内存为:212148
百分比为:21.30%
3.磁盘监控命令
1. df
[root@web02 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 18G 1.4G 17G 8% /
devtmpfs 981M 0 981M 0% /dev
tmpfs 992M 0 992M 0% /dev/shm
tmpfs 992M 9.5M 982M 1% /run
tmpfs 992M 0 992M 0% /sys/fs/cgroup
/dev/sda1 1014M 124M 891M 13% /boot
tmpfs 199M 0 199M 0% /run/user/0
[root@web02 ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda3 9436672 36259 9400413 1% /
devtmpfs 251012 393 250619 1% /dev
tmpfs 253768 1 253767 1% /dev/shm
tmpfs 253768 700 253068 1% /run
tmpfs 253768 16 253752 1% /sys/fs/cgroup
/dev/sda1 524288 326 523962 1% /boot
tmpfs 253768 1 253767 1% /run/user/0
2. iotop
iotop查看进程对磁盘的使用情况,IO吞吐量情况
[root@web02 ~]# iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
3. iostat
查看磁盘的IO吞吐量
-d:指定多久出一次结果 单位是秒
-m:指定出几次结果
[root@web02 ~]# iostat -dm 1 10
Linux 3.10.0-957.el7.x86_64 (web02) 08/23/2022 _x86_64_ (1 CPU)
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
scd0 0.00 0.00 0.00 1 0
sda 2.17 0.03 0.07 284 607
4)dstat
[root@web02 ~]# yum install -y dstat
[root@web02 ~]# dstat -cdngy
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 100 0 0 0|1729B 3483B| 0 0 | 0 0 | 47 65
0 0 100 0 0 0| 0 0 | 66B 830B| 0 0 | 92 114
0 0 100 0 0 0| 0 0 | 66B 350B| 0 0 | 92 106
0 0 100 0 0 0| 0 16k| 66B 350B| 0 0 | 102 114
5.glances
6. lsblk
[root@web02 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 1G 0 part [SWAP]
└─sda3 8:3 0 18.5G 0 part /
sr0 11:0 1 4.3G 0 rom
## 磁盘开机自动挂载
[root@web02 ~]# vim /etc/fstab
## 创建一块新磁盘
[root@web02 ~]# dd < /dev/zero > /disk1 bs=1024K count=5
## 格式化
[root@web02 ~]# mkfs.ext4 -i 5120 /disk1
## 挂载
[root@web02 ~]# mount -t ext4 -o loop /disk1 /opt/cipan1/
## 查看
[root@web02 ~]# df -h
/dev/loop0 3.9M 53K 3.5M 2% /opt/cipan1
[root@web02 ~]# vim /etc/fstab
UUID=b2503fb9-fc5e-47fc-b86a-d171a5fbf689 /opt/cipan1 ext4 defaults 0 0
## 查看一块磁盘的UUID
[root@web02 ~]# blkid /dev/sda1
/dev/sda1: UUID="33bce62e-082b-4647-8b36-9335a0cc6600" TYPE="xfs"
[root@web02 ~]# blkid /dev/sda3
/dev/sda3: UUID="9e1a4ad0-69bf-4b9e-9aa0-4820ec625963" TYPE="xfs"
[root@web02 ~]# blkid /dev/loop0
/dev/loop0: UUID="b2503fb9-fc5e-47fc-b86a-d171a5fbf689" TYPE="ext4"
4.网络监控命令
1. glances
1)glances
NETWORK Rx/s Tx/s
eth0 592b 15Kb
eth1 17Kb 13Kb
lo 0b 0b
2. iftop
3. nethogs
该命令可以查看某个进程所使用的流量
[root@web02 ~]# yum install -y nethogs
[root@web02 ~]# nethogs
4. ifconfig
[root@web02 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::20c:29ff:fea0:7ef0 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a0:7e:f0 txqueuelen 1000 (Ethernet)
RX packets 55217 bytes 64623101 (61.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 30950 bytes 4603140 (4.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 27 bytes 2072 (2.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27 bytes 2072 (2.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
5.route
[root@web02 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.2 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
TCP11种状态监控命令
1.netstat
[root@web02 ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:52022 0.0.0.0:* LISTEN
tcp 0 0 172.24.156.150:59936 100.100.30.25:80 ESTABLISHED
tcp 0 0 172.24.156.150:52022 139.226.172.217:54116 ESTABLISHED
tcp6 0 0 :::873 :::* LISTEN
udp 0 0 172.17.0.1:123 0.0.0.0:*
udp 0 0 172.18.0.1:123 0.0.0.0:*
udp 0 0 172.24.156.150:123 0.0.0.0:*
udp 0 0 127.0.0.1:123 0.0.0.0:*
udp 0 0 0.0.0.0:123 0.0.0.0:*
udp6 0 0 :::123 :::*
[root@web02 ~]# netstat -an|awk '/^tcp/ {print $NF}'|sort|uniq -c
4 ESTABLISHED
6 LISTEN
[root@web02 ~]# netstat -an|awk '/^tcp/ {++state[$NF]} END {for(key in state) print key," \t" ,state[key]}'
LISTEN 6
ESTABLISHED 4
2. ss
[root@web02 ~]# ss -n|awk '{print $2}'|sort|uniq -c
42 ESTAB
1 State
生产场景需求
如何每1分钟监控当前系统的内存使用状态,如果可用低于100MB则发送邮件。同时打印当前还剩余多少内存
1.如何获取内存的状态信息 free -m
2.如何获取内存的可用状态 free -m|awk '/Mem/{print $NF}'
3.如何进行数字的比对,高于100MB不处理,低于100MB,发送邮件。
4.如何每分钟执行。
[root@web02 ~]# 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@web02 ~]# sh free.sh
2018-10-12: web02_,内存低于100MB,还有20MB内存可用
2018-10-12: web02_,内存低于100MB,还有6MB内存可用
2018-10-12: web02_,内存低于100MB,还有5MB内存可用
[root@web02 ~]# dd < /dev/zero > /dev/null bs=2000M
系统的oom
随着时间的推移,用户不断增多,服务消耗的内存越来越多,当系统内存不足的时候,可能会导致系统产生oom(out of memory)
1.当系统内存不足时就会大量使用swap(虚拟内存)
2.当系统大量使用swap的时候,系统会特别卡 注意:有时可能内存还有剩余300M或者500M,但是swap依然被使用
## 关闭swap
[root@web02 ~]# swapoff -a
[root@web02 ~]# dd < /dev/zero > /dev/null bs=2000M
[root@web02 ~]# 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
使用脚本监控nginx
前面的课程中,我们学习了使用脚本+定时任务的方法自动备份并将检查结果,发到指定邮箱,那么这里,我也可以使用脚本+定时任务的方法,进行监控,并使用邮件报警
#!/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监控快速安装
# 1.下载zabbix的yum源
[root@m01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
# 2.安装zabbix的服务端和客户端
[root@m01 ~]# yum install -y web02-mysql zabbix-agent
# 3.下载zabbix前端web页面的yum源
[root@m01 ~]# yum install centos-release-scl -y
# 4.打开zabbix的yum源中的前端仓库
[root@m01 ~]# vim /etc/yum.repos.d/zabbix.repo
[zabbix-frontend]
name=Zabbix Official Repository frontend - $basearch
baseurl=http://repo.zabbix.com/zabbix/5.0/rhel/7/$basearch/frontend
enabled=0 // 改为 1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
# 5.安装zabbix前端web页面
[root@m01 ~]# yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl -y
# 6.初始化数据库
## 1)创建zabbix数据库
mysql> create database zabbix character set utf8 collate utf8_bin;
## 2)创建zabbix用户
mysql> grant all on zabbix.* to zabbix@'172.16.1.%' identified by '123';
## 3)将zabbix的建表语句SQL文件发送到主库上
[root@m01 ~]# scp /usr/share/doc/web02-mysql-5.0.26/create.sql.gz 172.16.1.53:/tmp
## 4)主库导入SQL文件
[root@db03 ~]# zcat /tmp/create.sql.gz |mysql -uzabbix -p123 -h172.16.1.53 zabbix
# 7.修改zabbix服务端配置文件
[root@m01 ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=172.16.1.53
DBUser=zabbix
DBName=zabbix
DBPassword=123
# 8.修改zabbix的nginx配置文件
[root@m01 ~]# vim /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf
server {
listen 80;
server_name zabbix.lw.com;
...
}
# 9.修改zabbix的php配置文件
[root@m01 ~]# vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
[zabbix]
user = nginx
group = nginx
listen.acl_users = nginx
php_value[date.timezone] = Asia/Shanghai
# 9.1授权
[root@m01 ~]# chown -R root.nginx /var/opt/rh/rh-php72/lib/php/session/
# 10.启动
[root@m01 ~]# systemctl restart web02 zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
# 11.查看端口
[root@m01 ~]# netstat -lntup|grep 10050
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 102137/zabbix_agent
tcp6 0 0 :::10050 :::* LISTEN 102137/zabbix_agent
[root@m01 ~]# netstat -lntup|grep 10051
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 102333/zabbix_serve
tcp6 0 0 :::10051 :::* LISTEN 102333/zabbix_serve
# 12.授权
[root@m01 ~]# chown -R nginx.nginx /etc/zabbix/web
zabbix使用-快速监控一台主机
# 查看服务端的版本
[root@m01 fonts]# zabbix_server -V
zabbix_server (Zabbix) 5.0.26
# 安装对应版本的agent客户端
# 1.在其他机器上,安装zabbix的yum源
[root@db03 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
# 2.安装客户端
[root@db03 ~]# yum install -y zabbix-agent-5.0.26
[root@web01 ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-agent-5.0.26-1.el7.x86_64.rpm
# 3.修改配置文件
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=172.16.1.61
ServerActive=172.16.1.61
Hostname=web01
# 4.启动服务
[root@web01 ~]# systemctl start zabbix-agent
# 5.检查端口
[root@web01 ~]# netstat -lntup |grep 10050
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 7681/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 7681/zabbix_agentd
1.创建主机
2.配置主机
添加基础模板
在上图中,会发现有图了,但是下面的字体是口口,这是因为中文字体没有显示出来,我们需要自己更换字体。
首先在windows系统中,找到字体存放目录C:\Windows\Fonts,找一个自己喜欢的字体,我选择的是楷体(simkai.ttf)。
将该字体上传至zabbix的字体目录下。
#进入zabbix字体目录
[root@web02 fonts]# cd /usr/share/zabbix/fonts
#查看目录内容
[root@web02 fonts]# ll
总用量 0
lrwxrwxrwx 1 root root 33 10月 12 15:00 graphfont.ttf -> /etc/alternatives/zabbix-web-font
#上传字体
[root@web02 fonts]# rz simkai.ttf
#删除原来的字体,或者mv备份
[root@web02 fonts]# rm -f graphfont.ttf
#将上传的字体改名
[root@web02 fonts]# mv simkai.ttf graphfont.ttf
#刷新web页面查看
zabbix监控基础架构
zabbix-agent(数据采集) --> zabixx-server(数据分析\报警) --> 数据库(数据储存) --> zabbix-web(数据展示)
zabbix-agent:获取本机上的数据(主动上交给server)
zabbix-server:获取所有agent上的数据,并保存到数据库中 create.sql.gz (server出现问题,可以删库重新导入)
- 1. systemctl stop zabbix-server
- 2. drop database zabbix;
- 3. creaete database zabbix charset utf8 collate utf8_bin;
- 4. zcat create.sql.gz| mysql -uzabbix -p123 zabbix
- 5. rm -f zabbix.conf.php
- 6. http://zabbix.zls.com/setup.php // 重新进入配置页面
zabbix-web:页面展示,从数据库中获取数据,展示到页面上
zabbix数据库拆分
目前我们zabbix的架构,单台zabbix服务:LAMP+zabbix 我们需要实现zabbix架构,将数据库拆分成单独的一台,LAP+zabbix+MySQL
1.环境准备
主机名 | wanIP | lanIP | 角色 |
---|---|---|---|
zabbix | 10.0.0.71 | 172.16.1.71 | zabbix-server |
db01 | 10.0.0.51 | 172.16.1.51 | MySQL |
2.导出原MySQL中的zabbix数据
#导出zabbix数据
[root@zabbix ~]# mysqldump -uroot -p -B zabbix > /tmp/zabbix.sql
#拷贝数据到db01
[root@zabbix ~]# scp /tmp/zabbix.sql 10.0.0.51:/tmp
3.准备新的数据库环境
#安装数据库
[root@db01 ~]# yum install -y mariadb-server
#启动数据库
[root@web01 ~]# systemctl start mariadb
#导入数据
[root@web01 ~]# mysql -uroot -p < /tmp/zabbix.sql
4.关闭原来的数据库并测试
#关闭数据库
[root@web02 ~]# systemctl stop mariadb
#打开浏览器查看
我们需要修改php代码连接数据库,就和之前我们修改wordpres连库代码一样
5.修改连接数据库代码
#修改代码
[root@web02 ~]# vim /etc/zabbix/web/zabbix.conf.php
<?php
// Zabbix GUI configuration file.
global $DB;
$DB['TYPE'] = 'MYSQL';
$DB['SERVER'] = '10.0.0.51';
$DB['PORT'] = '0';
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = '123';
// Schema name. Used for IBM DB2 and PostgreSQL.
$DB['SCHEMA'] = '';
$ZBX_SERVER = 'localhost';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'rowey';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
#修改配置文件
[root@web02 ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=10.0.0.51
#重启zabbix-server
[root@web02 ~]# systemctl restart zabbix-server
#打开浏览器测试
新一轮的报错又出现了,刚才是连接不上localhost的,现在连接不上10.0.0.8 证明什么,证明我们新装的数据库不允许远程连接,我们可以使用命令行测试一下。
#是拒绝的,所以我们创建个用户即可
[root@web02 ~]# mysql -uzabbix -p123 -h 10.0.0.7
ERROR 1130 (HY000): Host '10.0.0.8' is not allowed to connect to this MariaDB server
#创建用户
MariaDB [(none)]> grant all on zabbix.* to zabbix@'10.0.0.%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
添加自定义监控项入门
需求:监控登录服务器的用户会话数量
自定义监控格式
#官方示例
UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
自定义监控第一步
使用命令查看服务器当前登录用户会话数量
[root@web01 zabbix]# uptime |awk '{print $6}'
自定义监控第二步
把命令加入配置文件并起名
UserParameter=user.count,uptime |awk '{print $6}'
自定义监控第三步
客户端,查看监控项
[root@web01 zabbix]# zabbix_agentd -p
user.count [t|1]
自定义监控第四步
在zabbix-server端获取agent端数据,使用zabbix_get命令
#安装zabbix_get命令
[root@web02 ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-get-3.4.15-1.el7.x86_64.rpm
获取https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-get-3.4.15-1.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:zabbix-get-3.4.15-1.el7 ################################# [100%]
#语法
[root@web02 ~]# zabbix_get
usage:
zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] -k item-key
zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address]
--tls-connect cert --tls-ca-file CA-file
[--tls-crl-file CRL-file] [--tls-agent-cert-issuer cert-issuer]
[--tls-agent-cert-subject cert-subject]
--tls-cert-file cert-file --tls-key-file key-file -k item-key
zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address]
--tls-connect psk --tls-psk-identity PSK-identity
--tls-psk-file PSK-file -k item-key
zabbix_get -h
zabbix_get -V
#获取数据
[root@web02 ~]# zabbix_get -s 10.0.0.7 -k user.count
1
自定义监控第五步
自己创建一个监控模板
自定义监控第六步
给模板中添加监控项
自定义监控第七步
将主机关联该模板
自定义监控第八步
给监控项画图
查看监控数据
自定义监控第九步
给监控项添加触发器
自定义监控第十步
给触发器,添加动作,邮件告警
如果事件源是触发器,那么就会触发动作,触发什么动作呢?就需要自己来创建了。
自定义触发器--->动作--->通知
如果事件源是触发器-->则创建一个触发的动作-->通知
1.我怎么通知。通过介质(配置一个邮箱的发件人)
2.通知给谁。(接收的邮箱)
3.通知的内容(内容可以自定义)
配置收件人
添加报警媒介
告警消息添加
## 故障告警
标题:Problem: {EVENT.NAME}
内容:
Problem started at {EVENT.TIME} on {EVENT.DATE}
Problem name: {EVENT.NAME}
Host: {HOST.NAME}
Severity: {EVENT.SEVERITY}
Original problem ID: {EVENT.ID}
{TRIGGER.URL}
## 恢复告警
标题:Resolved: {EVENT.NAME}
内容:
Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
Problem name: {EVENT.NAME}
Host: {HOST.NAME}
Severity: {EVENT.SEVERITY}
Original problem ID: {EVENT.ID}
{TRIGGER.URL}
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
告警地址:{HOST.IP}
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
告警地址:{HOST.IP}
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
Comments | NOTHING