硬件監控: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。
IO:IO分為磁盤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 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.編寫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:
將所有的監控項和業務之間建立關系樹,比如業務、網絡、系統、數據庫、流量、推廣活動(流量分析)之間可以形成一個龐大的關系鏈。這是一個比較龐大的工程,業務是多變的,如何讓監控平台能盡可能的適應多變的業務是一個艱巨的任務。