第4章Zabbix監控實踐

硬件監控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硬件監控

通常我們的服務器上都會有遠程控制卡,如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(記得將模板關聯主機)

image.png

 4-1

6.查看圖形(圖形是自定義)

image.png

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 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.編寫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

image.png

4-3

9.查看圖形,如圖4-4(圖形自定義)

image.png

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

image.png

4-5

8.查看圖形,如圖4-4(圖形自定義)

image.png

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官網提供的模板

image.png

4-7

 

image.png

4-8

10.導入後將模板應用於主機,如圖4-9

image.png

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

image.png

4-10

image.png

4-11

image.png

4-12

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

image.png

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

image.png

4-14

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

image.png

4-15

image.png

4-16

1.4WEB監控

Web監控是用來監控Web程序的,通過模擬用戶訪問網站,對特定的結果進行比較,下載速度、響應時間、返回狀態碼、返回字符串等特定的數據進行比較和監控,從而判斷網站的Web服務的可用性。其實這些操作我們可以通過腳本、程序來進行自定義監控。如:Linux下的curl命令、以及現有的程序和http庫都可以幫我們完成這項需求。

瞭解監控性能指標如表4-1

特徵

釋說

HTTP速度

器性能

速度

存和壓縮

特定的指標進行抽樣監控,即使發現的可用性和性能指

HTTP速度


特定的文件抽

HTTP態碼

重點40X、50X

404接是影響性能的一個重要指,50X表示服器內部故障

4-1

以監控Zabbixweb程序爲例展開監控,展示如何使用Web minitoring

1.單擊ConfigurationTemplates→點擊WebCreate Web scanario,創建一個Scenario(可以在host或者templates上創建)如圖4-17

image.png

4-17

2.單擊Create web Scenario 出現如圖4-18界面

image.png

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的監控項。

image.png

4-19

其中,各參數的含義如下:

Name:名稱。

URL:監控的web頁面(全路徑帶頁面名)

Post:傳遞給頁面的參數,多個參數之間用&連接。(可以引用定義好的變量)

Variables:設置變量。

Timeout:超時時間。

Required string:頁面中嗯那個匹配到字符,若不匹配,則認爲出錯。

Required Status code:頁面返回碼。

如果有多個Url,依次添加,如圖4-20

image.png

4-20

4.Authentication認證,Zabbix登陸需要用戶名密碼,如圖4-21

image.png

4-21

5.添加好後的監控數據,點擊MonitoringWeb(不要忘記將模板link到一臺主機)如圖4-22

image.png

4-22

6.創建web 主頁返回時間的觸發器Configrationtemplate(對應web監控模板)triggercreate triggerZabbixweb監控自帶itme)如圖4-23

image.png

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

將所有的監控項和業務之間建立關係樹,比如業務、網絡、系統、數據庫、流量、推廣活動(流量分析)之間可以形成一個龐大的關係鏈。這是一個比較龐大的工程,業務是多變的,如何讓監控平臺能儘可能的適應多變的業務是一個艱鉅的任務。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章