中小企業Zabbix監控生產案例實踐


1、Zabbix監控介紹

一、Zabbix的功能概述php


1.1 zabbix是什麼html

Zabbix是一個企業級的、開源的、分佈式的監控套件。前端

Zabbix能夠對網絡和服務進行監控。Zabbix利用靈活的告警機制,可實現微信java

短信和郵件的自動報警。Zabbix利用存儲的監控數據提供監控報告及實現圖形化顯示node


1.2 zabbix特性mysql

Zabbix是一個高度集成的網絡監控套件,經過一個軟件包便可提供以下特性linux


數據收集

  • 可用性及性能檢測nginx

  • 支持SNMP(trapping及polling)、IPMI、JMX監控web

  • 自定義檢測redis

  • 自定義間隔收集收據

  • server/proxy/agents實現分佈監控環境

靈活的閥值定義

  • 容許靈活地自定義故障閥值,Zabbix中稱爲觸發器(trigger), 存儲在後端數據庫中

高級告警配置

  • 能夠自定義告警升級(escalation)、接收者及告警方式

  • 告警信息能夠配置並容許使用宏(macro)變量

  • 經過遠程命令實行自動化動做(action)

實時繪圖

  • 經過內置的繪圖引擎實現監控數據實時繪圖

擴展的圖形化顯示

  • 容許自定義建立多監控項視圖

  • 網絡拓撲(network maps)

  • 自定義的面板(screen)和slide shows,並容許在dashboard頁面顯示

  • 報告

  • 高等級(商業)監控資源

歷史數據存儲

  • 數據存儲在數據庫中

  • 歷史數據可配置

  • 內置數據清理機制

配置簡單

  • 主機經過添加監控設備方式添加

  • 一次配置,終生監控(除非調整或刪除)

  • 監控設備容許使用模板

模板使用

  • 模板中能夠添加組監控

  • 模板容許繼承

網絡自動發現

  • 自動發現網絡設備

  • agent自動註冊

  • 自動發現文件系統、網卡設備、SNMP OID等

快速的web接口

  • web前端採用php編寫

  • 訪問無障礙

  • 你想怎麼作就能作麼作

  • 審計日誌

Zabbix API

  • Zabbix API提供程序級別的訪問接口,第三方程序能夠很快接入

權限系統

  • 安全的權限認證

  • 用戶能夠限制容許維護的列表

全特性、agent易擴展

  • 在監控目標上部署

  • 支持Linux及Windows

二進制守護進程

  • C開發,高性能,低內存消耗

  • 易移植


1.3 Zabbix功能


監控拓撲圖說明:

(1)能夠經過微信、短信、郵件實現自動報警機制

(2)能夠經過Web頁面進行配置,監控狀態查看

(3)能夠經過SNMP協議實現對打印機、路由器、交換機的設備的監控


對主機可監控項包括:

CPU:CPU負載,CPU使用率

Memory:內存使用率,可交換內存/虛擬內存使用率

Network:網絡傳輸、網絡故障、丟包

Disk:磁盤使用率,磁盤I/O

Service:進程監控、界面服務、TCP端口鏈接,響應時間、DNS監控、NTP監控

Log:日誌監控,文本日誌,事件日誌

File:文件監控

Other:性能計數器(僅限於Windows系統)


自定義報警機制:

若是故障在10分鐘沒有被解決,能夠短信或郵件通知系統管理員

若是故障在15分鐘沒有被解決,能夠短信或郵件通知運維人員

若是故障在30分鐘沒有被解決,能夠短信或郵件通知經理


能夠經過proxy代理服務器

代理Zabbix server蒐集被監控的監控數據,並統一發送到Server端


二、zabbix程序架構

架構圖以下:

wKiom1kahWKTkP4EAAmjWcTJDho579.png-wh_50


2.1 Zabbix各組件的說明:

Zabbix Server

Zabbix Server爲核心組件,用來獲取agent存活情況及監控數據

全部的配置、統計、操做數據均經過Server進行存取到database

Zabbix database

全部的Zabbix數據均存儲在數據庫中

Web GUI

爲了更簡單的無障礙的訪問Zabbix, 因此提供了web接口

該接口做爲Zabbix Server的一部分,一般和server運行在同一臺主機上


注意:若是採用SQLite做爲數據庫,web接口和Zabbix Server必須運行在同一臺主機上

Proxy

Zabbix Proxy可以代替Zabbix Server進行性能及可用性數據採集

Proxy是Zabbix部署的可選組件。 若是想分擔單一Zabbix Server負載,推薦使用proxy

Agent

Zabbix agents 部署在目標監控機上並監控本地資源和應用,將收集數據彙報給Zabbix Server

監控流程:

經過zabbix監控數據流,並採起相應的措施。

首先要建立一個host,再建立一個item來蒐集數據

經過item來建立觸發器(trigger)

經過觸發器(trigger)來建立一個動做(action)


2.2 Zabbix各組件結構圖:

wKiom1kahXngA9oLAACHGpy92l8365.png-wh_50


2.3 Zabbix相關術語:


相關名詞解釋:

主機(host)

一個你想監控的網絡設備(須要知道IP/DNS)

主機組(host group)

一個邏輯的主機組,它包含主機和模板

主機和模板在同一個主機內的話模板不能被link到其餘上。主機組一般用於給不一樣的用戶組建立訪問權限

監控項(item)

你想從主機中收集到的數據

觸發器(trigger)

一個邏輯表達式,用來表達從監控項獲取的數據達到了預設的故障閥值

當接收到的監控值達到了預設的閥值

則觸發器狀態由’OK’變動爲’Problem’,當收到的監控值低於閥值,則狀態保持/變動爲’OK’

事件(event)

一個事情發生如觸發器狀態變動或一個自動發現(discovery)/agent自動註冊等

動做(action)

當一個事件發生時預設的處理過程

一個動做(action)包括操做(operations,如發送告警)和條件(當指定的操做完成)

告警升級(escalation)

在動做中一個自定的操做執行過程,一個發送告警/執行遠程命令的隊列

媒介(media)

發送告警的渠道

告警(notification)

經過媒介(media)渠道發送事件的消息

遠程命令(remote command)

當監控主機達到某些條件(condition)後預設的自動執行的命令

模板(template)

一組包含監控項、觸發器、繪圖、面板(screen)、應用、低級別自動發現規則等

而且能被其餘主機應用的實體模板可以提高主機部署監控任務的速度

同時也很是容易對監控任務作批量(mass)更新。模板被主機連接(link)

應用(application)

監控項邏輯組

web方案(scenario)

對一個web站點可用性進行檢查的一個或多個http請求

前端(frontend)

Zabbix提供的web接口

Zabbix API

Zabbix API容許經過JSON RPC協議去建立、更新

得到Zabbix對象(如主機、監控項、繪圖等等)以及完成自定義任務

Zabbix server

Zabbix軟件中心進程

用於連通Zabbix proxy及agent完成監控、評估觸發器、發送告警以及中心數據存儲

Zabbix agent

部署在監控主機上的進程,用於監控本地資源和應用

Zabbix proxy

替代Zabbix server完成數據收集的進程,一般用於下降中心Zabbix Server的負載

節點(node)

一套完整的Zabbix server配置,一般位於分佈式系統中,用於負責本區域的監控


2.4 Zabbix工做流程介紹:


Server

Zabbix server是Zabbix軟件的核心進程


Server經過polling和trapping採集數據來判斷是否達到閥值,從而使用觸發器發送報警給用戶

Server也能夠經過簡單服務檢查(simple service check)來完成遠程網絡服務檢測

Server既是保存全部配置、統計和操做數據的數據庫,也是故障報警服務


Zabbix server根據不一樣功能可劃分爲三個部分:Zabbix server、Web GUI及Database

因爲Zabbix的全部的配置信息保存在數據庫中,server和web GUI能夠直接進行操做

好比,經過Web界面(或者API)建立一個新的監控項時,它將建立的數據插入數據庫

一分鐘左右Zabbix server會查詢監控項數據表

並將查詢的監控項列表保存在本身的緩存(cache)中

這也是爲何經過Zabbix前端進行的變動將在兩分鐘左右生效的緣由


Zabbix server以守護(daemon)進程方式運行

Zabbix server默認要求運行在非root帳戶下


若是Zabbix server和agent運行在同一臺主機上

建議分別運行在不一樣的用戶下,由於一旦運行的同一個用戶下

agent將能夠訪問server的配置文件

而且可以輕鬆取得Zabbix Admin級別用戶,例如:數據庫密碼


Agent

Zabbix agent部署在被監控主機上用來監控本地資源和應用(如硬盤、內存、處理器等)


Zabbix agent收集本地主機運行信息並將數據發送給Zabbix server進行處理

一旦出現異常(如硬盤滿或服務進程中斷),Zabbix server會自動響應並進行報警操做

Zabbix agent利用本地系統調用完成統計信息收集,所以它很是的高效


被動(passive)和主動(active)檢查


Zabbix agent提供被動和主動查方式

被動檢查模式中agent應答數據請求,Zabbix server或者proxy詢問agent數據

如CPU load,而後Zabbix agent回送結果給server


主動檢查 處理過程將相對複雜

agent必須先進行一次請求Zabbix server索取監控項列表,而後發送對應的值給server

選擇是被動仍是主動檢查,須要在監控項類型 中選擇

’Zabbix agent’或者’Zabbix agent (active)’


Zabbix agent運行在被監控主機上,能夠經過守護進行的方式運行

Zabbix agent通常要求運行在非root帳戶下

若是你在’root’帳戶下啓動Zabbix agent,它將自動選擇

在操做系統中創建的’zabbix’用戶,除非你修改agent配置文件中’AllowRoot’參數


代理proxy


Zabbix代理(proxy)一般用於替代server收集監控信息並將數據發送給Zabbix server

所收集數據會先存儲在代理主機的緩存中而後傳送給Zabbix server


代理是可選的,不過使用它能夠有效的下降分佈式環境中單一的Zabbix server負載

經過代理去收集監控數據,server能夠有效下降CPU和磁盤I/O消耗


Zabbix代理能夠出色的完成遠程區域、分支機構、無本地管理員的網絡的集中監控

Zabbix代理使用獨立的數據庫


注意:

Zabbix proxy數據庫可使用SQLite, MySQL, PostgreSQL

若是Oracle或IBM DB2在低等級自動發現規則時存在限制和風險


Zabbix proxy做爲守護進程運行。

Zabbix proxy通常要求運行在非root帳戶下


若是在’root’帳戶運行

它將自動選擇以前已經在操做系統創建的’zabbix’用戶,可是沒法在編譯時或在配置文件中進行配置


2、項目規劃架構方案

wKiom1kahtPzDNntAAEbd1udh5k278.png-wh_50

2.1 主機分組

交換機 
Nginx 
Tomcat 
Mysql

2.2 監控對象識別

使用SNMP監控交換機 
使用IPMI監控服務器硬件 
使用Agent監控服務器 
使用JMX監控java 
監控Nginx狀態 
監控Mysql 
監控Web狀態


3、Zabbix監控實踐

3.1 SNMP監控網絡設備

3.1.1交換機上開始SNMP

config t
snmp-server community public ro

3.1.2在zabbix上添加監控

設置SNMP interfaces

3.1.3關聯監控模板

選擇默認的Template-SNMP-device

(網絡設備,能夠監控交換機,路由器和防火牆等;模板裏面item使用了宏,以下圖 

wKioL1kah-zw9PdgAAEGAl5jDYE725.png-wh_50

因此主機裏面要設置宏,替代默認的模板中的宏,配置網絡設備時,團體名命名爲下面的名字 

wKiom1kah7DDkjtWAAFttExFduo876.png-wh_50

3.2 添加硬件監控(服務器IPMI)

  • 經驗:直接用IPMI監控,常常獲取不到數據,模板自帶的item也不可能不適合真正的服務器

  • 推薦:使用自定義item,本地執行ipmitool命令監控獲取數據,能夠用來監控服務器風扇轉速

3.3 添加系統監控

使用zabbix agent監控,略

3.4 添加應用監控

3.4.1 JAVA應用

使用JXM模式+java_gateway代理監控 
java_gateway能夠運行在任何服務器上,是一個單獨的服務 

wKioL1kaiVTwujcEAAFWg3I0acw241.png-wh_50
1)安裝zabbix-java-gateway

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

2)配置zabbix_java_gateway,其實什麼都不用改

[root@linux-node1 ~]# vim /etc/zannox/zabbix_java_gateway

3)啓動zabbix_java_gateway,檢查端口和進程

[root@linux-node1 ~]# systemctl start zabbix-java-gateway
[root@linux-node1 ~]# ps -ef|grep java
[root@linux-node1 ~]# netstat -lntup|grep 10052

4)告訴zabbix-server服務器,javaGateway服務器的位置,重啓server 
5)開啓jmx遠程監控

[root@linux-node2 ~]# vim /usr/local/tomcat/bin/catalina.sh
 CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
 -Dcom.sun.management.jmxremote.port=8888
 -Dcom.sun.management.jmxremote.ssl=false
 -Dcom.sun.management.jmxremote.authenticate=false
 -Djava.rmi.server.hostname=192.168.56.12"
[root@linux-node2 ~]# /usr/local/tomcat/bin/shutdown.sh 
[root@linux-node2 ~]# /usr/local/tomcat/bin/startup.sh

6)在zabbix-server上添加tomcat的主機

並鏈接Template-JMX-Generic模板,選擇JMX interfaces

wKioL1kaiX2SxlzCAAHaViaWWrs694.png-wh_50

3.4.2 Nginx應用

1)開啓nginx監控 
在nginx配置文件中添加一個location,只容許本地訪問

location /nginx_status {
         stub_status on;
         access_log off;
         allow 127.0.0.1;
         deny all
}

2)編寫腳原本進行數據採集(此腳本能夠用來監控redis,memcached,nginx,tcp-status)

[root@linux-node1 ~]# vim redis-memcached-nginx-tcp.sh 
#!/bin/bash
############################################################
# $Name:         zabbix_linux_plugins.sh
# $Version:      v1.0
# $Function:     zabbix plugins
# $Description:  Monitor Linux Service Status
############################################################
tcp_status_fun(){
        TCP_STAT=$1
        #netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,state[key]}' > /tmp/netstat.tmp
        ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/netstat.tmp
        TCP_STAT_VALUE=$(grep "$TCP_STAT" /tmp/netstat.tmp | cut -d ' ' -f2)
        if [ -z $TCP_STAT_VALUE ];then
                TCP_STAT_VALUE=0
        fi
        echo $TCP_STAT_VALUE
}

nginx_status_fun(){
        NGINX_PORT=$1
        NGINX_COMMAND=$2
        nginx_active(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
        }
        nginx_reading(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
       }
        nginx_writing(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
       }
        nginx_waiting(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
       }
        nginx_accepts(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
       }
        nginx_handled(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
       }
        nginx_requests(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{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;
                esac 
}
memcached_status_fun(){
        M_PORT=$1
        M_COMMAND=$2
        echo -e "stats\\nquit" | nc 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND " | awk '{print $3}'
}
redis_status_fun(){
        R_PORT=$1
        R_COMMAND=$2
        (echo -en "INFO \\r\\n";sleep 1;) | nc 127.0.0.1 "$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
}
main(){
        case $1 in
                tcp_status)
                        tcp_status_fun $2;
                        ;;
                nginx_status)
                       nginx_status_fun $2 $3;
                        ;;
                memcached_status)                      memcached_status_fun $2 $3;
                        ;;
                redis_status)                       redis_status_fun $2 $3;
                        ;;
                *)
                        echo $"Usage: $0 {tcp_status key|memcached_status key|redis_status key|nginx_status key}"
        esac
}
main $1 $2 $3
[root@linux-node1 ~]# chmod +x redis-memcached-nginx-tcp.sh

添加完測試腳本是否正常

[root@linux-node1 ~]# ./redis-memcached-nginx-tcp.sh nginx_status 8080 active
101

3)設置用戶自定義參數

[root@linux-node1 ~]# vim redis-memcached-nginx-tcp.conf
UserParameter=linux_status[\\*],/etc/zabbix/zabbix_agetd.d/redis-memcached-nginx-tcp.sh "$1" "$2" "$3"

4)增長zabbix-agent配置,並經過zabbix-server測試 
修改agent配置

[root@linux-node1 ~]# Include=/etc/zabbix/zabbix_agentd.d/\\*.conf
[root@linux-node1 ~]# service zabbix-agent restart

server端get測試

[root@linux-node1 ~]# zabbix_get -s 192.168.11.11 -k linux_status[nginx_status,8080,active]
12

5)添加template,添加item,屢次克隆添加不一樣item便可 

wKiom1kaiabB10PQAAG3iL6gDmw494.png-wh_50 

6)建立圖形 

7)建立觸發器 

8)建立通用模板 

3.4.3 使用percona監控插件監控Mysql應用

學習percona請移步percona-mysql, 此原理是php鏈接mysql數據庫,shell腳本獲取數據,下面開始部署 
1)在agent端安裝模板

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

2)建立zabbix-agent的配置文件

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

3)修改agent配置並重啓

[root@linux-node1 ~]# Include=/etc/zabbix/zabbix_agentd.d/\*.conf
[root@linux-node1 ~]# service zabbix-agent restart

4)配置鏈接Mysql

<?php
$mysql_user = 'zabbix';
$mysql_pass = '123456';<

5)測試腳本是否正常,確認密碼爭取,不然會連不上mysql

[root@linux-node1 ~]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
405647

6)配置mysql

[client]
user = zabbix
password = 123456

7)使用zabbix測試腳本,返回0正常,1表明access denied

[root@linux-node1 ~]# sudo -u zabbix -H /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave
0

8)import模板,添加mysql主機關聯此模板,添加trigger,添加Graph展現

相關文章
相關標籤/搜索