数据库
首页 > 数据库> > zabbix===》面试技巧、单机监控命令、zabbix数据库拆分

zabbix===》面试技巧、单机监控命令、zabbix数据库拆分

作者:互联网

一、面试技巧

1.面试常问

#1.面试官:你们公司监控是如何做的?
    你:用zabbix
   面试官:....
#2.面试技巧
   监控软件我们使用的是zabbix,我们监控不同维度
    - 硬件层面:先说物理服务器型号:DELL R710  R720  R730...
        (IDRAC自带一个远程管理卡,安装上一个软件包之后就可以监控)
        (如果不适用Dell的idrac那就使用zabbix的IPMI接口监控硬件)
       监控内容:1.CPU温度 2.风扇转速 3.磁盘是否损坏 4.CMOS电池电量 5.内存是否损坏等等
    
    - 系统层面:
       监控内容:1.CPU:使用率、负载 2.内存:使用率 3.磁盘:使用率、IO 4.进程 5.TCP状态 6.系统负载 
    
    - 网络层面:
       监控内容:1.网络设备:路由器、交换机 2.网卡入口流量 3.网卡出口流量 4.带宽的峰值
       

    - 应用层面:当然了最基本的就是各个服务的进程端口号,一些特殊程序我们还需要额外监控 :
       监控内容:1.MySQL:主从复制是否有延迟(zabbix监控模板) 2.redis:主从复制是否有延迟(监控思路:zabbix没有固定模板,可以在主库中set一个key为时间戳,然后从库会同步这个时间戳,写脚本时获取这两个时间戳,做对比) 3.NFS:磁盘挂载状况 4.tomcat:JVM监控,老年代、新生代、永久带、full-gc 、垃圾回收 5.rsync的同步情况。MD5校验文件是否被篡改
       

    - 业务层面:
       监控内容:1.URL的监控 2.ARI的监控 3.NGINX的状态码 4.tomcat的exception 5.请求时间 6.响应时间 7.加载时间 8.渲染时间   

二、单机监控命令

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
[root@web02 ~]# top
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
[root@web02 ~]# htop
 CPU[|                                                                0.7%]   Tasks: 27, 38 thr; 1 running

#4.glances
[root@web02 ~]# glances
web02 (CentOS Linux 7.5.1804 64bit / Linux 3.10.0-862.el7.x86_64)                                                                                                                                                       Uptime: 1 day, 8:12:51

CPU  [||                                                                         2.9%]   CPU       2.9%  nice:     0.0%                    MEM     13.1%  active:     310M                    SWAP      0.0%                    LOAD    1-core
MEM  [||||||||||                                                                13.1%]   user:     1.9%  irq:      0.0%                    total:  1.94G  inactive:   145M                    total:   1024M                    1 min:    0.14
SWAP [                                                                           0.0%]   system:   1.0%  iowait:   0.0%                    used:    260M  buffers:   2.03M                    used:        0                    5 min:    0.09
                                                                                         idle:    97.1%  steal:    0.0%                    free:   1.68G  cached:     319M                    free:    1024M                    15 min:   0.07                                   
#5.uptime
[root@web02 ~]# uptime
 12:33:18 up 1 day,  8:13,  1 user,  load average: 0.10, 0.08, 0.07

2.内存监控命令

#1.free
[root@web02 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1982         186        1413           9         383        1612
Swap:          1023           0        1023

[root@web02 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        186M        1.4G        9.4M        383M        1.6G
Swap:          1.0G          0B        1.0G

#2.top
#3.glances
#4.htop
后面这几个命令在看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))

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
[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
#以兆为单位,每秒执行一次,执行10次
[root@web02 ~]# iostat -dm 1 10

#4.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
[root@web02 ~]# glances
DISK I/O     R/s    W/s      0.3   0.3  292M 5.96M   537 root         0 S   1:53.61     0     0 /usr/bin/vmtoolsd
sda1           0      0      0.0   0.0     0     0   271 root       -20 S   0:00.00     0     0 bioset
sda2           0      0      0.0   0.1  191M 1.21M   545 root         0 S   0:00.00     0     0 /usr/sbin/gssproxy -D
sda3           0      0      0.0   0.0     0     0   227 root       -20 S   0:00.00     0     0 ata_sff
sr0            0      0      0.0   0.2  124M 4.41M  2356 nginx        0 S   0:00.30     0     0 nginx: worker process
sr1            0      0      0.0   0.1 87.5M 2.11M  1108 root         0 S   0:00.44     0     0 /usr/libexec/postfix/master -w

4.网络监控命令

#1.glances
[root@web02 ~]# glances
NETWORK     Rx/s   Tx/s   TASKS 100 (138 thr), 2 run, 98 slp, 0 oth sorted automatically by cpu_percent, flat view
eth0        168b    1Kb
lo            0b     0b

#2.iftop
[root@web02 ~]# iftop
                                               12.5Kb                                          25.0Kb                                         37.5Kb                                          50.0Kb                                    62.5Kb
└──────────────────────────────────────────────┴───────────────────────────────────────────────┴──────────────────────────────────────────────┴───────────────────────────────────────────────┴───────────────────────────────────────────────
web02                                                                                                     => 10.0.0.1                                                                                                  1.31Kb  2.82Kb  2.82Kb
                                                                                                          <=                                                                                                            208b    347b    347b
web02                                                                                                     => gateway                                                                                                      0b    268b    268b
                                                                                                          <=                                                                                                              0b    268b    268b
                                                                                                                                                                                        #按P键可以看到与什么服务在交互
#Mb 与 MB的区别
#百兆带宽:100Mb
#实际:100Mbps / 8 = 12MB

#3.nethogs (该命令可以查看某个进程所使用的流量)
[root@web02 ~]# nethogs
NetHogs version 0.8.5

    PID USER     PROGRAM                                                                                                                                                                                  DEV        SENT      RECEIVED
   2477 root     sshd: root@pts/1                                                                                                                                                                         eth0        0.131   0.064 KB/sec
      ? root     unknown TCP                                                                                                                                                                                          0.000   0.000 KB/sec

  TOTAL                                                                                                                                                                                                               0.131       0.064 KB/sec


#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

5.TCP11种状态监控命令

#1.netstat
[root@driver-zeng ~]# 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@driver-zeng ~]# netstat -an|awk '/^tcp/ {print $NF}'|sort|uniq -c
      4 ESTABLISHED
      6 LISTEN

[root@driver-zeng ~]# netstat -an|awk '/^tcp/ {++state[$NF]} END {for(key in state) print key," \t" ,state[key]}'
LISTEN       6
ESTABLISHED      4

#2.ss
[root@driver-zeng ~]# ss -n|awk '{print $2}'|sort|uniq -c
     42 ESTAB
      1 State

6.生产场景需求

如何每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

7.系统的oom(out of memory)

随着时间的推移,用户不断增多,服务消耗的内存越来越多,当系统内存不足的时候,可能会导致系统产生oom(out of memory)

1.当系统内存不足时就会大量使用swap(虚拟内存)
2.当系统大量使用swap的时候,系统会特别卡
注意:有时可能内存还有剩余300M或者500M,但是swap依然被使用

[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

8.使用脚本监控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数据库拆分

目前我们zabbix的架构,单台zabbix服务:LAMP+zabbix
我们需要实现zabbix架构,将数据库拆分成单独的一台,LAP+zabbix+MySQL

1.环境准备

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 = '曾老湿';

$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)

标签:单机,0.0,zabbix,web02,拆分,total,root,内存
来源: https://blog.csdn.net/weixin_52492280/article/details/114867950