1.什么是监控
监视,控制
2.为什么要做监控
教室: 监控学员的学生状况
超市: 防偷
马路: 事故(事后追溯)
监控: 本质上是 行为
系统为什么要做监控:
监控是整个运维乃至整个产品生命周期中最重要的一环.
事前及时预警发现故障,事后提供详实的数据用于追查定位问题。
3.监控怎么做,比如我要监控内存的使用率,低于百分之20则报警
1.提取内存的指标
2.判断比对 ,与管理人员设定的阈值
3.大于百分之20, 则忽略
4.小于百分之20, 则触发警告
4.监控有哪些工具来辅助实现
cacti 用于监控网络设备 交换机 路由器 防火墙 流量为主
Nagios 用于监控系统
Zabbix 用于监控系统 web界面 分布式 报警 自带模板
open-falcon 小米公司
Prometheus+grafana
5.如何着手监控
1.硬件监控 ( 交换机 路由器 防火墙 服务器 ) DELL IRDAC ipmi
2.系统监控 ( CPu 内存 磁盘 IO )
3.服务监控 ( nginx php mysql tomcat ....... )
4.日志监控 ( ELK 架构 )
5.web监控 ( 请求延时 响应延时 加载时间 ..... pv uv ip )
6.业务监控 新增用户 流量 购买量
7.分布式监控 多机房监控 proxy
8.自动化监控 自动的添加主机进行监控
6.单机时代如何监控
命令监控
监控层面:
cpu: top htop
内存: free -m 大量消耗内存会占用swap,如果没有swap 则会触oom
磁盘: df -h 空间 iotop
网络: ifconfig route iftop nethogs nethogs -v 3
glances 工具
引用shell脚本 + crond 定时任务 (监控当前系统用户登录的数量 超过4 则报警)
for ip in {7..9}
do
users=$(ssh root@172.16.1.$ip "who|wc -l")
if [ $user -ge 3 ];then
echo "报警通知 172.16.1.$ip"
fi
done
--------------------------------引入zabbix监控----------------------------------------
4.安装zabbix4.0
1.配置yum仓库
rpm -ivh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
2.安装zabbix相关功能组件
DNS地址变更,网络快可忽略
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1="8.8.4.4"
systemctl restart network
安装php72w 依赖httpd环境,安装php72
yum -y install php* --skip-broken
避免网络延迟导致失败时使用,多次尝试下载
yum install zabbix-server-mysql zabbix-web-mysql httpd mariadb-server -y
yum install zabbix-web-mysql -y
yum install zabbix-web-mysql -y
yum install zabbix-web-mysql -y
yum install zabbix-web-mysql -y
yum install zabbix-web-mysql -y
————————————————
3.创建数据库
# systemctl start mariadb
# systemctl enable mariadb
# mysql -uroot -e "create database zabbix character set utf8 collate utf8_bin;"
# mysql -uroot -e "grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';"
4.导入数据至数据库中
zcat /usr/share/doc/zabbix-server-mysql-4.0.19/create.sql.gz | mysql -uroot -p123123 zabbix
5.配置zabbix-server指向数据库
[root@zabbix-server ~]# grep '^D' /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
6.启动 Zabbix server 进程
# systemctl enable zabbix-server
# systemctl start zabbix-server
7.配置Zabbix 前端 web页面
vim /etc/httpd/conf.d/zabbix.conf
.....
php_value date.timezone Asia/Shanghai
....
systemctl restart httpd #重启Httpd
8.通过url访问zabbix-server
可通过ip地址访问,例:10.0.0.7:10050
1.根据提示填写信息即可
2.默认的用户名和密码是
username: Admin
password: zabbix
当zabbix初始界面出现错误
解决步骤:
vim /etc/php.ini
post_max_size8M16M
max_execution_time30300
max_input_time60300
date.timezone = Asia/Shanghai
systemctl restart httpd.service
9.登录zabbix后
1.修改密码
页面右上角小人头,进行修改
2.将zabbix修改为中文
10.如何快速的监控一台主机
1.需要安装zabb-agent
2.agent版本有有要求?
平级
低于
3.安装zabbix-agent (没有依赖)
rpm -Uvh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.14-1.el7.x86_64.rpm
4.配置zabbix-agent,允许172.16.1.71 能够采集172.16.1.7本地的数据
[root@web01 ~]# grep "^[a-Z]" /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=172.16.1.71
Include=/etc/zabbix/zabbix_agentd.d/*.conf
5.启动zabbix-agent
systemctl enable zabbix-agent
systemctl start zabbix-agent
systemctl restart zabbix-agent
6.登录zabbix-server web界面
1.配置-->主机-->添加主机
2.模板-->关联-->Template Linux OS
11.zabbix中文乱码
rpm -ql zabbix-web | grep /usr/share/zabbix/assets/fonts
在主机\C\windows下的font中上传
cd /usr/share/fonts/dejavu
mv DejaVuSans.ttf DejaVuSans_bak.ttf
mv msyh.ttf DejaVuSans.ttf
12.zabbixserver如何监控自己本身?
rpm -Uvh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.14-1.el7.x86_64.rpm
systemctl start zabbix-agent
systemctl enable zabbix-agen
13.zabbix基础架构**
zabbix-agent
zabbix-server
mariadb
zabbix-web
14.zabbix架构拆分
j将LAMP架构拆分为LAP+MySQL (拆分数据库到单台主机 )
172.16.1.71 zabbix-server zabbix-web
172.16.1.51 数据库
1.安装数据库
yum install mariadb-server -y
systemctl enable mariadb
systemctl start mariadb
2.创建zabbix库,配置远程授权用户
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';
3.在172.16.1.71上进行如下操作
[root@zabbix-server ~]# mysqldump -B zabbix >zabbix.sql
[root@zabbix-server ~]# cat zabbix.sql | mysql -h 172.16.1.51 -uzabbix -pzabbix zabbix
4.修改zabbix-server配置的指向
[root@zabbix-server ~]# cat /etc/zabbix/zabbix_server.conf
#DBHost=localhost
DBHost=172.16.1.51
[root@zabbix-server ~]# systemctl restart zabbix-server
5.修改zabbix-web配置的指向
[root@zabbix-server ~]# vim /etc/zabbix/web/zabbix.conf.php
$DB['SERVER'] = '172.16.1.51';
[root@zabbix-server ~]# systemctl restart httpd
自定义监控项
15.如何快速监控一个自定义对象,比如监控当前用户登录数量
Format: UserParameter=<key>,<shell command>
1.使用shell命令提取当前用户登录的数量 who|wc -l
2.使用zabbix-agent将shell命令提取的结果封装一个监控项 UserParameter
3.zabbix-agent自己检查该监控项是否能正确提取到对应的值 zabbix_agentd -p
4.zabbix-server通过zabbix-get检查zabbix-agent端自定义的监控项是否正常 zabbix_get -s 172.16.1.7 -k user_login
5.登录zabbix-web页面, 找到对应的主机, 然后添加对应的监控项.
6.点击检测中--->最新数据--->选择主机--->选择应用级-->检查监控项指标的变化
cat /etc/zabbix/zabbix_agentd.d/all.conf
UserParameter=user_login,who|wc -l
systemctl restart zabbix-agent
zabbix-get server端检测agent端的取值
server端手动测试取值结果
server端安装zabbix-get
rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-get-4.0.14-1.el7.x86_64.rpm
zabbix_get -s 172.16.1.7 -k user_login
16.如何快速设定一个自定义阈值,比如超过4个人登录则触发报警
1.基于已创建好的监控项设定阈值
2.如果达标则触发
3.如果不达标,继续探测,监视
17.前端展示报警:
1.点击右上角小人头-->正在发送消息-->勾选前端信息中
监控项、触发器、报警通知
1.详细讲解自定义监控
1.认识Template OS Linux 模块的所有监控项都是干什么的
2.自定义一个监控项 ( 创建监控项中的所有选项 )
3.历史保留如何计算? ( 数据 )
days*(items/refresh rate)*24*3600*bytes
items:监控项数量。
days:保留历史数据的天数。
refresh rate:监控项的更新间隔。
bytes:保留单个值所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。
90*(200/60)*24*3600 ~ 24MB * 200主机 = 5G
4.趋势保留如何计算? ( 图形 )
days*(items/3600)*24*3600*bytes
items:监控项数量。
days:保留历史数据的天数。
bytes:保留单个趋势数据所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。
365*(200/3600)*24*3600 ~ 2MB * 200主机 = 500MB
5.事件如何计算?
days*events*24*3600*bytes
events:每秒产生的事件数量。假设最糟糕的情况下,每秒产生 1 个事件。
days:保留历史数据的天数。
bytes:保留单个趋势数据所需的字节数,取决于数据库引擎,通常为 ~170 字节。
365*1*24*3600 ~ 30MB *200主机 = 6G
https://www.zabbix.com/documentation/4.0/zh/manual/installation/requirements
6.自定义监控TCP 11种状态?
netstat -an | grep -c ESTABLISHED
netstat -an | grep -c LISTEN
netstat -an | grep -c SYN_SENT
netstat -an | grep -c TIME_WAIT
1.使用shell命令提取状态
2.通过zabbix-agent将提取的状态封装为一个又一个的监控项目
3.检查封装后的监控项是否取值正确
4.创建一个模板
5.基于模板创建监控项
6.将主机关联该模板,完成监控
7.检查监控后的数据
UserParameter=tcp[*], netstat -lntp | grep -c "$1"
7.如何让其他机器也能使用该模板?
1.推送*.conf文件,这样其他主机也能提取到key对应的值
2.将主机关联对应的模板
2.自定义触发器
https://www.cnblogs.com/kingle-study/p/10172413.html
1.监控内存的百分比, 如果 低于20% 则触发报警
1.通过shell命令提取内存的百分比
2.设定触发器
多条件触发器
2.监控内存, 以及swap 当内存低于百分之20,并且swap使用率超过百分之1% 则触发报警
内存取的是剩余 20
swap取的是已使用 1
变量
监控项
key | 键值
and #并且 多个监控项,同时成立
or #或者 多个监控项,一个成立
last() #比对最新的值
avg() #平均值 网络的流量 avg(5m) 进程 负载 IO
diff() #比对上一次文件的内容
nodata() #收不到数据进行报警nodata(5m) 探测主机存活
test.nodata(5m) = 1 这个条件为真 获取不到数据报警
(5m) #表示最近5分钟得到值
(#5) #表示最近5次得到的值
3.自定义图形
1.基于监控项, 创建图形, 可以在模板上创建,这个所有的主机都应用成功
2.基于图形创建, 聚合图形, 将多个小图片整合至一个大图片上 ( 检测中--->聚合图形 )
3.基于聚合图形创建幻灯片, 可以让多张聚合图形进行轮播 (大屏显示器 --> )
扩展: 如果希望出更好看,更炫的图,需要使用grafana
注意: grafana只是一个出图,所有的数据都是zabbix提供 ( 皮肤 )
1.安装grafana
# yum localinstall grafana-6.4.4-1.x86_64.rpm
2.启动grafana 默认监听在3000端口
# systemctl start grafana-server
3.安装插件, 集成zabbix
# grafana-cli plugins install alexanderzobnin-zabbix-app
# systemctl restart grafana-server
4.启用已安装好的zabbix插件,这样就完成了集成
5.配置zabbix数据源
6.grafana 变量 ()
1.实现一个单条件触发器
2.实现一个多条件触发器
3.基于监控项
1.图形
2.聚合图形
3.幻灯片
4.grafana安装
3.自定义报警
基于监控项-->触发器-->执行动作--> ( 通知 | 执行命令
1.怎么发
2.发什么
3.发给谁
邮箱报警
1.修改报警媒介
smtp.qq.com
端口:465
HELo: qq.com
SMTP电邮: 发件人邮箱 *****qq.com
安全连接: SSL
打开验证对端,验证主机
认证:
用户:发件人邮箱 *****qq.com
密码:邮箱授权码
2.收件人设置:
右上角小人头,报警媒介填写接收人邮箱
1.启用动作
2.动作中将所有的报警消息通过介质发送给administrator用户
3.配置介质--> 新建一个发邮件的邮箱介质
4.配置administrator用户, 填写收件人邮件
https://www.zabbix.com/documentation/3.4/zh/manual/appendix/macros/supported_by_location
修改报警的消息
报警主机:{HOST.NAME1}
报警服务: {ITEM.NAME1}
报警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
报警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}
3.配置故障恢复消息,消息内容如下:
恢复主机:{HOST.NAME1}
恢复服务: {ITEM.NAME1}
恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}
{ALERT.SENDTO} #发送的用户
{ALERT.SUBJECT} #发送的主题
{ALERT.MESSAGE} #发送的内容
邮件报警
微信报警
安装python-pip 模块
yum install python-pip -y
pip install requests
cd /usr/lib/zabbix/alertscipts
rz weixin.py chown +x weixin.py
./weixin.py WeiXinID Subject Messages
切记一定要删除,否则导致权限问题。
rm -f /tmp/weixin.log
操作流程:单击管理---> 报警媒介类型--> 创建媒介类型
企业微信地址,个人可注册
https://work.weixin.qq.com/
登录企业微信
- 企业 -> 微工作台里可以直接微信关注,无需要下载企业微信
- 通讯录里的账号在发微信脚本中要用到
- 应用与小程序可创建应用
发微信的python脚本/usr/local/zabbix/alertscripts/weixin.py
[root@zabbix-server alertscripts]# cat weixin.py
!/usr/bin/env python
-- coding: utf-8 --
author: bgx
date: 2018
comment: zabbix接入微信报警脚本
import requests
import sys
import os
import json
import logging
logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join('/tmp','weixin.log'),
filemode = 'a')
corpid='xxx'
appsecret='xxx'
agentid=xxx
获取accesstoken
token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']
发送消息
msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken
touser=sys.argv[1]
subject=sys.argv[2]
toparty='3|4|5|6'
message=sys.argv[2] + "\n\n" +sys.argv[3]
params={
"touser": touser,
"toparty": toparty,
"msgtype": "text",
"agentid": agentid,
"text": {
"content": message
},
"safe":0
}
req=requests.post(msgsend_url, data=json.dumps(params))
logging.info('sendto:' + touser + ';;subject:' + subject + ';;message:' + message)
测试脚本
/usr/local/zabbix/alertscripts/weixin.py 'abc' 'weixin_subject' 'weixin_message'
钉钉报警
钉钉企业的地址
https://oa.dingtalk.com/
钉钉企业告警的注意事项
1.通讯录管理里的userid发钉钉需要用到
2.工作台里可自建应用
3.微应用管理可以管理应用
4.开发账号管理可以查看密码信息
发送钉钉告警的脚本/usr/local/zabbix/alertscripts/zabbix_dingding.py
!/usr/bin/python
-- coding: utf-8 --
curl 'https://oapi.dingtalk.com/gettoken?corpid=xxx&corpsecret=xxx'
import json,urllib2,sys
appkey = 'dingbb89fne7xgn86dri'
appsecret = 'c81LS_3h7pDRB6ul94tzXfyfcwmWaoy68yr-PGn7eG6MVE8RGXqADmw2DYQFsOsX'
agentid = '682880648'
touser = sys.argv[1]
content = sys.argv[2]
tockenurl = 'https://oapi.dingtalk.com/gettoken?corpid=' + appkey + "&corpsecret=" + appsecret
tockenresponse = urllib2.urlopen(tockenurl)
tockenresult = json.loads(tockenresponse.read().decode('utf-8'))
tocken = tockenresult['access_token']
sendurl = 'https://oapi.dingtalk.com/message/send?access_token=' + tocken
headers = {
'Content-Type':'application/json'
}
main_content = {
"touser": touser,
"toparty": "",
"agentid": agentid,
"msgtype": "text",
"text": {
"content": content
}
}
main_content = json.dumps(main_content)
req = urllib2.Request(sendurl,headers=headers)
response = urllib2.urlopen(req, main_content.encode('utf8'))
print(response.read().decode('utf-8'))
手动发钉钉告警测试
chmod +x /usr/local/zabbix/alertscripts/zabbix_dingding.py
/usr/local/zabbix/alertscripts/dingding.py manager8495 '监控测试'
{ALERT.SENDTO} #发送的用户
{ALERT.SUBJECT} #发送的主题
{ALERT.MESSAGE} #发送的内容
4.告警升级 | 告警抑制
1.远程执行命令
2.告警抑制是怎么回事
1个故障 出现 发邮件给运维 邮件
超过1分钟没有被处理 发邮件给经理 微信
超过2分钟没有被处理 发邮件给总监 钉钉
7.自定义模板
8.自定义监控Nginx PHP
自定义监控项模板,及服务的状态监控
1.模板的重要
1.手动添加监控比较麻烦,监控项 -> 图形 -> 触发器。
问题:
1.例如: 100台服务器需要检查81端口
2.例如: 100台服务器81改成82
解决:
使用模板可以解决以上问题, 只需要修改一下模板,然后所有的主机都生效
2.两种模板
系统自带模板
自定义模板
自定义模板的使用
1.创建模板,模板得属于某个主机组(Templates)
2.在模板中创建监控项目、触发器、创建图形
3.新增监控主机时添加对应的模板
4.更改模板的监控项,所以使用模板的主机都会自动变更
建议: 监控的时候都使用模板, 因为模板添加啥的都方便,修改也比较方便
1.zabbix监控windows
环境:
1.zabbix server的ip:10.0.0.71
2.被监控windows的ip:10.0.0.1
1.下载Zabbix Agent
https://www.zabbix.com/downloads/4.0.14/zabbix_agents-4.0.14-win-amd64.zip
2.Windows安装zabbix agent
编辑配置文件D:\zabbix_agents-4.0.14-win-amd64\conf\zabbix_agentd.conf
Server=10.0.0.71
3.运行cmd,将zabbix命令注册为服务(使用管理员) services.msc
"d:\zabbix_agents-4.0.14-win-amd64\bin\zabbix_agentd.exe" --config d:\zabbix_agents-4.0.14-win-amd64\conf\zabbix_agentd.conf --install
4.cmd运行
查看监听netstat -an|find "10050"
5.zabbix_get获取windows信息
zabbix_get -s xxx -k system.uname
zabbix_get -s xxx -k vm.memory.size[free]
zabbix_get -s xxx -k vfs.fs.size[C:,pfree]
6.windows防火墙放开10050端口
1.防火墙关闭的可以跳过这步
2.高级设置->入站规则->新建规则->端口->10050->允许连接->所有
7.zabbix页面上添加windows主机
1.直接应用windows模板
2.验证Windows监控是否正常
编写一个最简单的bat脚本D:\zabbix_agents-4.0.14-win-amd64\echo.bat
@echo off
echo "100"
zabbix配置添加D:\zabbix_agents-4.0.14-win-amd64\conf\zabbix_agentd.conf
UserParameter=echo.test,D:\zabbix_agents-4.0.14-win-amd64\echo.bat
2.zabbix监控Nginx
1.监控Nginx什么内容
监控Nginx⑦中状态
2.怎么监控
1.开启Nginx stub status 模块
2.使用curl命令获取stub_status的数据
3.将获取数据的方法封装为一个又一个的监控项
3.实施监控
1.开启nginx stub_status状态
2.编写脚本,提取nginx status的指标
[root@web01 scripts]# cat nginx_status.sh
Nginx_status_file=/tmp/nginx_status.tmp
Nginx_status_name=status.oldxu.com
Nginx_status_path=/nginx_status
curl -sH host:${Nginx_status_name} http://127.0.0.1:80${Nginx_status_path} > ${Nginx_status_file}
case $1 in
active)
echo $[ $(awk 'NR==1 {print $NF}' ${Nginx_status_file}) -1 ]
;;
accepts)
echo $[ $(awk 'NR==3 {print $1}' ${Nginx_status_file}) - 1 ]
;;
handled)
echo $[ $(awk 'NR==3 {print $2}' ${Nginx_status_file}) - 1 ]
;;
requests)
echo $[ $(awk 'NR==3 {print $3}' ${Nginx_status_file}) - 1 ]
;;
reading)
awk 'NR==4 {print $2}' ${Nginx_status_file}
;;
writing)
awk 'NR==4 {print $4}' ${Nginx_status_file}
;;
waiting)
awk 'NR==4 {print $NF}' ${Nginx_status_file}
;;
*)
echo "USAGE: $0 [active|accepts|handled|requests|reading|writing|waiting]"
;;
esac
3.配置zabbix-agent, 添加自定义监控项
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/nginx.conf
UserParameter=nginx_status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/scripts/nginx_status.sh "$1"
4.重启zabbix-agent
5.zabbix-server使用zabbix-get获取监控项的值
[root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k nginx_status[active]
10
[root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k nginx_status[requests]
20
6.登录zabbix-web
1.创建模板
2.创建监控项
3.创建图形
4.创建触发器
5.关联对应主机
1.nginx的状态监控
2.nginx日志监控 { 200 300 301 304 404 403 500 401 .... 这些状态出现的次数}
1.提取日志
awk '{print $9}' /var/log/nginx/access.log|grep -c "302"
2.自定义监控项,支持传参
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/nginx.conf
UserParameter=nginx_status_code[*], awk '{print $9}' /var/log/nginx/access.log|grep -c "$1"
[root@web01 ~]# systemctl restart zabbix-agent
3.server使用zabbix-get获取
[root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k nginx_status_code[200]
10000
[root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k nginx_status_code[302]
327556
4.登录zabbix-web
1.创建模板
2.创建监控项
3.创建图形
4.创建触发器
5.关联对应主机
================================================================================
监控php
1.监控php端口
2.监控php进程 master worker
3.监控php状态
实施:
1.如何开启php状态
2.获取php状态中重要的指标
3.编写脚本支持传参
1.开启php的状态模块
[root@web01 ~]# cat /etc/php-fpm.d/www.conf
....
pm.status_path = /fpm_status
....
2.配置nginx,将http请求转发给php处理
[root@web01 conf.d]# cat status.oldxu.com.conf
server {
listen 80;
server_name status.oldxu.com;
location /fpm_status {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3.php-fpm状态指标含义
[root@web01 conf.d]# curl -H Host:status.oldxu.com http://127.0.0.1/fpm_status
pool: www
process manager: dynamic
start time: 20/Nov/2019:15:15:19 +0800
start since: 200
accepted conn: 22 #当前池接受的请求数
listen queue: 0 #请求队列,如果这个值不为0,那么需要增加FPM的进程数量
max listen queue: 0 #请求队列最高的数量
listen queue len: 128 #socket等待队列长度
idle processes: 5 #空闲进程数量
active processes: 1 #活跃进程数量
total processes: 6 #总进程数量
max active processes: 1 #最大的活跃进程数量(FPM启动开始计算)
max children reached: 0 #超过最大进程数的峰值的次数,如果不为0,需要调整进程的最大活跃进程数量
4.编写取值脚本
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/scripts/fpm_status.sh
#!/usr/bin/bash
fpm_status_file=/tmp/fpm_status.tmp
fpm_status_name=status.oldxu.com
fpm_status_path=/fpm_status
curl -sH host:${fpm_status_name} http://127.0.0.1:80${fpm_status_path} > ${fpm_status_file}
case $1 in
accepted_conn)
awk '/accepted conn:/{print $NF}' ${fpm_status_file}
;;
listen_queue)
awk '/^listen queue:/{print $NF}' ${fpm_status_file}
;;
max_listen_queue)
awk '/^max listen queue:/{print $NF}' ${fpm_status_file}
;;
active_processes)
awk '/^active processes:/{print $NF}' ${fpm_status_file}
;;
idle_processes)
awk '/^idle processes:/{print $NF}' ${fpm_status_file}
;;
total_processes)
awk '/^total processes:/{print $NF}' ${fpm_status_file}
;;
max_active_processes)
awk '/^max active processes:/{print $NF}' ${fpm_status_file}
;;
max_children_reached)
awk '/^max children reached:/{print $NF}' ${fpm_status_file}
;;
*)
echo "USAGE: $0 [accepted_conn|listen_queue|max_listen_queue|active_processes|idle_processes|total_processes|max_active_processes|max_children_reached]"
;;
esac
5.自定义监控项,支持传参
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/fpm.conf
UserParameter=fpm.status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/scripts/fpm_status.sh "$1"
[root@web01 ~]# systemctl restart zabbix-agent
6.server使用zabbix-get获取
[root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k fpm.status[accepted_conn]
2031
[root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k fpm.status[max_active_processes]
50
7.登录zabbix-web
1.创建模板
2.创建监控项
3.创建图形
4.创建触发器
5.关联对应主机
==============================================================================
Mysql的基础监控
1.进程存活
2.检测端口
Mysql的高级监控说明
Mysql提供show global status可以实现对Mysql的高级监控
高级监控包含监控Mysql连接数,增删改查数,流量等
其他的监控mysql的方式
天兔 (文档)
percona (视频)
监控命令详解mysql -uroot -poldxu.com -e 'show global status'
Threads_connected:连接数
Com_select:查询总量
Com_insert:插入总量
Com_update:更新总量
Com_delete:删除总量
Bytes_received: 流入总流量
Bytes_sent:流出总流量
Slow_queries:慢查询总量
1.编写取值脚本check_mysql.sh
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/scripts/mysql_status.sh
!/usr/bin/bash
port=2
mysql -uroot -poldxu.com -P{key}\s" |awk '{print $2}'
2.测试监控Shell脚本
[root@web01 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/mysql_status.sh 3306 Threads_connected
3.Zabbix自定义监控项
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=mysql.status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/scripts/mysql_status.sh "2" 2>/dev/null
重启agent
4测试能否获取到值
zabbix_get -s xxx -k mysql.status[3306,Threads_connected]
zabbix_get -s xxx -k mysql.status[3306,Com_insert]
5.使用Template DB MySQL模板监控Mysql 利用自带的模板改一改
mysql.status[3306,Threads_connected]
mysql.status[3306,Com_select]
mysql.status[3306,Bytes_received]
mysql.status[3306,Bytes_sent]
写一个测试的程序测一下
[root@web01 ~]# cat mysql.sh
for i in {1..1000}
do
mysql -uroot -poldxu.com -h 127.0.0.1 -e "create database IF NOT EXISTS db;
use db;
DROP TABLE IF EXISTS test{i}(id int);
insert into db.test{i};
delete from test${i} where id=123456;"
done
==============================================================================
Mysql主从监控的必要性
1.如果发生主从同步异常,业务会出问题
2.如果从库是用来备份的,会导致数据丢失
Mysql主从同步监控说明
1.从库运行show slave status\G可以来查看主从同步信息
Slave IO Running 可以观察从库的IO进程是否正常,IO进程用于同步二进制日志
Slave SQL Running 可以观察从库的SQL进程是否正常,SQL进程用于执行二进制日志
Seconds Behind Master代表主从同步的延时时间
1.监控Mysql主从的Shell脚本mysql_slave_status.sh
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh
!/usr/bin/bash
port=2
mysql -uroot -poldxu.com -P{key}:"|awk '{print $2}' 2>/dev/null
2.Shell脚本测试
[root@web01 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh 3306 Slave_SQL_Running
Yes
[root@web01 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh 3306 Slave_IO_Running
Yes
[root@web01 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh 3306 Seconds_Behind_Master
0
3.Zabbix自定义Key监控Mysql主从
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=mysql.slave.status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh "2" 2>/dev/null
重启Agent
4.创建监控模板Template Mysql Slave Status
mysql.slave.status[3306,Slave_IO_Running]
mysql.slave.status[3306,Slave_SQL_Running]
mysql.slave.status[3306,Seconds_Behind_Master]
5.定义解决器来判断主从同步是否异常
1.触发器一: 两个状态都要为Yes
{Template MySQL Slave Status:mysql.slave.status[3306,Slave_IO_Running].str(Yes)}=0 or {Template MySQL Slave Status:mysql.slave.status[3306,Slave_SQL_Running].str(Yes)}=0
2.触发器二: 延时不能超过100
{Template MySQL Slave Status:mysql.slave.status[3306,Seconds_Behind_Master].last()}>100
网络发现、主动注册
1.zabbix的snmp监控? ( 不重要 )
2.web监控
pv uv ip
请求延时
响应延时
加载时间
网站慢则报警
4.自动化监控:
自动发现,网络发现
主动注册
主动模式与被动模式区别?
主动模式与被动模式效果展示?
https://blog.csdn.net/qq_28657577/article/details/82834442
snmp基础介绍
snmp全称是简单网络管理协议
为什么要用?
路由器交换机无法安装agent程序,但是都提供snmp服务端, 我们可以使用zabbix的snmp方式监控snmp服务端的数据
snmp基础概念:
OID:
内存的大小:.1.3.6.1.2.1.25.2.2.0
内存的剩余:.1.3.6.1.2.1.25.2.2.1
任何一个指标在snmp中都有一个唯一的值进行表示,那么oid排列顺序是以树状信息排列。
MIB库:统计所有的old库(国际标准)
获取内存信息,hrMemorySize.0
可以理解MIB是域名,比较好记忆。 OID是IP地址,不太好记忆。
snmp版本:
v1:不支持加密,任何人都可以取值, 不安全
v2:简单加密版,通过口令才可以取值 通过 community设定口令
v3:复杂加密,采集效率比较低
目前使用的最多的还是v2版本
snmp服务端安装
1.安装
[root@web02 ~]# yum install net-snmp -y
2.配置
[root@web02 ~]# vim /etc/snmp/snmpd.conf
#public是默认密码,建议修改
com2sec notConfigUser default oldxu
#限制丛树杈哪个地方开始取值,如果需要监控的信息,设置.1从顶点开始
view systemview included .1
3.启动
[root@web02 ~]# systemctl enable snmpd.service
[root@web02 ~]# systemctl start snmpd
4.客户端安装命令测试取值
# yum install net-snmp-utils -y
# snmpwalk -v2c -c oldxu 172.16.1.7 .1.3.6.1.2.1.25.2.2.0 #OID方式
# snmpwalk -v2c -c oldxu 172.16.1.7 hrMemorySize.0 #MIB方式
5.在zabbix-web界面直接添加即可
总结:
1.snmp介绍
OID
MIB
版本
2.snmp服务安装配置启动测试
1.zabbix基础架构
2.zabbix内部资源
2.web监控
pv uv ip
1.awk
2.腾讯分析 百度统计 google分析
3.piwiki ---> 改名matomo
4.自建流量分析平台
1.进入腾讯移动分析平台 html应用 别人家
2.给一份js的代码
3.将js的代码加入网站
4.等待一天 就能查看到指标
2.自己家 开源matomo
php+mysql 方式开发 LNMP环境 + matomo代码 = 统计网站
1.准备好一个blog站点 + qq主题
2.安装matomo程序
3.matomo添加我们的网站,会生成一个js的代码
4.登录blog 将js代码添加进主题
5.用户模拟访问测试
6.登录matomo查看pv 情况
注意: 在内网使用,一定都需要做域名解析
在外网使用,无需考虑
请求延时
响应延时
加载时间
网站慢则报警
实际案例: 监控一个网站: zabibx网站速度
1.访问zabbix
2.登录zabbix regex:name="csrf-token" content="([0-9a-z]{16})"
3.检查zabbix
4.退出zabbix
5.检查是否退出zabbix成功
监控宝 压测宝
1.snmp监控
2.腾讯移动分析公网--
3.matomo内网分析
4.web检测-->wordpress
4.自动化监控:
自动发现,网络发现
主动注册
主动模式与被动模式区别?
主动模式与被动模式效果展示?
1.自动发现:
规则 + 动作 -->
添加主机
添加主机组
添加模板
2.自动发现弊端:
1.扫描慢
2.容易漏
3.对server压力较大
4.无法根据主机名称关联对应模板
1.主动注册:
agent主动上报数据,而不是server询问
1.agent需要配置 ServerActive HostName 配置为主动模式
主动注册2个场景:
1.根据主机名称,关联不同的模板?
web linux tcp nginx php mysql-slave
db linux tcp mysql
2.根据主机的元数据,关联不同的模板?
linux
windows
主动模式和被动模式的区别?
网络发现 ---> 被动模式
主动注册 ---> 主动模式
主动还是被动说的都是Agent程序.
被动:
形象理解: 领导找你要数据
Server-->不断轮询Agent获取数据
主动:
形象理解: 主动向领导汇报数据
Agent自动上报数据给Server
zabbix监控项全部都是被动模式:
针对监控项目被动模式: 获取100个值 需要server轮询获取Agent100次
针对监控项目主动模式: 获取100个监控项的值 Server--->发给Agent Agent一次上报所有数据
主动模式: 自动注册 zabbix监控客户端(主动式)
被动模式: 网络发现 zabbix监控客户端(被动式)
主动模式与被动模式 选择哪个?
1.如果主机超过300+以上,建议主动
2.如果zabbix队列比较繁忙 建议主动模式
分布式监控、优化
20.zabbix分布式监控,模拟多机房实现监控?
1.有多机房时,需要用到proxy
1.网络不通
2.网络延迟
2.当监控的主机较多时,也可以用proxy来缓解压力
1.安装proxy
[root@web01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
1.安装proxy 数据库
yum install zabbix-proxy-mysql mariadb-server -y
systemctl start mariadb
MariaDB [(none)]> create database zabbix_proxy character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix_proxy.* to zabbix_proxy@localhost identified by 'zabbix_proxy';
zcat /usr/share/doc/zabbix-proxy-mysql-4.0.14/schema.sql.gz | mysql -uzabbix_proxy -pzabbix_proxy zabbix_proxy
2.配置zabbix-proxy
[root@web02 ~]# grep "^[a-Z]" /etc/zabbix/zabbix_proxy.conf
....
Server=10.0.0.71
Hostname=sh_proxy
DBHost=localhost
DBName=zabbix_proxy
DBUser=zabbix_proxy
DBPassword=zabbix_proxy
....
3.启动proxy
systemctl enable zabbix-proxy.service
systemctl start zabbix-proxy
4.配置zabbix-agent 不通区域的agent指向不同的proxy
10.0.0.71 <--- 10.0.0.7 <---172.16.1.51
10.0.0.71 <--- 10.0.0.8 <---172.16.1.41
5.登录zabbix-web
1.管理-->agent代理程序
注意: zabbix-server 与 zabbix-proxy 需要版本一致
ProxyLocalBuffer Proxy将在本地保留数据N小时,即使数据已与server同步。(默认不保留立即发送)
ProxyOfflineBuffer 如果无法连接Zabbix server,proxy将默认保留数据1小时.
zabbix监控jvm? tomcat
zabbix ---> jmx ---> java(zabbix-agent)
1.Zabbix-Server找Zabbix-Java-Gateway获取Java数据
2.Zabbix-Java-Gateway找Java程序获取数据
3.Java程序返回数据给Zabbix-Java-Gateway
4.Zabbix-Java-Gateway返回数据给Zabbix-Server
5.Zabbix-Server进行数据展示
配置JMX监控的步骤:
1.安装Zabbix-Java-Gateway。
2.配置zabbix_java_gateway.conf参数。
3.配置zabbix-server.conf参数。-->连接java-gateway
4.Tomcat应用开启JMX协议。
5.ZabbixWeb配置JMX监控的Java应用。
环境:
zabbix-server 10.0.0.71 172.16.1.71
zabbix-gateway 172.16.1.7
tomcat 172.16.1.8
1.安装Zabbix-Java-Gateway
[root@web01 ~]# yum install zabbix-java-gateway -y
2.启动Zabbix-Java-Gateway
[root@web01 ~]# systemctl restart zabbix-java-gateway
[root@web01 ~]# systemctl enable zabbix-java-gateway.service
3.配置zabbix-server指向zabbix-java-gateway
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
JavaGateway=172.16.1.7
JavaGatewayPort=10052
StartJavaPollers=5
[root@zabbix-server ~]# systemctl restart zabbix-server
4.启动tomcat程序,开启jmx协议
[root@web02 soft]# vim /soft/tomcat/bin/catalina.sh #头部添加即可
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=172.16.1.8"
5.登录zabbix-web添加一台jmx的主机
zabbix Api ( 开发 )
1.在使用zabbix-api之前,先获取一个token
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "123456"
},
"id": 1
}' http://zabbix.oldxu.com/zabbix/api_jsonrpc.php
{"jsonrpc":"2.0","result":"6b322c293dc557631c8ffdb32b1c6b5f","id":1}
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": "6b322c293dc557631c8ffdb32b1c6b5f"
}' http://zabbix.oldxu.com/zabbix/api_jsonrpc.php
2.使用token验证身份, 并禁用某一台主机
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.update",
"params": {
"hostid": "10277",
"status": 1
},
"auth": "6b322c293dc557631c8ffdb32b1c6b5f",
"id": 1
}' http://zabbix.oldxu.com/zabbix/api_jsonrpc.php
4.使用API创建主机
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "10.0.0.1",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "10.0.0.1",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "20"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"auth": "4c831e081ff77510f9662bb9de0f9144",
"id": 1
}' http://zabbix.oldxu.com/zabbix/api_jsonrpc.php
Zabbix属于写多读少的业务, 所以需要针对zabbix的MySQL进行拆分.
1.LAMP -->拆分成LAP + MySQL
2.MySQL尽量使用SSD固态盘 (静态盘会有寻道的过程,浪费时间)将Zabbix-Agent被动监控模式, 调整为主动监控模式.
使用zabbix-proxy分布式监控, 在大规模监控时用于缓解Zabbix-Server压力
用proxy代理服务器可以缓解server的压力去掉无用监控项, 增加监控项的取值间隔, 减少历史数据保存周期(由housekeeper进程定时清理)
一些自带监控项很多我们用不到,可把无用监控项取消。
5)针对于Zabbix-server进程调优, 谁忙就加大谁的进程数量, 具体取决实际情况, 不是越大越好
StartPollersUnreachable=1
调整工作进程数。
6)针对于Zabbix-server缓存调优, 谁使用的缓存多,就加大它的缓存值(zabbix cache usage图表)
调整zabbix-server.conf的主配置文件,CacheSize相关大小。
- 关注管理->队列, 是否有被延迟执行的监控项
zabbix单机监控两千台机器是瓶颈,分布式同样最多2000台。
Btree算法结构的构件过程
首先是把数据从小到大进行排序,然后将数据有顺序的存储到数据页上,生成left-node 叶子节点
通过叶子节点的范围(最小值到下个叶子节点的最小值)和每个叶子节点的指针生成枝节点
最后通过枝节点的范围(最小值到下分枝节点的最小值)和枝节点的每个指针生成root根节点
还有我们用的是数据库5.7版本,它对索引的查询范围作了优化,怎么优化的呢就是对叶子节点和枝节点加入了双向指针
加入双向指针的作用是减少了索引IO的次数
减少了随机IO的数量
减少了IO的量级
锁的隔离级别
脏读 读未提交的 比如A发生数据变化,但是没有提交,B事务来了读A修改的这些数据,就是脏读
RU: 读未提交
RC: 读已提交
RR: 可重复读
SR: 串行化
主从复制
两台以上的数据库实例,通过二进制日志,实现数据复制的关系。
实现过程:
1.两台以上数据库实例,设置不同的server_id ,server_uuid
2.主库开启二进制日志,binlog
3.用mysqldump备份主库的数据,并且记录位置点,。把数据恢复到从库。
4.从库通知主库,告诉从库主库相关的信息。
5.从库开启slave复制线程
原理:
包括三个线程,4个文件 主:binlogdump mysql_bin
从: SQL、IO relay_info master_info relay_log
从库执行change master to ,获取连接主库的信息(IP、port、用户、密码、binlog起点)
信息被存到master.info文件中。
- 从库:start slave 命令, 启动IO,SQL线程.
- IO开始工作,拿着,master.info中的连接信息,连接主库,验证通过,主库开启dump线程
- IO按照master.info中记录的binlog位置点信息,向主库的DUMP线程请求新的日志
- 主库dump线程返回新的日志event,返回给从库.
- 从库IO线程接收binlog,并重新更新master.info信息
- 从库IO将接收到的binlog记录到relay-log中
- 从库SQL线程读取 relay.info信息,获取到上次执行到的位置点,继续向后回放最新relaylog日志,并重新更新relay.info信息