20.面试题
# 01.zabbix用的什么版本啊?
以前用的较多的是zabbix 3.4
zabbix 4.4特性
- Zabbix 4.4发布了全新的agent,zabbix_agent2,为用户监控提供了更广泛的可能性和更高级的新功能:
- Go语言编写
- 用于监控各种服务和应用的插件框架
- 并发检查时确保状态正常(例如,保持持续的DB连接)。
- 内置时间调度器(scheduler ),支持灵活的时间间隔。
- 使用批量数据传输的高效的网络使用
- 用即将支持的更多平台嵌入式替换Linux上现有的代理
Zabbix 5.0为更安全的监控引入了重大改进:
- 支持Webhook的HTTP代理,使从Zabbix server到外部告警和ITSM系统的连接更加安全和可控
- agent端的监控指标支持黑名单和白名单
- 所有Zabbix组件都可配置密码,以避免在TLS连接中使用非安全密码
- 支持到MySQL和PostgreSQL后端的加密连接
- 更强大的SHA256用于保存用户密码的Hash值
# 02.zabbix微信报警怎么做的?
# 2.1 为什么选用微信企业号
- 因为微信企业号需要先在企业通信录新建该员工,该员工才能关注该企业号,这样就能实现告警信息的私密性。
- 如果使用公众号,则只要所有关注了该公众号的人都能收到告警消息,容易造成信息泄露。
- 而且员工数少于200人的企业号是不用钱的,也没有任何申请限制。
# 2.2 实现步骤
# 2.2.1 注册微信企业号
打开以下链接注册微信企业号:https://work.weixin.qq.com/wework_admin/register_wx?from=myhome
选择没有营业执照继续注册(限员工数200人以下),如下图所示,如果是正规大企业使用,请正常注册。
# 2.2.2 在企业号上创建告警应用
该告警应用的角色如下:
Zabbix_server ---------> 告警应用 --------> 运维人员微信号
在企业号上创建一个应用,如下图所示:
填好相关资料,应用即可创建完成,如上图本文创建的应用叫Zabbix告警
# 2.2.3 企业号上的重要信息
这里重点提一下企业号里几点重要的信息,等会在脚本中会用到
corpid
企业号的ID号,获得地方如下图所示:
- orpsecret和Agentid
# 2.2.4 安装python3环境
- 安装openssl-devel依赖,让python支持https
yum install -y openssl-devel
- 下载并安装python3
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz
tar -xzvf Python-3.6.2.tgz
cd Python-3.6.2
./configure --prefix=/usr/local/python3 && make && make install
2
3
4
- 安装脚本用到的python库
/usr/local/python3/bin/pip3 install requests
# 2.2.5 Zabbix报警脚本
把报警脚本放到zabbix_server相应的目录下
文件名为:sendToWeixin.py (记得添加可执行权限)
报警脚本代码如下 (替换下面的 'xxxxx' 部分)
# usr/local/python3/bin/python3
# -*- coding:utf-8 -*-
import requests
import json
import sys
# 企业号及应用相关信息
corp_id = 'xxxxxxx'
corp_secret = 'xxxxxxx'
agent_id = xxxxxx
# 存放access_token文件路径
file_path = '/tmp/access_token.log'
def get_access_token_from_file():
try:
f = open(file_path,'r+')
this_access_token = f.read()
print('get success %s' % this_access_token)
f.close()
return this_access_token
except Exception as e:
print(e)
# 获取token函数,文本里记录的token失效时调用
def get_access_token():
get_token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' % (corp_id, corp_secret)
print(get_token_url)
r = requests.get(get_token_url)
request_json = r.json()
this_access_token = request_json['access_token']
print(this_access_token)
r.close()
# 把获取到的access_token写入文本
try:
f = open(file_path,'w+')
f.write(this_access_token)
f.close()
except Exception as e:
print(e)
# 返回获取到的access_token值
return this_access_token
# snedMessage
# 死循环,直到消息成功发送
flag = True
while(flag):
# 从文本获取access_token
access_token = get_access_token_from_file()
try:
to_user = '@all'
message = sys.argv[3]
send_message_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token
print(send_message_url)
message_params = {
"touser":to_user,
"msgtype":"text",
"agentid":agent_id,
"text":{
"content" : message
},
"safe":0
}
r = requests.post(send_message_url, data=json.dumps(message_params))
print('post success %s ' % r.text)
# 判断是否发送成功,如不成功则跑出异常,让其执行异常处理里的函数
request_json = r.json()
errmsg = request_json['errmsg']
if errmsg != 'ok': raise
# 消息成功发送,停止死循环
flag = False
except Exception as e:
print(e)
access_token = get_access_token()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# 2.2.6 修改Zabbix_server告警
修改告警调用的脚本名称及给脚本传入的参数,如下图所示
上图Script parameters表示调用脚本时向脚本传入什么参数,参数解释如下
{ALTER.SENDTO} # 发送给谁,该参数在邮件告警中有作用,但微信告警中没有 {ALTER.SUBJECT} # 告警标题,该参数在邮件告警中有作用,但微信告警中没有 {ALTER.MESSAGE} # 告警内容,在微信告警中有用
1
2
3
- 修改告警内容格式
修改告警内容样式,让告警内容看得更舒服(在微信告警中告警标题是没用的,发送给谁也是基本上没有用)
- 内容如下:
{HOST.NAME1}
{IPADDRESS}
{ITEM.KEY1}: {ITEM.VALUE1}
Item info:
Item name: {ITEM.NAME1}
Trigger Info:
Trigger: {TRIGGER.NAME}
Trigger status: {TRIGGER.STATUS}
Trigger severity: {TRIGGER.SEVERITY}
Original event ID: {EVENT.ID}
2
3
4
5
6
7
8
9
10
11
12
13
# 2.2.7 企业号通信录
把所有要接收告警的人都添加到企业号通信录里面,逻辑是(先在通信录里创建该成员,再邀请该成员加入,或让他扫码加入)
如下图所示
# 03.zabbix你们是用主动模式还是被动模式?
# 3.1 zabbix主动被动模式说明
- Zabbix的主动模式和被动模式都是相对agent来说的。
- 一般情况下默认使用的是zabbix的被动模式,即zabbix server根据监控项定义的时间主动去收集zabbix agent上的数据
- 优点是能使用更多的模板,更具有灵活性,缺点是当zabbix agent节点过多的时候会增加zabbix server的负荷。
- 主动模式就是zabbix agent将消息推送给zabbix server,优点是减轻了zabbix server的压力,缺点是所有的模板要修改为主动模式
# 3.2 zabbix主动被动模式介绍
Zabbix 监控客户端分为主动监控与被动监控
Zabbix监控客户端默认为被动模式,可以修改为主动模式,只需要在客户端配置文件中添加。
PS:主被动模式以客户端是针对客户端来说的,
可以关闭被动模式的方法:在配置文件中加入 StartAgents=0,即为关闭被动模式。
主被动监控模式区别如下:
Zabbix 主动模式:
- Agent 主动请求 server 获取主动的监控项列表,并主动将监控项内需要检测的数据提交给 server/proxy。
- zabbix agent 首先向ServerActive 配置的 IP 请求获取 active items,获取并提交 active tiems 数据值 给server 或者 proxy;
Zabbix 被动模式:
Server 向 agent 请求获取监控项的数据, agent 返回数据。
Server 打开一个 TCP 连接, Server 发送请求 agent.ping, Agent 接收到请求并且响应, Server 处理接收到的数据。
# 04.zabbix监控mysql监控哪些参数?
非功能指标:
- QPS:数据库每秒钟处理的请求数量,包括DML,DDL这样才能体现数据库的性能
- TPS:数据库每秒处理的事务数量
- 并发数:数据库当前的并行处理的会话数量
- 连接数:连接到数据库会话的数量
- 缓存命中率:InnoDB的缓存命中率
功能指标:
- 可用性:数据库是否正常对外提供服务
- 阻塞:当前是否有阻塞的会话,锁住了别人需要的资源
- 死锁:当前事务是否产生了死锁,相互锁住了对方的资源
- 慢查询:实时慢查询监控
- 主从延迟:在异步复制架构中需要
# 05.zabbix主要做哪些方面的监控?
- 监控一切需要监控的东西,只要能够想到,能够用命令实现的都能用来监控
- 1)硬件监控
- 通过远程控制卡:Dell的iDRAC,HP的ILO和IBM的IMM等
- 使用IPMI来完成物理设备的监控工作,通常必须监控的就是问的、硬盘等故障
- 路由器、交换机
- 2)系统监控
- CPU、内存、硬盘使用率、硬盘IO、系统负载、进程数
- 3)服务监控
- apache、nginx、mysql、redis、Tomcat、JVM、TCP连接数
- 4)性能监控
- 网站性能、服务器性能、数据库性能、存储性能
- 5)日志监控
- 系统日志、应用程序日志、错误日志、服务运行日志等,可以使用ELK来进行日志监控
# 06.zabbix的主动发现你们是怎么做的?
https://blog.csdn.net/yin138/article/details/83183346
- 自动发现主要是希望通过发现网络中的主机,并自动把主机添加到监控中,并关联特定的模板,实现自动监控。
- 例如在办公网络中,希望通过Zabbix Agent监控所有工作电脑
- 只需要把新安装的电脑开放防火墙10050端口,那么电脑就可以自动通过发现新机器,并开始监控。
- 如果网络中可能存在Windows和Linux系统,就需要通过Zabbix Agent判断自动添加的主机是Windows还是Linux。
- 以上这个过程需要分为两个步骤
- 通过网络扫描指定的服务,本例为Zabbix Agent是否可以访问system.uname指标
- 发现主机之后需要执行添加的动作,这个过程由动作(Action)完成
- 配置扫描的方法
# 07.zabbix的模板你都用过哪些?
# 7.1 Tcp连接监控相关设置
[root@localhost]# vim Tcp_Status.sh
#!/bin/bash
#scripts for tcp status
function SYNRECV {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'SYN-RECV' | awk '{print $2}'
}
function ESTAB {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'ESTAB' | awk '{print $2}'
}
function FINWAIT1 {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'FIN-WAIT-1' | awk '{print $2}'
}
function FINWAIT2 {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'FIN-WAIT-2' | awk '{print $2}'
}
function TIMEWAIT {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'TIME-WAIT' | awk '{print $2}'
}
function LASTACK {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LAST-ACK' | awk '{print $2}'
}
function LISTEN {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LISTEN' | awk '{print $2}'
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 7.2 Nginx的连接监控设置
#!/bin/bash
# Info: zabbix 监控 nginx 性能以及进程状态
# 检查nginx 进程是否存在
function ping {
/sbin/pidof nginx | wc -l
}
# 检查nginx 性能
# 活动连接数
function active {
/usr/bin/curl "http://127.0.0.1/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
# 处理的连接数
function accepts {
/usr/bin/curl "http://127.0.0.1/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
# 成功创建的握手次数
function handled {
/usr/bin/curl "http://127.0.0.1/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
# 处理的请求数
function requests {
/usr/bin/curl "http://127.0.0.1/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
# 读取客户端的连接数
function reading {
/usr/bin/curl "http://127.0.0.1/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
# 响应数据到客户端的数量
function writing {
/usr/bin/curl "http://127.0.0.1/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
# 已经处理完正在等候下一次请求指令的驻留连接
function waiting {
/usr/bin/curl "http://127.0.0.1/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
# 执行function
$1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 7.3 Mysql的监控设置
[root@localhost]# vim Check_mysql.sh
#!/bin/sh
MYSQL_SOCK="/tmp/mysql.sock"
MYSQL_PWD=`cat /opt/application/zabbix/plugin/.mysqlp`
ARGS=1
if [ $# -ne "$ARGS" ];then
echo "Please input one arguement:"
fi
case $1 in
Uptime)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK status|cut -f2 -d":"|cut -f1 -d"T"`
echo $result
;;
Com_update)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_update"|cut -d"|" -f3`
echo $result
;;
Slow_queries)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK status |cut -f5 -d":"|cut -f1 -d"O"`
echo $result
;;
Com_select)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_select"|cut -d"|" -f3`
echo $result
;;
Com_rollback)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_rollback"|cut -d"|" -f3`
echo $result
;;
Questions)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK status|cut -f4 -d":"|cut -f1 -d"S"`
echo $result
;;
Com_insert)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_insert"|cut -d"|" -f3`
echo $result
;;
Com_delete)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_delete"|cut -d"|" -f3`
echo $result
;;
Com_commit)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_commit"|cut -d"|" -f3`
echo $result
;;
Bytes_sent)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Bytes_sent" |cut -d"|" -f3`
echo $result
;;
Bytes_received)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Bytes_received" |cut -d"|" -f3`
echo $result
;;
Com_begin)
result=`mysqladmin -uZabbixAgent -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_begin"|cut -d"|" -f3`
echo $result
;;
CPU_usage)
result=`/usr/bin/top -bn1 -U mysql|grep mysqld|awk '{print $9}'`
echo $result
;;
Memory_usage)
result=`/usr/bin/top -bn1 -U mysql|grep mysqld|awk '{print $10}'`
echo $result
;;
*)
echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|CPU_usage|Memory_usage)"
;;
esac
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 08.zabbix 监控项有哪些?
# 09.zabbix监控硬件监控哪些参数?
- 数据库:磁盘使用情况、内存使用情况、并发链接数量 数据库增删改查的频率、主从状态、缓冲池
- web:web服务是否正常、订单是否能正常下单
- 注册是否正常、服务的响应时间、服务的并发量
- 磁盘:使用率、block数,Inode数,读写速率
- cpu:cpu负载、cpu使用资源最多的进程
- 内存:使用率、缓冲区、缓存区、交换分区的大小
- 网络:网卡的先行速率、占用网络带宽最多的进程、数据包的丢包、网络数据包阻塞情况
- 进程:系统中的总进程数、特定程序的进程数
# 10.zabbix监控MySQL监控监控哪些参数?
# 10.1 MYSQL.QPS
- 定义:QPS 实际上是指 MySQL Server过去10秒平均每秒执行的 Query总量(包括show .select,set names,set global 等等);
- 计算公式:
QPS=(questions(当前值)-questions(10秒前的值) )/ 10
- 是否保留:是
- 报警阀值:视各个业务情况(主要是query的复杂度)及服务器配置设置.大部分设置为10000
- 报警类型:大于10000 严重.大于12000 灾难
# 10.2 MYSQL.TPS
- 定义:TPS指每秒向mysql sever提交的修改(包含update.insert.delete.replace);
- 老的计算方式:
- T1=Handler_commit+Handler_rollback (均为当前值)
- T2= Handler _commit+ Handler _rollback (均为10s之前值)
- TPS=T1-T2/10
- 新的计算方式:
- T1= Com_insert+ Com_replace+Com_delete+Com_update (均为当前值)
- T2= Com_insert+ Com_replace+Com_delete+Com_update (均为10s之前值)
- TPS=(T1-T2)/10
- 是否保留:是
- 报警阀值:视各个业务情况及服务器配置设置.大部分设置为4000
- 报警类型:大于4000严重.大于6000 灾难
# 10.3 MYSQL.READS
- 定义:READS指每秒向msyql sever提交的读请求次数(仅指select);
- 计算公式:
- R1=com_select+ qcache_hits (均为当前值)
- R2=com_select+ qcache_hits (均为10秒前的值)
- READS=R1-R2/10
- 是否保留:是
- 报警阀值:
# 10.4 MYSQL.WRITES
- 定义:WRITERS 指每秒向mysql server提交的写请求次数
- 计算公式:
- W1=com_insert+com_delete+com_update (均为当前值)
- W2=com_insert+com_delete+com_update (均为10s之前的值)
- WRITES=(W1-W2)/10
- 是否保留:不保留
- 去除原因:这个监控选项和tps重复.