一、概述
1.為什么選擇Zabbix?
Zabbix是一款能夠監控各種網絡參數以及服務器健康性和完整性的軟件。Zabbix使用靈活的通知機制,允許用戶為幾乎任何事件配置基於郵件的告警。這樣可以快速反饋服務器的問題。基於已存儲的數據,Zabbix提供了出色的報告和數據可視化功能。這些功能使得Zabbix成為容量規划的理想方案。
以上一段摘抄於Zabbix官方手冊,根據我自己的使用經驗,我認為上述描述有些含蓄,Zabbix不止能夠監控網絡參數、服務器健康等,它幾乎能監控你能想到的任何服務器、軟件或應用的任何指標,並通過觸發器和其他zabbix組件為這些指標配置及時的郵件、短信等告警,並且提供了強大的可視化功能。
就我個人來講,Zabbix只有配置底層監控腳本時需要耗費點精力,其靈活性和功能碾壓市面上絕大多數商用or開源監控軟件,並且足以作為一個大型公司的監控骨架,例如之前看到的一篇58的分布式監控產品介紹,看完之后的感想基本就是:這產品提供的功能如果用Zabbix搭我上我也行!在接下來的幾篇筆記中我也會逐一示例如何搭建一個完整的數據庫監控系統。
我從官網上隨便copy了一副Zabbix可以達到的效果圖:(zabbix的界面支持中文本例只是copy的官方示例)
2.關於Zabbix的架構
Zabbix的組件有以下幾個:
Zabbix Server、Zabbix proxy、Zabbix agent、數據庫、Zabbix web界面。
其中agent是安裝於各個被監控主機的客戶端,負責收集監控信息。server是負責接收監控信息並進行數據存儲和web頁面渲染的,proxy是可選的安裝組件可以代替server進行監控信息收集從而分擔負載或者說充當到server的跳板機,數據庫是存儲監控信息的,web頁面則是進行監控信息的展示、提供諸如添加主機、創建用戶等等的頁面操作功能。
熟悉Zabbix的數據流是靈活使用Zabbix的基礎,從上述描述可以大致知道Zabbix的數據流,這其中涉及到的一些對象名非常重要,將會貫穿整個Zabbix的配置和使用。
-
監控項(item)是server上負責接收數據信息的,其結構就是一個指定了返回數據類型的key-value,key名字自定義,對應的value就是獲取監控值的腳本命令。
-
監控項超過某個閾值之后需要告警,為了實現這種告警就需要為監控項創建觸發器(trigger),默認的trigger被觸發后告警自動顯示在儀表板(dashboard)。
-
默認告警是顯示在儀表板(dashboard)的,為了實現短信或郵件告警,就需要創建告警媒介(media types),同時還需要為用戶添加告警媒介這樣才能將告警發送至用戶的郵箱。
-
為了更好地對監控項進行分類,可以把相似的監控項放在同一個應用集(applications)中。
-
為了更好的對主機進行分類,可以將功能相同的主機放在同一個host group中。
3.本例的安裝環境
CentOS release 6.10 (Final),內核版本2.6.32-754.el6.x86_64。
Zabbix Server IP:10.0.0.200,mysql數據庫已經預先安裝,版本是5.7.26(有一些向8.0看齊的坑,建議安裝5.7.22及以下的版本)。
本例中web服務器使用LAMP環境,因此安裝httpd。
Zabbix的安裝有多種方式(rpm,容器安裝等),本例中使用可以自定義位置和啟動項的源碼安裝方式。
4.本例的主要參考網址
1.下載安裝包
wget https://nchc.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.4.15/zabbix-3.4.15.tar.gz
如果上述地址失效,到https://www.zabbix.com/download尋找相應的zabbix安裝包。
2.解壓源碼tar包,創建zabbix用戶(server、agent端都需要創建用戶)
groupadd --system zabbix
useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix
tar -zxvf zabbix-3.4.15.tar.gz
3.安裝依賴包
yum -y install pcre pcre-devel libevent libevent-devel OpenIPMI OpenIPMI-devel libssh2 libssh2-devel net-snmp-devel libcurl libcurl-devel unixODBC-devel libxml2-devel
4.Server端LAMP架構的安裝
4.1 安裝php,zabbix服務端程序由php編寫,因此需要安裝php依賴。
參考:https://www.zabbix.com/documentation/3.4/manual/installation/requirements
//php解釋器版本需要>=5.4版本才可以,本例中安裝5.6版本的php(如果是Centos7版本請嘗試安裝php7.0及以上版本,5.x版本的php在linux7上的支持度很差)。 //首先安裝相關的yum源,然后安裝php相關的包。 #Linux 6: rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm yum -y --nogpgcheck install php56w php56w-gd php56w-bcmath php56w-xml php56w-mbstring php56w-ldap php56w-mysql #Linux 7: rpm -Uvh http://mirror.webtatic.com/yum/el7/epel-release.rpm http://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum -y --nogpgcheck install php72w php72w-gd php72w-bcmath php72w-xml php72w-mbstring php72w-ldap php72w-mysql //如果發現報錯也不要慌,一般是你已經安裝了其他源里的php,yum list|grep php一下,然后把已安裝的非base源里的php全部卸載(先確保沒有被其他應用在使用)。 //當然用其他源里的php也可以,只要能保證滿足官網的那些php requirements即可。 //如果上述yum源也失效了,那么到網上搜索下其他的php的yum源。
4.2 安裝http,zabbix的web頁面展示需要httpd(必須是1.3.12版本及以上)。
yum -y install httpd
4.3 安裝mysql(步驟略)
需要注意的是my.cnf文件中一定要添加character_set_server=utf8的選項(或gbk),否則Zabbix無法支持中文界面。此外必須安裝mysql時必須安裝mysql-devel的包,否則zabbix server可能會安裝失敗。
5.編譯安裝Zabbix Server(root用戶執行)
./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --以上各項含義參考:./configure --help,--enable-server表示安裝server,proxy和agent的安裝以此類推。 --安裝mysql時必須安裝mysql-devel否則會編譯失敗。
make && make install
6.配置mysql數據庫
完成zabbix安裝后開始初始化數據庫的表結構,zabbix提供了data.sql、images.sql、schema.sql這3個sql腳本來初始化mysql數據庫,因為zabbix監控的數據都是要存到這個mysql庫以便進行web展示的,以上表模板的位置在解壓tar包目錄下的database/mysql中。
mysql> create database zabbix default charset utf8; mysql> grant all on zabbix.* to zabbix@localhost identified by 'zabbix'; mysql> grant all on zabbix.* to zabbix@'%' identified by 'zabbix'; //需要注意的是雖然zabbix 3.4對mysql版本沒要求,但是卻要求Innodb存儲引擎,因此為避免麻煩盡量裝5.5以后的mysql版本吧(默認innodb存儲引擎)。
在server端執行全部的腳本:
mysql> source schema.sql
mysql> source images.sql
mysql> source data.sql
7.編輯server端的配置文件
本例中zabbix的安裝位置為/usr/local/zabbix,因此server的conf文件為/usr/local/zabbix/etc/zabbix_server.conf。
老版的Zabbix中會有zabbix_agent.conf和zabbix_agentd.conf兩個配置文件,這是agent端使用的配置文件,其中前者用超級服務(xinetd)的方式來啟動,后者是以獨立進程的方式來啟動的,無論使用哪種方式都可以啟動agent。
3.4版本只保留了zabbix_agentd.conf,本例使用zabbix_agentd來啟動agent端:
//處理下配置文件中一大堆的注釋,看不習慣:
cd /usr/local/zabbix/etc/
mv zabbix_server.conf zabbix_server.conf.bak
mv zabbix_agentd.conf zabbix_agentd.conf.bak
cat zabbix_server.conf.bak |grep -v "^$"|grep -v "^#">zabbix_server.conf
cat zabbix_agentd.conf.bak |grep -v "^$"|grep -v "^#">zabbix_agentd.conf
vi zabbix_server.conf(在本例中只要加個DBPassword=zabbix即可):
LogFile=/tmp/zabbix_server.log
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
Timeout=4
LogSlowQueries=3000
8.啟動zabbix Server
/usr/local/zabbix/sbin/zabbix_server
三、啟動並配置zabbix web
mkdir /var/www/html/zabbix
cp -ar /root/zabbix-3.4.15/frontends/php/* /var/www/html/zabbix/
--/root/zabbix-3.4.15/是我zabbix解壓目錄。
service httpd start --啟動httpd
至此可以通過http://10.0.0.200/zabbix來訪問zabbix了,10.0.0.200是我Zabbix Server服務器的IP地址。
可以看到有幾項php的配置不符合要求,我們改正之:
vi /etc/php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Shanghai
always_populate_raw_post_data = -1 //這項默認是注釋的
重啟httpd服務后刷新,全部通過。
填入數據庫的賬號密碼即可。
根據提示我們下載zabbix.conf.php文件,然后放置到指定位置:/var/www/html/zabbix/conf/
最后的登陸界面如下所示:(默認的賬號是admin,密碼是zabbix)
四、agent客戶端安裝配置
前邊我們已經在agent節點添加了zabbix用戶並下載了zabbix源碼安裝包,這里只需要直接使用即可:
//在本例中server端也要被監控因此也需要安裝agent組件,但其實server在編譯安裝過程中已經包含了agent的功能,因此在server端直接編輯agent配置文件並啟動就可以了。
./configure --prefix=/usr/local/zabbix --enable-agent
make && make install
cd /usr/local/zabbix/etc/
mv zabbix_agentd.conf zabbix_agentd.conf.bak
cat zabbix_agentd.conf.bak |grep -v "^$"|grep -v "^#">zabbix_agentd.conf
然后修改/usr/local/zabbix/etc/zabbix_agentd.conf文件:
LogFile=/tmp/zabbix_agentd.log //passive與active模式的區別在於,前者是server或proxy端主動來獲取數據,后者是客戶端主動向server/proxy發送數據,因此后者壓力更小。 #Server參數表示zabbix server的IP地址,可以有多個,表示agent只會接收來自於此IP的連接,默認的相當於passive模式。 Server=10.0.0.200 #ServerActive參數表示與server進行active check的配置,IP:port格式,可以寫多個。 ServerActive=10.0.0.200:10051 //一般server端的監聽端口是10051,agent端使用的端口是10050。
所謂active check是指agent主動的請求server,獲取監控信息,然后將自己的監控數據返回給server進行展示,需要注意的是進程active check時agent端配置文件里的hostname必須與server里設置的host對象的名字一樣,否則agent日志會報active check失敗以及host not found的錯誤,如果不使用active check那么配置文件中的hostname可以與web上不同,但是此時配置文件中需要去掉ServerActive參數,否則agent日志總是會嘗試active check但是不通並報錯,導致agent日志增長很快。
此外agentd配置文件中的ServerActive只是表明agent端會做active check的操作,但是具體的item項是否會通過active check發送給server還要看item本身的獲取類型是否是zabbix agent(active)。
Zabbix的active check是一個兩次握手的過程:https://www.zabbix.com/documentation/3.4/manual/appendix/items/activepassive
1.首先agent根據ServerActive參數向server發送active的request。
2.server端將此agent下的所有類型為zabbix agent(active)的item list發送給agent,完成一次握手。
3.接下來agent根據收集的interval(或者說delay)將收集的監控值周期性的發送給server。
4.server端回復一個已收到的信息,這算是二次握手。
//啟動agentd:
/usr/local/zabbix/sbin/zabbix_agentd && ps -ef|grep zabbix_agentd
//關閉agentd:
for p in `ps -ef|grep zabbix_agentd|grep -v grep|awk '{print $2}'`;do kill -9 $p;done && ps -ef|grep zabbix_agentd
五、web端主機配置
之前已經完成了zabbix server和agent端的基本配置,但想要實現正常的監控還需要在web端添加所有的agent主機信息(本例中有3個,即2個agent服務器和server端的agent)。
我們先在所有agent節點的配置文件中添加:
Hostname=<為agent自定義的主機名(可以與服務器主機名不一樣)或者直接寫IP>
然后在web界面的配置-->主機中添加所有需要監控的agent主機,這里添加的主機名稱必須與agent配置文件中設置的Hostname一致(如果所有items都不使用active check那么不一樣也可以)。官網的原文描述如下:
With Zabbix agent running on the host you are configuring, the agent configuration file parameter Hostname must have the same value as the host name entered here. The name in the parameter is needed in the processing of active checks.
DNS名稱可以不填,如果要填就要和/etc/hosts文件或DNS服務中的DNS條目一致。
下例添加的agent主機就是zabbix server本身,因為zabbix server本身也要被監控嘛,可以看到使用的端口是10050(agent端口)。

更新后返回主機頁面點擊狀態的按鈕使其成為開啟狀態(或者在添加主機時直接勾選已啟用):
實際上由於zabbix默認的自動發現規則的存在,server端的agent是會被自動發現的,只需要你在agent配置文件中自定義一個Hostname,並配置了active check,那么server端是會自動為你添加主機的,自動發現實際上就是省去了你手動添加主機的步驟,不過客戶端還是需要自己布的,如果客戶端的部署也能用自動化工具完成的話,那么就可以大大簡化部署工作。
至此,zabbix的基本配置已經完畢,以后只需要按需求為主機添加模板或監控項進行監控即可。