第一章·监控系统-zabbix快速入门

监控系统概述

什么是监控

监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。

为什么做监控

1.系统的监控:实际上是对系统不间断的实时监控
2.实时反馈系统当前状态:我们监控某个硬件、或者某个系统,都是需要能实时看到当前系统的状态,是正常、异常、或者故障。
3.保证服务可靠性安全性:我们监控的目的就是要保证系统、服务、业务正常运行
4.保证业务持续稳定运行:如果我们的监控做得很完善,即使出现故障,能第一时间接收到故障报警,在第一时间处理解决,从而保证业务持续性的稳定运行。(往往,第一时间知道业务宕机的都是用户)

监控怎么来实现

1.CACTI(网络监控)

file

2.NAGIOS(系统监控)

file

3.ZABBIX(分布式监控)

file

4.open-falcon(小米监控产品))

file

5.普罗米修斯(监控Docker,K8S)

file

6.lepus天兔(数据库监控)

file

面试常问

面试官:你们公司监控是如何做的?

监控软件我们使用的是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

file

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

file

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

file

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.创建主机

file

2.配置主机

file

添加基础模板

file

file

在上图中,会发现有图了,但是下面的字体是口口,这是因为中文字体没有显示出来,我们需要自己更换字体。

首先在windows系统中,找到字体存放目录C:\Windows\Fonts,找一个自己喜欢的字体,我选择的是楷体(simkai.ttf)。

file

将该字体上传至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(数据展示)

file

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
#打开浏览器查看

file

我们需要修改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
#打开浏览器测试

file

新一轮的报错又出现了,刚才是连接不上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)

file

添加自定义监控项入门

需求:监控登录服务器的用户会话数量

file

自定义监控格式

#官方示例
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

自定义监控第五步

自己创建一个监控模板

file

file

自定义监控第六步

给模板中添加监控项

file

file

file

自定义监控第七步

将主机关联该模板

file

file

自定义监控第八步

给监控项画图

file

file

file

file

查看监控数据

file

自定义监控第九步

给监控项添加触发器

file

file

file

自定义监控第十步

给触发器,添加动作,邮件告警

file

file

file

file

file

如果事件源是触发器,那么就会触发动作,触发什么动作呢?就需要自己来创建了。

自定义触发器--->动作--->通知

如果事件源是触发器-->则创建一个触发的动作-->通知
1.我怎么通知。通过介质(配置一个邮箱的发件人)
2.通知给谁。(接收的邮箱)
3.通知的内容(内容可以自定义)

file

file

配置收件人

file

file

file

file

添加报警媒介

file

file
告警消息添加

## 故障告警
标题: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}

file

故障{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}

山林不向四季起誓 荣枯随缘