p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 5.0pt; line-height: 150%; font-size: 10.5pt; font-family: Consolas }
h1 { margin-top: 17.0pt; margin-right: 0cm; margin-bottom: 16.5pt; margin-left: 0cm; text-align: justify; text-indent: 0cm; line-height: 240%; page-break-after: avoid; font-size: 20.0pt; font-family: Consolas }
h2 { margin-top: 13.0pt; margin-right: 0cm; margin-bottom: 13.0pt; margin-left: 0cm; text-align: justify; text-indent: 0cm; line-height: 172%; page-break-after: avoid; font-size: 18.0pt; font-family: Consolas }
h3 { margin-top: 13.0pt; margin-right: 0cm; margin-bottom: 13.0pt; margin-left: 0cm; text-align: justify; text-indent: 0cm; line-height: 150%; page-break-after: avoid; font-size: 16.0pt; font-family: Consolas }
h4 { margin-top: 14.0pt; margin-right: 0cm; margin-bottom: 14.5pt; margin-left: 0cm; text-align: justify; text-indent: 0cm; line-height: 157%; page-break-after: avoid; font-size: 14.0pt; font-family: Consolas }
h5 { margin-top: 14.0pt; margin-right: 0cm; margin-bottom: 14.5pt; margin-left: 0cm; text-align: justify; text-indent: 5.0pt; line-height: 156%; page-break-after: avoid; font-size: 14.0pt; font-family: Consolas }
h6 { margin-top: 12.0pt; margin-right: 0cm; margin-bottom: 3.2pt; margin-left: 0cm; text-align: justify; text-indent: 5.0pt; line-height: 133%; page-break-after: avoid; font-size: 12.0pt; font-family: "Calibri Light", "sans-serif" }
p.MsoHeader,li.MsoHeader,div.MsoHeader { margin: 0cm; margin-bottom: .0001pt; text-align: center; text-indent: 5.0pt; line-height: 150%; border: none; padding: 0cm; font-size: 9.0pt; font-family: Consolas }
p.MsoFooter,li.MsoFooter,div.MsoFooter { margin: 0cm; margin-bottom: .0001pt; text-indent: 5.0pt; line-height: 150%; font-size: 9.0pt; font-family: Consolas }
p.MsoCaption,li.MsoCaption,div.MsoCaption { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 10.0pt; line-height: 150%; font-size: 10.0pt; font-family: "Calibri Light", "sans-serif" }
a:link,span.MsoHyperlink { color: #EE7B08; text-decoration: underline }
a:visited,span.MsoHyperlinkFollowed { color: #977B2D; text-decoration: underline }
p.MsoDocumentMap,li.MsoDocumentMap,div.MsoDocumentMap { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 5.0pt; line-height: 150%; font-size: 12.0pt; font-family: "Heiti SC Light" }
pre { margin: 0cm; margin-bottom: .0001pt; font-size: 10.0pt; font-family: "Courier New" }
p.MsoAcetate,li.MsoAcetate,div.MsoAcetate { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 5.0pt; font-size: 9.0pt; font-family: Consolas }
span.MsoPlaceholderText { color: gray }
p.MsoNoSpacing,li.MsoNoSpacing,div.MsoNoSpacing { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 5.0pt; font-size: 10.5pt; font-family: Consolas }
p.MsoListParagraph,li.MsoListParagraph,div.MsoListParagraph { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 21.0pt; line-height: 150%; font-size: 10.5pt; font-family: Consolas }
span.MsoIntenseReference { font-variant: small-caps; color: #99CB38; letter-spacing: .25pt; font-weight: bold }
span.MsoBookTitle { letter-spacing: .25pt; font-weight: bold; font-style: italic }
span.1Char
{ font-family: Consolas; font-weight: bold }
span.2Char
{ font-family: Consolas; font-weight: bold }
span.3Char
{ font-family: Consolas; font-weight: bold }
span.4Char
{ font-family: Consolas; font-weight: bold }
span.5Char
{ font-family: Consolas; font-weight: bold }
span.6Char
{ font-family: "Calibri Light", "sans-serif"; font-weight: bold }
span.Char { font-family: Consolas }
span.Char0 { font-family: Consolas }
span.Char1 { font-family: "Heiti SC Light" }
p.a,li.a,div.a { margin-top: 0cm; margin-right: 5.0pt; margin-left: 5.0pt; margin-bottom: .0001pt; text-indent: 5.0pt; line-height: 12.0pt; background: #F2F2F2; font-size: 10.5pt; font-family: Consolas; color: #333333 }
span.Char2 { font-family: Consolas; color: #333333; background: #F2F2F2 }
span.Char3 { font-family: "Times New Roman", "serif" }
p.a0,li.a0,div.a0 { margin: 0cm; margin-bottom: .0001pt; line-height: 150%; border: none; padding: 0cm; font-size: 10.5pt; font-family: "Times New Roman", "serif" }
span.Char4 { font-family: "Courier New"; color: #333333; background: #F0F7FE }
p.a1,li.a1,div.a1 { margin-top: 0cm; margin-right: 28.65pt; margin-left: 0cm; margin-bottom: .0001pt; text-indent: 18.4pt; line-height: 12.0pt; background: #F0F7FE; border: none; padding: 0cm; font-size: 10.5pt; font-family: "Courier New"; color: #333333 }
span.HTMLChar { font-family: "Courier New" }
p.01, li.01, div.01
{ margin: 0cm; margin-bottom: .0001pt; text-align: justify; background: white; border: none; padding: 0cm; font-size: 10.5pt; font-family: "Calibri", "sans-serif"; color: black }
p.1, li.1, div.1
{ margin: 0cm; margin-bottom: .0001pt; font-size: 12.0pt; font-family: 黑体 }
p.a2,li.a2,div.a2 { margin: 0cm; margin-bottom: .0001pt; line-height: 15.6pt; background: #D9D9D9; border: none; padding: 0cm; font-size: 12.0pt; font-family: 宋体 }
span.1Char0
{ font-family: 黑体 }
span.Char5 { font-family: 宋体; background: #D9D9D9 }
span.Char6 { font-family: Consolas }
.MsoChpDefault { font-family: "Calibri", "sans-serif" }
div.WordSection1 { }
ol { margin-bottom: 0cm }
ul { margin-bottom: 0cm }

硬件监控:Zabbix IPMI Interface

系统监控:Zabbix Agent Interface

Java监控:Zabbix JMX Interface

网络设备监控:Zabbix SNMP Interface

应用服务监控:Zabbix Agent UserParameter

MySQL数据库监控:percona-monitoring-plulgins

URL监控:Zabbix Web 监控

这一下子把之前干的工作全集成到一个平台上了。而且之前编写的所有的应用服务的监控脚本,简单修改就可以使用。

同时也可以灵活的设置报警阈值、告警方式、告警升级、告警去重、告警依赖等等,同时还使用Zabbix的自动发现功能实现上线一台服务器后,自动添加监控。

使用Zabbix
Proxy实现了多机房的分布式监控,这简直太棒了。

对于告警通知:邮件、微信、短信、钉钉等,都可以与Zabbix快速的集成,网上有很多此类文档。同时,针对某些可以进行直接处理的报警,Zabbix可以触发Action来轻松帮你实现,故障的自动处理。+

1.1硬件监控

通常我们的服务器上都会有远程控制卡,如Dell的iDRAC,HP的ILO和IBM的IMM等,可以通过Web界面来进行硬件的监控和管理工作,如果购买企业级的授权,还可以使用控制台进行管理。

在Linux下,通常我们使用IPMI来完成物理设备的监控工作,使用ipmi工具获取温度传感器的数据,大于50就发一份邮件给维护人员

故障回想:之前我司托管在北京某机房的设备就出现过,因为刚好所在机柜区域的空调坏了,导致服务器温度过高,然后系统宕机。

1.2系统监控

系统监控标准(CPU、内存、硬盘、网络、进程、TCP连接数)可以通过  基础模板Template OS Linux(完全足够) 来监控,根据自己的业务来调整合适的触发器以及图形等,即可。

CPU关于CPU,有3个重要的概念:上下文切换(context switchs),运行队列(Run queue)和使用率(utilization)。这也是我们CPU监控的三个重点。

通常情况下,每个处理器的运行队列要小于等于3,CPU 利用率中user/system比例维持在70/30,上下文切换要根据系统繁忙程度来综合考量。监控工具有:top vmstat mpstat

内存:Linux虚拟内存是一个庞大的东东,通常我们需要监控内存的使用率、SWAP使用率、同时可以通过内存的使用率曲线来发现某些服务的内存溢出等。监控工具有:free vmstat

IOIO分为磁盘IO和网络IO。除了在做性能调优我们要监控更详细的数据外,那么日常监控,只关注磁盘使用率、io wait即可,网络也是监控网卡流量即可。监控工具有iostat iotop iftop

TCP监控:在很多情况下有必要监控TCP的状态,可以使用netstat或者ss来获取所有的TCP连接,来展现11种不同的TCP连接状态的数量,可以在大并发中及时发现TCP的相关故障。

其它的系统监控:运行的进程数、登陆用户、文件加密等。

1.3应用监控

1.3.1TCP监控

1.配置所有Agent(标准化目录结构)

[root@linux-node1
~]# vim /etc/zabbix/zabbix_agentd.conf #编辑配置文件引用key

Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@linux-node1
~]# mkdir /etc/zabbix/scripts #存放Shell脚本

2.编写Shell脚本

[root@linux-node1
~]# cd /etc/zabbix/scripts

[root@linux-node1
scripts]# vim tcp_status.sh

#!/bin/bash

############################################################

#
$Name:         tcp_status.sh

#
$Version:      v1.0

#
$Function:     TCP Status

#
$Author:       xuliangwei

#
$organization: www.xuliangwei.com

#
$Create Date:  2016-06-23

#
$Description:  Monitor TCP Service Status

############################################################

[
$# -ne 1 ] && echo
"Usage:CLOSE-WAIT|CLOSED|CLOSING|ESTAB|FIN-WAIT-1|FIN-WAIT-2|LAST-ACK|LISTEN|SYN-RECV
SYN-SENT|TIME-WAIT" && exit 1

tcp_status_fun(){

TCP_STAT=$1

ss -ant | awk 'NR>1 {++s[$1]} END {for(k
in s) print k,s[k]}' > /tmp/ss.txt

TCP_STAT_VALUE=$(grep "$TCP_STAT"
/tmp/ss.txt | cut -d ' ' -f2)

if [ -z "$TCP_STAT_VALUE" ];then

TCP_STAT_VALUE=0

fi

echo $TCP_STAT_VALUE

}

tcp_status_fun
$1;

添加执行权限

[root@linux-node1
scripts]# chmod +x tcp_status.sh

2.key的linux_tcp.conf的子配置文件如下:

[root@linux-node1
~]# cat /etc/zabbix/zabbix_agentd.d/tcp.conf

UserParameter=tcp_status[*],/bin/bash
/etc/zabbix/scripts/tcp_status.sh "$1"

3.重启zabbix-agent,修改配置文件必须重启

[root@linux-node1
~]# systemctl restart  zabbix-agent

4.测试一定使用Zabbix_get获取值(不要直接执行脚本)

[root@linux-node1
scripts]# zabbix_get -s 192.168.90.11 -k tcp_status[ESTAB]

8

5.展示所有Key(记得将模板关联主机)

图 4-1

6.查看图形(图形是自定义)

图4-2

7.完成后,将模板导出保存,方便以后二次使用,这辈子在也不用添加11次Key了。

1.3.2Nginx监控

1.配置所有Agent(标准化目录结构)

[root@linux-node1
~]# vim /etc/zabbix/zabbix_agentd.conf #编辑配置文件引用key

Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@linux-node1
~]# mkdir /etc/zabbix/scripts #存放Shell脚本

2.在nginx.conf的Server标签中添加如下内容(如果nginx通过saltstack等配置管理工具进行统一管理,则需要在模板中统一加入这段配置)

location /nginx_status {

stub_status on;

access_log  off;

allow 127.0.0.1;

deny all;

}

3.本地访问Nginx Status测试

[root@linux-node1
~]# curl http://127.0.0.1/nginx_status

Active
connections: 1

server
accepts handled requests

1 1 1

Reading:
0 Writing: 1 Waiting: 0

Nginx状态解释:

Active
connections Nginx正处理的活动链接数1个

server             Nginx启动到现在共处理了1个连接。

accepts
            Nginx启动到现在共成功创建1次握手。

handled
requests   Nginx总共处理了1次请求。

Reading             Nginx读取到客户端的 Header 信息数。

Writing             Nginx返回给客户端的 Header 信息数。

Waiting             Nginx已经处理完正在等候下一次请求指令的驻留链接,开启。

Keep-alive的情况下,这个值等于active-(reading + writing)。

请求丢失数=(握手数-连接数)可以看出,本次状态显示没有丢失请求。

4.编写Nginx的Shell脚本(如果端口不一致,只需要修改脚本端口即可)

[root@linux-node1
~]# cd /etc/zabbix/scripts

[root@linux-node1
scripts]# vim nginx_status.sh

#!/bin/bash

############################################################

#
$Name:         nginx_status.sh

#
$Version:      v1.0

#
$Function:     Nginx Status

#
$Author:       xuliangwei

#
$organization: www.xuliangwei.com

#
$Create Date:  2016-06-23

#
$Description:  Monitor Nginx Service
Status

############################################################

NGINX_PORT=80  #如果端口不同仅需要修改脚本即可,否则修改xml很麻烦

NGINX_COMMAND=$1

nginx_active(){

/usr/bin/curl -s
"http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk
'/Active/ {print $NF}'

}

nginx_reading(){

/usr/bin/curl -s
"http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk
'/Reading/ {print $2}'

}

nginx_writing(){

/usr/bin/curl -s
"http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk
'/Writing/ {print $4}'

}

nginx_waiting(){

/usr/bin/curl -s
"http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk
'/Waiting/ {print $6}'

}

nginx_accepts(){

/usr/bin/curl -s
"http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3
{print $1}'

}

nginx_handled(){

/usr/bin/curl -s
"http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3
{print $2}'

}

nginx_requests(){

/usr/bin/curl -s
"http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3
{print $3}'

}

case $NGINX_COMMAND in

active)

nginx_active;

;;

reading)

nginx_reading;

;;

writing)

nginx_writing;

;;

waiting)

nginx_waiting;

;;

accepts)

nginx_accepts;

;;

handled)

nginx_handled;

;;

requests)

nginx_requests;

;;

*)

echo $"USAGE:$0 {active|reading|writing|waiting|accepts|handled|requests}"

esac

给脚本添加执行权限

[root@linux-node1
scripts]# chmod +x nginx_status.sh

5.key的nginx_status.conf的子配置文件如下:

[root@linux-node1
~]# cat /etc/zabbix/zabbix_agentd.d/nginx_status.conf

UserParameter=nginx_status[*],/bin/bash
/etc/zabbix/zabbix_agentd.d/scripts/nginx/nginx_status.sh "$1"

6.重启zabbix-agent

[root@linux-node1
~]# systemctl restart  zabbix-agent

7.测试一定使用Zabbix_get来获取值

[root@linux-node1
~]# zabbix_get -s 192.168.90.11 -k nginx_status[writing]

1

8.展示所有Key(记得将模板关联主机)如图4-3

图4-3

9.查看图形,如图4-4(图形自定义)

图4-4

1.3.3PHP-FPM监控

1.配置所有Agent(标准化目录结构)

[root@linux-node1
~]# vim /etc/zabbix/zabbix_agentd.conf #编辑配置文件引用key

Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@linux-node1
~]# mkdir /etc/zabbix/scripts #存放Shell脚本

2.PHP-FPM工作模式通常与Nginx结合使用,修改php-fpm.conf(找到自己的php-fpm.conf存放路径)

[root@linux-node1
~]# vim /etc/php-fpm.d/www.conf  #我php-fpm存放路径

pm.status_path
= /phpfpm_status

3.修改nginx.conf的配置文件,通过Nginx访问PHP-FPM状态。

location ~ ^/(phpfpm_status)$ {

include fastcgi_params;

fastcgi_pass    127.0.0.1:9000;

fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;

}

4.访问测试phpfpm_status

[root@linux-node4
conf.d]# curl http://127.0.0.1/phpfpm_status

pool:                 www

process
manager:      dynamic

start
time:           05/Jul/2016:15:30:56
+0800

start
since:          409

accepted
conn:        22

listen
queue:         0

max
listen queue:     0

listen
queue len:     128

idle
processes:       4

active
processes:     1

total
processes:      5

max
active processes: 2

max
children reached: 0

PHP-FPM状态解释:

pool
#fpm池名称,大多数为www

process
manager #进程管理方式dynamic或者static

start
time #启动日志,如果reload了fpm,时间会更新

start since #运行时间

accepted
conn #当前池接受的请求数

listen
queue #请求等待队列,如果这个值不为0,那么需要增加FPM的进程数量

max
listen queue #请求等待队列最高的数量

listen
queue len #socket等待队列长度

idle
processes #空闲进程数量

active
processes #活跃进程数量

total
processes #总进程数量

max
active processes #最大的活跃进程数量(FPM启动开始计算)

max
children reached #程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量过小,可以适当调整。

4.编写php-fpm的Shell脚本(如果端口不一致,只需要修改脚本端口即可)

[root@linux-node1
~]# cd /etc/zabbix/scripts

[root@linux-node1
scripts]# vim phpfpm_status.sh

#!/bin/bash

############################################################

#
$Name:         phpfpm_status.sh

#
$Version:      v1.0

#
$Function:     Nginx Status

#
$Author:       xuliangwei

#
$organization: www.xuliangwei.com

#
$Create Date:  2016-06-23

#
$Description:  Monitor Nginx Service
Status

############################################################

PHPFPM_COMMAND=$1

PHPFPM_PORT=80

start_since(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk
'/^start since:/ {print $NF}'

}

accepted_conn(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk
'/^accepted conn:/ {print $NF}'

}

listen_queue(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk
'/^listen queue:/ {print $NF}'

}

max_listen_queue(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^max
listen queue:/ {print $NF}'

}

listen_queue_len(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk
'/^listen queue len:/ {print $NF}'

}

idle_processes(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk
'/^idle processes:/ {print $NF}'

}

active_processes(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk
'/^active processes:/ {print $NF}'

}

total_processes(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk
'/^total processes:/ {print $NF}'

}

max_active_processes(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^max
active processes:/ {print $NF}'

}

max_children_reached(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^max
children reached:/ {print $NF}'

}

slow_requests(){

/usr/bin/curl -s
"http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk
'/^slow requests:/ {print $NF}'

}

case
$PHPFPM_COMMAND in

start_since)

start_since;

;;

accepted_conn)

accepted_conn;

;;

listen_queue)

listen_queue;

;;

max_listen_queue)

max_listen_queue;

;;

listen_queue_len)

listen_queue_len;

;;

idle_processes)

idle_processes;

;;

active_processes)

active_processes;

;;

total_processes)

total_processes;

;;

max_active_processes)

max_active_processes;

;;

max_children_reached)

max_children_reached;

;;

slow_requests)

slow_requests;

;;

*)

echo $"USAGE:$0
{start_since|accepted_conn|listen_queue|max_listen_queue|listen_queue_len|idle_processes|active_processes|total_processes|max_active_processes|max_children_reached}"

esac

给脚本添加执行权限

[root@linux-node1
scripts]# chmod +x phpfpm_status.sh

5.key的phpfpm_status.conf的子配置文件如下:

[root@linux-node1
~]# cat /etc/zabbix/zabbix_agentd.d/phpfpm_status.conf

UserParameter=phpfpm_status[*],/bin/bash
/etc/zabbix/scripts/phpfpm_status.sh "$1"

6.重启zabbix-agent

[root@linux-node1
~]# systemctl restart  zabbix-agent

7.测试一定使用Zabbix_get来获取值

[root@linux-node1
zabbix_agentd.d]# zabbix_get -s 192.168.90.11 -k phpfpm_status[accepted_conn]

45

7.展示所有Key(记得将模板关联主机)如图4-5

图4-5

8.查看图形,如图4-4(图形自定义)

图4-6

1.3.4MySQL监控

percona Monitoring
Plugins是一个高质量的组件,为MySQL数据库添加企业级的监控和图表功能。其脚本使用PHP实现,故而Zabbix-Agent需要安装php环境。

1.配置所有Agent(标准化目录结构)

[root@linux-node1
~]# vim /etc/zabbix/zabbix_agentd.conf #编辑配置文件引用key

Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@linux-node1
~]# mkdir /etc/zabbix/scripts #存放Shell脚本

2.安装percona Monitoring Plugins   percona工具集https://www.percona.com/software/documentation

[root@linux-node1
~]# yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

[root@linux-node1
~]# yum install percona-zabbix-templates -y

3.查看目录结构

[root@linux-node1
percona]# tree /var/lib/zabbix/percona

/var/lib/zabbix/percona

├── scripts#脚本文件路径

│   ├── get_mysql_stats_wrapper.sh

│   └── ss_get_mysql_stats.php

└── templates

├── userparameter_percona_mysql.conf#key文件位置

└── zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml #模板文件位置

4.将key的的自配置文件复制至/etc/zabbix_agentd.conf.d目录下(以实际目录为准)

[root@linux-node1
~]# cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf/etc/zabbix/zabbix_agentd.d/percona_mysql.conf

5.重启zabbix-agent

[root@linux-node1
~]# systemctl restart zabbix-agent

6.修改脚本中的MySQL用户名和密码(可以单独建立一个用来做监控)

[root@linux-node1
scripts]# vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php

$mysql_user
= 'root';

$mysql_pass
= 'xuliangwei.com';

$mysql_port
= 3306;

7. 测试一定使用Zabbix_get来获取值(否则会失败),

[root@linux-node1
scripts]# zabbix_get -s 192.168.90.11 -k MySQL.pool-read-requests

223003813

8.如果获取不到值常见问题

1.看是否是MySQL密码错误

2.不要直接执行脚本来获取

3.删除/tmp/localhost-mysql_cacti_stats.txt文件(因为所有的值都会写入到这个文件)

4.权限问题导致

9.导入percona自带模板,如图4-7、图4-8、

[root@linux-node1
templates]# sz/var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml
#下载percona官网提供的模板

图4-7

图4-8

10.导入后将模板应用于主机,如图4-9

图4-9

1.3.5Tomcat监控

在Zabbix中,JMX监控数据的获取由专门的代理程序来实现,即Zabbix-Java-Gateway来负责数据的采集,Zabbix-Java-Gateway和JMX的Java程序之间通信获取数据

JMX在Zabbix中的运行流程:

a)Zabbix-Server找Zabbix-Java-Gateway获取Java数据

b)Zabbix-Java-Gateway找Java程序(zabbix-agent)获取数据

c)Java程序返回数据给Zabbix-Java-Gateway

d)Zabbix-Java-Gateway返回数据给Zabbix-Server

e)Zabbix-Server进行数据展示

配置JMX监控的步骤:

a)安装Zabbix-Java-Gateway。

b)配置zabbix_java_gateway.conf参数。

c)配置zabbix-server.conf参数。

d)Tomcat应用开启JMX协议。

e)ZabbixWeb配置JMX监控的Java应用。

1.配置所有Agent(标准化目录结构)

[root@linux-node1
~]# vim /etc/zabbix/zabbix_agentd.conf #编辑配置文件引用key

Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@linux-node1
~]# mkdir /etc/zabbix/scripts #存放Shell脚本

2.安装java以及zabbix-java-gateway (如果源码安装加上--enable-java参数)

[root@linux-node1
~]# yum install  zabbix-java-gateway
java-1.8.0-openjdk -y

3.启动zabbix-java-gateway

[root@linux-node1
~]# systemctl start zabbix-java-gateway

[root@linux-node1
~]# netstat -lntup|grep 10052

tcp6       00 :::10052:::*                    LISTEN      13042/java

4.修改zabbix-server 配置文件

[root@linux-node1
~]# vim /etc/zabbix/zabbix_server.conf

JavaGateway=192.168.90.11  # java gateway地址(如果和zabbix-server装一起可以写127.0.0.1)

JavaGatewayPort=10052  #java gateway端口,默认端口10052

StartJavaPollers=5  #启动进程轮询java gateway

5.重启zabbix-server

[root@linux-node1
~]# systemctl restart zabbix-server

6.开启tomcat的远程jvm配置文件

[root@linux-node1
~]# vim /usr/local/tomcat/bin/catalina.sh­#找到自己本机tomcat路径(如果是salt来管,修改salt模板即可)

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=192.168.90.11"

7. 远程jvm配置文件解释

CATALINA_OPTS="$CATALINA_OPTS

-Dcom.sun.management.jmxremote
# #启用远程监控JMX

-Dcom.sun.management.jmxremote.port=12345
#jmx远程端口,Zabbix添加时必须一致

-Dcom.sun.management.jmxremote.authenticate=false
#不开启用户密码认证

-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.90.11" #运行tomcat服务IP(不要填写错了)

5.重启tomcat服务

[root@linux-node1
~]# /usr/local/tomcat/bin/shutdown.sh

[root@linux-node1
~]# /usr/local/tomcat/bin/startup.sh

6.zabbix添加tomcat主机,并添加Zabbix自带java监控模板,如图4-10、图4-11、图4-12

图4-10

图4-11

图4-12

9.查看图形,如图4-13

图4-13

10.自带的监控可能无法满足企业需求,大家可以根据公司的业务定制不同的JVM监控模板。

1.3.6Redis监控

Redis使用自带的INFO命令,进行状态监控。以一种易于解释且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。

1.配置所有Agent(标准化目录结构)

[root@linux-node1
~]# vim /etc/zabbix/zabbix_agentd.conf #编辑配置文件引用key

Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@linux-node1
~]# mkdir /etc/zabbix/scripts #存放Shell脚本

2.编写Shell脚本

q   脚本端口、连接redis服务地址根据具体情况进行修改

q   AUTH认证没有开启,将PASSWD修改为空即可。

[root@linux-node1
~]# cd /etc/zabbix/scripts

[root@linux-node1
scripts]# vim redis_status.sh

#!/bin/bash

############################################################

#
$Name:         redis_status.sh

#
$Version:      v1.0

#
$Function:     Redis Status

#
$Author:       xuliangwei

#
$organization: www.xuliangwei.com

#
$Create Date:  2016-06-23

#
$Description:  Monitor Redis Service
Status

############################################################

R_COMMAND="$1"

R_PORT="6379"  #根据实际情况调整端口

R_SERVER="127.0.0.1"  #根据具体情况调整IP地址

PASSWD="123"       #如果没有设置Redis密码,为空即可

redis_status(){

(echo -en "AUTH
$PASSWD\r\nINFO\r\n";sleep 1;) | /usr/bin/nc "$R_SERVER"
"$R_PORT" > /tmp/redis_"$R_PORT".tmp

REDIS_STAT_VALUE=$(grep
"$R_COMMAND:" /tmp/redis_"$R_PORT".tmp | cut -d ':' -f2)

echo "$REDIS_STAT_VALUE"

}

case
$R_COMMAND in

used_cpu_user_children)

redis_status "$R_PORT"
"$R_COMMAND"

;;

used_cpu_sys)

redis_status "$R_PORT" "$R_COMMAND"

;;

total_commands_processed)

redis_status "$R_PORT"
"$R_COMMAND"

;;

role)

redis_status "$R_PORT"
"$R_COMMAND"

;;

lru_clock)

redis_status "$R_PORT"
"$R_COMMAND"

;;

latest_fork_usec)

redis_status "$R_PORT"
"$R_COMMAND"

;;

keyspace_misses)

redis_status "$R_PORT"
"$R_COMMAND"

;;

keyspace_hits)

redis_status "$R_PORT"
"$R_COMMAND"

;;

keys)

redis_status "$R_PORT"
"$R_COMMAND"

;;

expires)

redis_status "$R_PORT"
"$R_COMMAND"

;;

expired_keys)

redis_status "$R_PORT"
"$R_COMMAND"

;;

evicted_keys)

redis_status "$R_PORT"
"$R_COMMAND"

;;

connected_clients)

redis_status "$R_PORT"
"$R_COMMAND"

;;

changes_since_last_save)

redis_status "$R_PORT"
"$R_COMMAND"

;;

blocked_clients)

redis_status "$R_PORT"
"$R_COMMAND"

;;

bgsave_in_progress)

redis_status "$R_PORT"
"$R_COMMAND"

;;

bgrewriteaof_in_progress)

redis_status "$R_PORT"
"$R_COMMAND"

;;

used_memory_peak)

redis_status "$R_PORT"
"$R_COMMAND"

;;

used_memory)

redis_status "$R_PORT"
"$R_COMMAND"

;;

used_cpu_user)

redis_status "$R_PORT"
"$R_COMMAND"

;;

used_cpu_sys_children)

redis_status "$R_PORT"
"$R_COMMAND"

;;

total_connections_received)

redis_status "$R_PORT"
"$R_COMMAND"

;;

*)

echo $"USAGE:$0 {used_cpu_user_children|used_cpu_sys|total_commands_processed|role|lru_clock|latest_fork_usec|keyspace_misses|keyspace_hits|keys|expires|expired_keys|connected_clients|changes_since_last_save|blocked_clients|bgrewriteaof_in_progress|used_memory_peak|used_memory|used_cpu_user|used_cpu_sys_children|total_connections_received}"

esac

Redis状态解释:

server
: Redis
服务器信息,包含以下域:

redis_version
: Redis 服务器版本

redis_git_sha1
: Git SHA1

redis_git_dirty
: Git dirty flag

os
: Redis 服务器的宿主操作系统

arch_bits
: 架构(32 或 64 位)

multiplexing_api
: Redis 所使用的事件处理机制

gcc_version
: 编译 Redis 时所使用的 GCC 版本

process_id
: 服务器进程的 PID

run_id
: Redis 服务器的随机标识符(用于 Sentinel 和集群)

tcp_port
: TCP/IP 监听端口

uptime_in_seconds
: 自 Redis 服务器启动以来,经过的秒数

uptime_in_days
: 自 Redis 服务器启动以来,经过的天数

lru_clock
: 以分钟为单位进行自增的时钟,用于 LRU 管理

clients
:
已连接客户端信息,包含以下域:

connected_clients
: 已连接客户端的数量(不包括通过从属服务器连接的客户端)

client_longest_output_list
: 当前连接的客户端当中,最长的输出列表

client_longest_input_buf
: 当前连接的客户端当中,最大输入缓存

blocked_clients
: 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量

memory
:
内存信息,包含以下域:

used_memory
: 由 Redis 分配器分配的内存总量,以字节(byte)为单位

used_memory_human
: 以人类可读的格式返回 Redis 分配的内存总量

used_memory_rss
: 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。

used_memory_peak
: Redis 的内存消耗峰值(以字节为单位)

used_memory_peak_human
: 以人类可读的格式返回 Redis 的内存消耗峰值

used_memory_lua
: Lua 引擎所使用的内存大小(以字节为单位)

mem_fragmentation_ratio
: used_memory_rss 和 used_memory 之间的比率

persistence
: RDB
AOF
的相关信息

stats
: 一般统计信息

replication
: 主/从复制信息

cpu
: CPU 计算量统计信息

commandstats
: Redis 命令统计信息

cluster
: Redis 集群信息

keyspace
: 数据库相关的统计信息

参数还可以是下面这两个:

all
: 返回所有信息

default
: 返回默认选择的信息

当不带参数直接调用 INFO 命令时,使用 default 作为默认参数。

3.给脚本添加执行权限

[root@linux-node1
scripts]# chmod +x redis_status.sh

4.Zabbix权限不足处理办法

[root@linux-node1
~]# rm -f /tmp/redis_6379.tmp

5.key的redis_status.conf的子配置文件如下:

[root@linux-node1
~]# cat /etc/zabbix/zabbix_agentd.d/redis_status.conf

UserParameter=redis_status[*],/bin/bash
/etc/zabbix/scripts/redis_status.sh "$1"

6.重启zabbix-agent

[root@linux-node1
~]# systemctl restart  zabbix-agent

7.测试一定使用Zabbix_get来获取值

[root@linux-node1
~]# zabbix_get -s 192.168.90.11 -k redis_status[used_cpu_sys]

16.81

8.展示所有Key(记得将模板关联主机)如图4-14

图4-14

9.查看图形,如图4-15、图4-16(图形自定义)

图4-15

图4-16

1.3.7Memcached监控

1.3.8RabbitMQ监控

1.4WEB监控

Web监控是用来监控Web程序的,通过模拟用户访问网站,对特定的结果进行比较,下载速度、响应时间、返回状态码、返回字符串等特定的数据进行比较和监控,从而判断网站的Web服务的可用性。其实这些操作我们可以通过脚本、程序来进行自定义监控。如:Linux下的curl命令、以及现有的程序和http库都可以帮我们完成这项需求。

了解监控性能指标如表4-1

监控项

特征

解释说明

HTTP响应速度

服务器性能

网络速度

缓存和压缩

对特定的指标进行抽样监控,即使发现服务的可用性和性能指标

HTTP下载速度

对特定的文件抽样下载

HTTP状态码

重点监控40X、50X

404空连接是影响性能的一个重要指标,50X表示服务器内部故障

表4-1

以监控Zabbix的web程序为例展开监控,展示如何使用Web minitoring

1.单击Configuration→Templates→点击Web→Create Web scanario,创建一个Scenario(可以在host或者templates上创建)如图4-17

图4-17

2.单击Create web Scenario 出现如图4-18界面

图4-18

其中各参数含义:

q   Name:Web监控的名称,具有唯一性。(支持使用宏)。

q   Application:选择Web监控属于哪个组。

q   New Application:创建新的组。

q   Update interval:Scenari间隔的时间,单位是秒。

q   Attempts:重试次数。

q   Agent:浏览器类型,支持自定义。

q   HTTP proxy:HTTP代理格式,端口使用1080

q   Variables:Scenario的变量。

q   Headers:标题

3.steps表示可以按步骤设置多个监控项,如图4-19是添加Steps的监控项。

图4-19

其中,各参数的含义如下:

Name:名称。

URL:监控的web页面(全路径带页面名)。

Post:传递给页面的参数,多个参数之间用&连接。(可以引用定义好的变量)。

Variables:设置变量。

Timeout:超时时间。

Required string:页面中嗯那个匹配到字符,若不匹配,则认为出错。

Required Status code:页面返回码。

如果有多个Url,依次添加,如图4-20

图4-20

4.Authentication认证,Zabbix登陆需要用户名密码,如图4-21

图4-21

5.添加好后的监控数据,点击Monitoring→Web(不要忘记将模板link到一台主机)如图4-22

图4-22

6.创建web 主页返回时间的触发器Configration→template(对应web监控模板)→trigger→create
trigger(Zabbix的web监控自带itme)如图4-23

图4-23

1.5流量分析

piwik(开源产品)、google分析、百度统计、站长工具等等一堆统计的东西,只需要在页面嵌入一个js即可。

流量分析对于一家电商公司来说,通过对订单来源的统计和分析,可以了解我们在某个网站上的广告投入有没有收到预期的效果。可以区分不同地区的访问人数、甚至商品交易额等。

作为一名运维工程师很有必要掌握公司站点的各种访问详情。

作为运维人员应该注意的问题? 例如:现在有一个在一个活动产品上线?

1.了解业务部门此次产品上线时间以及推广费用为多少,然后调整机房服务器带宽流量

2.
查看没有上线和上线之后网站的pv 、uv、ip数目,结合piwik 和zabbix截图分析

3.上线之后了解业务部门订单数量,增长率等等

4.查看数据库和前端web是否有性能瓶颈

1.6网络监控

网络监控是我们构建监控平台是必须要考虑的,尤其是针对有多个机房的场景,各个机房之间的网络状态,机房和全国各地的网络状态都是我们需要重点关注的对象,那么如何掌握这些状态信息呢?我们需要借助于网络监控工具Smokeping。

Smokeping 是rrdtool的作者Tobi Oetiker的作品,是用Perl写的,主要是监视网络性能,www 服务器性能,dns查询性能等,使用rrdtool绘图,而且支持分布式,直接从多个agent进行数据的汇总。

同时,由于自己监控点比较少,还可以借助很多商业的监控工具,比如监控宝、基调、博瑞等。同时这些服务提供商还可以帮助你监控CDN的状态。

1.7安全监控

针对四层物理设备可以使用iptables、以及硬件防火墙。云环境可以直接使用自带防火墙功能。

针对七层Web层面通过Nginx + Lua编写了一个WAF,然后把相关的日志记录到了Elasticsearch中,通过kibana可以图形化的展示不同的攻击类型的统计。

同时可以使用安全产品,放DDOS攻击,安全保、百度加速乐,牛盾云安全。等等。

1.8日志监控

通常情况下,系统会产生系统日志、应用程序会有应用的访问日志、错误日志,服务有运行日志等,可以使用ELK来进行日志监控。

对于日志来说,最常见的需求就是收集、存储、查询、展示,开源社区正好有相对应的开源项目:

logstash(收集)

elasticsearch(存储+搜索)

kibana(展示)

我们将这三个组合起来的技术称之为ELK Stack,所以说ELK Stack指的是Elasticsearch、Logstash、Kibana技术栈的结合。

如果收集了错误日志,那么如果部署更新有异常出现,可以立即在kibana上看到。当然也可以使用Zabbix来进行错误日志的过滤来进行告警。

1.9业务监控

小王再去向经理汇报,刚走到门口被总经理碰上了,张总说:小王啊,你们经理汇报你最近监控工作干的不错,你给我说下,咱们现在10点的时候总订单是多少,每分钟平均订单有多少?

小王又蒙了,我自己也曾经就是那个小王!

没有业务指标监控的监控平台是一个不完善的监控平台,通常在我们做监控系统中,必须将我们重要的业务指标进行监控,并设置阈值进行告警通知。

比如每分钟的订单、每分钟注册、日活用户、短信使用量等重要的业务指标都可以加入到Zabbix上。

1.10可视化监控

经过小王的各种努力,终于一个相对完善的监控平台使用Zabbix构建起来了,小王为此还做一个漂亮的screen,来进行展示,但是有一天突然订单量特别少,张总又一次到了运维部,但失望而归,因为整个监控体系并不能反映出来订单量为什么减少了?

运维的重要目标之一就是数据的可视化,一个监控平台不能很好的反映出来业务的波动,就是耍流氓。之前的一切努力在业务部门的领导中变得一文不值!!!我们能做的有以下几点:

面向传统运维:

尽可能的完善业务监控,如果有专门的业务分析系统,要想办法和运维的监控平台进行结合。

梳理清楚各个子系统之间和业务的关系,比如如果突然间流量增加了50M,能够快速的知道这50M流量到了那个业务系统上,访问的哪些URL,以及这个业务系统的相关状态。

面向DevOps

将所有的监控项和业务之间建立关系树,比如业务、网络、系统、数据库、流量、推广活动(流量分析)之间可以形成一个庞大的关系链。这是一个比较庞大的工程,业务是多变的,如何让监控平台能尽可能的适应多变的业务是一个艰巨的任务。

第4章Zabbix监控实践的更多相关文章

  1. 第2章Zabbix基础进阶

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...

  2. Zabbix监控系统深度实践

    Zabbix监控系统深度实践(企业级分布式系统自动化运维必选利器,大规模Zabbix集群实战经验技巧总结,由浅入深全面讲解配置.设计.案例和内部原理) 姚仁捷 著  ISBN 978-7-121-24 ...

  3. 第一章 :zabbix监控

    1.1 为什么要监控 在需要的时刻,提前提醒我们服务器出问题了 当出问题之后,可以找到问题的根源   网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性(也称为可用性,英文描述为HA ...

  4. 跟着ttlsa一起学zabbix监控呗

    本章转载至:http://www.ttlsa.com/zabbix/follow-ttlsa-to-study-zabbix/ 虽然接触zabbix时间很长,但是中间相当一段时间没去配置,这次算是重新 ...

  5. zabbix 监控特定进程

    因为一些server上跑着一些重要程序,须要对它们进行监控,公司用的是zabbix监控,之前都是在zabbix中加入自己定义脚本对特定程序进行监控,近期看了zabbix的官方文档,发现原来强大的zab ...

  6. yum部署、使用 zabbix监控 - 详细过程

    yum部署zabbix监控 第1章 yum部署zabbix服务端... 1 1.1 命令行部署... 1 1.1.1 yum源配置-解释... 2 1.1.2 MariaDB 与 mysql 3 1. ...

  7. zabbix监控实战<1>

    第一章 监控家族 1.1 为什么选择监控? 因为在一个IT集群中或者是一个大环境中,包括各种硬件设备.软件设备等系统的构成也是极其复杂的. 多种应用构成负载的IT业务系统,保证这些资源的正常运转,是一 ...

  8. 使用 Zabbix 监控 Jenkins

    笔者最近的工作涉及到使用 Zabbix 监控 Jenkins.在谷歌上搜索到的文章非常少,能操作的就更少了.所以决定写一篇文章介绍如何使用 Zabbix 监控 Jenkins. 下图为整体架构图: 整 ...

  9. zabbix监控mysql最简单的方法

    该实验基于我的上一篇文章监控第一台主机的基础上 首先,因为水平有限,我选择直接关闭了防火墙和SELinux. 环境: 两台centos7,服务器端IP是192.168.200.128(以下简称主机), ...

随机推荐

  1. 初探Lambda表达式/Java多核编程【3】Lambda语法与作用域

    接上一篇:初探Lambda表达式/Java多核编程[2]并行与组合行为 本节是第二章开篇,前一章已经浅显地将所有新概念点到,书中剩下的部分将对这些概念做一个基础知识的补充与深入探讨实践. 本章将介绍L ...

  2. java数组、泛型、集合在多态中的使用及对比

    我们在使用数组,泛型集合的过程中不可避免的会碰到多态,或者说什么情况下能如何使用父数组引用子数组(集合.泛型)呢? 数组在多态中的使用 元素为父类型的数组引用可指向元素为子类型的数组对象 当数组被调用 ...

  3. PDO预处理语句规避SQL注入攻击

    所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存 ...

  4. 深入简出的nginx

    深入简出的nginx hosts的简单介绍 nginx的简单介绍 hosts介绍 谈到nginx我们不得不说hosts hosts的存放在C:\Windows\System32\drivers\etc ...

  5. MES项目参观交流会

    2016年11月10日,普实软件组织了河南蔚林.江苏正恺.吴通控股.上海锐拓等单位的26位企业家代表,走进科兴电器,开展企业家现场交流活动.企业家们参观了科兴花园式数字化工厂.感受了大数据中心的强大功 ...

  6. 浅谈Linux下如何修改IP

    linux 下命令之浅谈//cd ..  //返回上一级//创建文件夹touch test.txt//Linux不区分大小写//往一个文件中追加内容echo "****" > ...

  7. tp框架的详细介绍,tp框架基础

    php框架 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一 ...

  8. 【DOORS】如何基于DOORS实施需求管理

    引言 IBM Rational DOORS,简称DOORS,是被业界广泛认可的需求管理工具,在国内外需求管理领域具有较高的市场占有率.需求管理作为传统的工程领域,理论发展相对成熟和健全.随着越来越多的 ...

  9. hdoj 1257 DP||贪心

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. 导航栏转场动画CATransition

    CATransition动画来实现, 下面的代码是跳转到下一个视图: CATransition *animation = [CATransition animation]; [animation se ...