第4章Zabbix监控实践

硬件监控Zabbix IPMI Interfacephp

系统监控Zabbix Agent Interface前端

Java监控Zabbix JMX Interfacejava

网络设备监控Zabbix SNMP Interfacenode

应用服务监控Zabbix Agent UserParametermysql

MySQL数据库监控percona-monitoring-plulginslinux

URL监控Zabbix Web 监控ios

这一会儿把以前干的工做全集成到一个平台上了。并且以前编写的全部的应用服务的监控脚本,简单修改就可使用。nginx

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

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

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

1.1硬件监控

一般咱们的服务器上都会有远程控制卡,如DelliDRAC,HPILOIBMIMM等,能够经过Web界面来进行硬件的监控和管理工做,若是购买企业级的受权,还可使用控制台进行管理。

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

故障回想:以前我司托管在北京某机房的设备就出现过,由于恰好所在机柜区域的空调坏了,致使服务器温度太高,而后系统宕机。

1.2系统监控

系统监控标准(CPU、内存、硬盘、网络、进程、TCP链接数)能够经过  基础模板Template OS Linux(彻底足够) 来监控,根据本身的业务来调整合适的触发器以及图形等,便可。

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

一般状况下,每一个处理器的运行队列要小于等于3CPU 利用率中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.keylinux_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.完成后,将模板导出保存,方便之后二次使用,这辈子在也不用添加11Key了。

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.confServer标签中添加以下内容(若是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 connectionsNginx正处理的活动连接数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.编写NginxShell脚本(若是端口不一致,只须要修改脚本端口便可)

[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.keynginx_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 #启动日志,若是reloadfpm,时间会更新

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-fpmShell脚本(若是端口不一致,只须要修改脚本端口便可)

[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.keyphpfpm_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-GatewayJMXJava程序之间通讯获取数据

JMXZabbix中的运行流程:

a)Zabbix-ServerZabbix-Java-Gateway获取Java数据

b)Zabbix-Java-GatewayJava程序(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 : 正在等待阻塞命令(BLPOPBRPOPBRPOPLPUSH)的客户端的数量

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.keyredis_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态码

重点40X50X

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

4-1

以监控Zabbixweb程序为例展开监控,展现如何使用Web minitoring

1.单击ConfigurationTemplates→点击WebCreate Web scanario,建立一个Scenario(能够在host或者templates上建立)如图4-17

4-17

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

4-18

其中各参数含义:

q   NameWeb监控的名称,具备惟一性。(支持使用宏)

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

q   New Application:建立新的组。

q   Update intervalScenari间隔的时间,单位是秒。

q   Attempts:重试次数。

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

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

q   VariablesScenario的变量。

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.添加好后的监控数据,点击MonitoringWeb(不要忘记将模板link到一台主机)如图4-22

4-22

6.建立web 主页返回时间的触发器Configrationtemplate(对应web监控模板)triggercreate triggerZabbixweb监控自带itme)如图4-23

4-23

1.5流量分析

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

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

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

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

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

2. 查看没有上线和上线以后网站的pv uvip数目,结合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指的是ElasticsearchLogstashKibana技术栈的结合。

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

1.9业务监控

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

小王又蒙了,我本身也曾经就是那个小王!

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

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

1.10可视化监控

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

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

面向传统运维:

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

梳理清楚各个子系统之间和业务的关系,好比若是忽然间流量增长了50M,可以快速的知道这50M流量到了那个业务系统上,访问的哪些URL,以及这个业务系统的相关状态。

面向DevOps

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

相关文章
相关标签/搜索