一、監(jiān)控系統(tǒng)介紹
硬件-->系統(tǒng)-->應(yīng)用
監(jiān)控:
1.發(fā)現(xiàn)故障
2.監(jiān)控業(yè)務(wù)系統(tǒng)業(yè)務(wù)流量
監(jiān)控的兩種方式:
1.有agent
2.無agent
監(jiān)控應(yīng)該具有的主要功能
1.周期性的數(shù)據(jù)采集
被監(jiān)控的主機(jī)安裝agent
不需要安裝agentless
時間流數(shù)據(jù)數(shù)據(jù)項稱之為一個監(jiān)控的指標(biāo)數(shù)據(jù)
監(jiān)控模板,調(diào)用模板工具
發(fā)現(xiàn)能力:當(dāng)增加設(shè)備時,可以自動納入監(jiān)控中
同步內(nèi)置接口,來發(fā)現(xiàn)監(jiān)控系統(tǒng),從而完成自動發(fā)現(xiàn)新增加的主機(jī)
添加主機(jī)的方式:1.手動添加。2.自動發(fā)現(xiàn)
監(jiān)控數(shù)據(jù)的類型的設(shè)定:1.手動添加。2.使用模板
2.數(shù)據(jù) 存儲
數(shù)據(jù)存儲位置,可以自主研發(fā),也可以使用已存在在數(shù)據(jù)庫,Zabbix使用的存儲為MySQL或者PGSQL,存儲容易成為瓶頸
3.定義閾值,發(fā)出警告
合理區(qū)間,每一項參數(shù)都需要定義一個合理的數(shù)據(jù),超過該數(shù)據(jù)則發(fā)出警告,定義表達(dá)式,計算結(jié)構(gòu)滿足條件才是危險,不滿足才認(rèn)為正常。告警需要通過郵件等,
遠(yuǎn)程命令或腳本完成自我修復(fù)、發(fā)出警告
4.可視化
將數(shù)據(jù)流生成圖標(biāo)展示出來
1.cacti:采集數(shù)據(jù),展示,存儲,告警不好,結(jié)合nagios
經(jīng)過定義crontab任務(wù)+snmp+rrd(roundrobin database)數(shù)據(jù)庫
nagios:只報警,符合就報警,不符合就丟棄
2.Zabbix:采集數(shù)據(jù),存儲數(shù)據(jù),告警功能,可視化,可使用grafana做可視化
3.statsd(數(shù)據(jù)采集)+influxdb(時序數(shù)據(jù)庫)+grafana
4.prometheus+grafana
數(shù)據(jù)采集的方式,采集通道
1.agentless:ssh、telnet
2.agent:Zabbix agent、exporter、snmp(一般用于路由器)
二、Zabbix
架構(gòu)體系:

Zabbix Server:負(fù)責(zé)接收agent發(fā)送的報告信息的核心組件,所有位置,統(tǒng)計數(shù)據(jù)及操作數(shù)據(jù)均由次組件進(jìn)行
Zabbix Database:專用于存儲所有的配置信息,收集信息等
Zabbix web GUI:通常與Server運(yùn)行在同一臺主機(jī)上,用來展示數(shù)據(jù)和配置監(jiān)控項
Proxy:可選組件,用于分布式監(jiān)控系統(tǒng),代理收集監(jiān)控信息,然后交給Zabbix Server
Aent:部署在被監(jiān)控主機(jī)上,負(fù)責(zé)手機(jī)本地數(shù)據(jù)并發(fā)往Server或者代理端
工作架構(gòu)
Zabbix Poller:周期性的獲取監(jiān)控服務(wù)器

poller--->監(jiān)控項--->觸發(fā)器-->觸發(fā)時間--->行為:1.條件 2.操作 :1.遠(yuǎn)程命令 2.報警
1.主機(jī)添加到zabbix
2.定義指標(biāo)項
3.定義觸發(fā)器
4.定義事件
5.處理動作
zabbix邏輯組件:
主機(jī)組
主機(jī)
監(jiān)控項(item)
key:實(shí)現(xiàn)獲取監(jiān)控的目標(biāo)上的數(shù)據(jù)的命令或腳本的名稱;
應(yīng)用(application):同一類監(jiān)控項的集合;
觸發(fā)器(trigger):表達(dá)式;PROBLEM, OK;
事件(event):
動作(action):由條件(condition)和操作(operation)組件;
媒介(media):發(fā)送通知的通道;
通知(notification):
遠(yuǎn)程命令(remote command):
報警升級():
模板(template):快速定義被監(jiān)控主機(jī)的各監(jiān)控項的預(yù)設(shè)項目集合;
圖形(graph):用于展示歷史數(shù)據(jù)或趨勢數(shù)據(jù)的圖像;
屏幕(screen):由多個graph組成
功能:1.采集數(shù)據(jù)、2.存儲、3.定義閾值、4.可視化
安裝方式和基本配置并且啟動服務(wù)
1.下載zabbix的倉庫
[root@tomcat2 ~]# rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
2.安裝zabbix等相關(guān)軟件包,因為這里需要使用mysql數(shù)據(jù)庫,所以直接安裝
[root@ansible ansible]# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent mariadb-server
3.配置MySQL
[root@tomcat2 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
log_bin=mysql-bin
innodb_file_per_table=ON
skip_name=resolve=ON
max_connections = 20000
innodb_buffer_pool_size = 256M
[root@tomcat2 ~]# systemctl start mariadb
[root@tomcat2 ~]# mysql
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
mysql> quit;
4.配置zabbix_server.conf
DBPassword=password #若mysql就在本地,則只需要修改者一處配置即可
----------------------------------若數(shù)據(jù)庫不在本地
# SourceIP= #監(jiān)聽ip
LogFileSize=0 #日志文件大小
# DBHost=localhost #數(shù)據(jù)庫主機(jī)地址
DBName=zabbix #數(shù)據(jù)庫名
DBUser=zabbix #zabbix數(shù)據(jù)庫的用戶名
DBPassword=centos #數(shù)據(jù)庫密碼
5.導(dǎo)入數(shù)據(jù)文件
[root@tomcat2 ~]# zcat /usr/share/doc/zabbix-server-mysql-3.4.10/create.sql.gz | mysql -uzabbix -p zabbix #其中-p 后面是跟的數(shù)據(jù)庫名,不是密碼,若需要直接給密碼,則-p密碼,注意:-p和密碼之間不能有空格
6.修改/etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai #修改成正常時區(qū),否則在初始化時會有問題
7.http://主機(jī)IP地址/zabbix/ 格式化即可,用戶名密碼默認(rèn)為Admin zabbix
三、配置zabbix監(jiān)控主機(jī)配置
配置/etc/zabbix/zabbix_agent.conf文件,需要授權(quán)才可以被監(jiān)控,若是zabbix本機(jī),則直接啟動服務(wù)即可

接口:
ZIB、snmp、JMX(jvm虛擬機(jī)監(jiān)控)、ipmi(inter智慧平臺接口,在硬件級接口)
item:指標(biāo)項指某一特定指標(biāo)數(shù)據(jù),數(shù)據(jù)流生成時有特定的命令獲取到的時間序列數(shù)據(jù)
指標(biāo):不斷變化的數(shù)據(jù)數(shù)列
指標(biāo)項:key+執(zhí)行命令組成
獲取數(shù)據(jù)
手動添加配置監(jiān)控主機(jī)
1.通過zabbix-agent
配置被監(jiān)控端服務(wù)器
[root@tomcat1 yum.repos.d]# vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.1.149
[root@tomcat1 yum.repos.d]# systemctl start zabbix-agent.service
創(chuàng)建主機(jī)過程

各個選項的意思

一般在局域網(wǎng)內(nèi)部需要加密,只有在跨網(wǎng)絡(luò)在需要加密,加密浪費(fèi)系統(tǒng)資源

資產(chǎn)清單配置

添加監(jiān)控項:Applications監(jiān)控組 items監(jiān)控項,可以在key中傳遞參數(shù),如system.cpu.load[percpu,avg1],在[]添加參數(shù)即可


可以手動測試需要那幢zabbix-get
zabbix-get -s 采集數(shù)據(jù)地址 -p PROT -k ”system.cpu.switches“
使用模板:內(nèi)建模板,也可以在GitHub中找




告警
定義action需要在系統(tǒng)級別進(jìn)行定義:
conditions(條件),通常是event產(chǎn)生,可以是多個條件
operations(操作):
remote command(遠(yuǎn)程命令)或send message(發(fā)警報),可以警報升級
傳遞消息:media(信道)和zabbix的用戶或zabbix group,告警消息的收件地址,有與消息傳遞信道相匹配的收件地址
分布式監(jiān)控系統(tǒng)
node:有單獨(dú)的監(jiān)控功能,數(shù)據(jù)庫,一段時間后 同步給主server,若server故障,可當(dāng)單獨(dú)的監(jiān)控使用,2.2版本以后被刪除
proxy:只是代理訪問數(shù)據(jù),有數(shù)據(jù)庫,代理無需配置,,數(shù)據(jù)庫為臨時存儲,不會持久存儲,需要周期性的同步server端配置
事件的定義







發(fā)送報警信息時,需要指定zabbix的用戶,定義該信道收件人所需要的收件地址
發(fā)消息
1.定義信道
2.定義針對信道對應(yīng)的收件地址
定義信道

定義zabbix用戶與此信道匹配的收件地址
腳本存放位置:AlertScriptsPath=/usr/lib/zabbix/alertscripts/
參數(shù):收件人,信息主體,正文


調(diào)用腳本相關(guān)
1.傳遞信息的通道
Eamil
Script:報警腳本,腳本存放路徑:/usr/lib/zabbix/alertscripts/
zabbix服務(wù)器在調(diào)用腳本時,會想其傳遞三個參數(shù)
$1:經(jīng)由此信道接收信息的目標(biāo);
$2:subject
$3:body
zabbix 3.0之后的版本,此三個變量定義為內(nèi)部宏:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

2.收件地址
3.腳本
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr
import sys
def formatAddr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_mail(to_list,subject,content):
mail_host = 'smtp.exmail.qq.com'
mail_user = 'USERNAME@DOMAIN.TLD'
mail_pass = 'YOUR_PASSWORD'
#以上內(nèi)容根據(jù)你的實(shí)際情況進(jìn)行修改
msg = MIMEText(content,'','utf-8')
msg['Subject'] = Header(subject, 'utf-8').encode()
msg['From'] = formatAddr('zabbix監(jiān)控 <%s>' % mail_user).encode()
msg['to'] = to_list
try:
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(mail_user,to_list,msg.as_string())
s.close()
return True
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1], sys.argv[2], sys.argv[3])
執(zhí)行自定義腳本前提
在agent需要完成的配置:
(1) zabbix用戶擁有所需要的管理權(quán)限;
編輯/etc/sudoers文件,注釋如下行;
# Defaults requiretty
添加如下行:
zabbix ALL=(ALL) NOPASSWD: ALL
(2) agent進(jìn)程要允許執(zhí)行遠(yuǎn)程命令;
編輯/etc/zabbix/zabbix_agentd.conf,設(shè)置如下配置:
EnableRemoteCommands=1
重啟服務(wù)生效;
展示接口

Graph:將多個指標(biāo)定義成一個張圖

一個屏幕顯示多個圖



屏幕輪詢設(shè)置,slide show


模板定義:可以是模板組,也可以鏈接其他模板,定義時,和定義主機(jī)一樣,但是不調(diào)用,不生效
導(dǎo)入模板


刪除模板等操作注意問題

宏:macro,預(yù)設(shè)的文本替換模式
級別:優(yōu)先級別:主機(jī)--->模板---->全局
全局:administrator-->General--->Macros
模板:編輯模板--->Macros
主機(jī):編輯主機(jī)--->Macros
類型:
內(nèi)建:{MACRO_NAME},需要查詢官方文檔
自定義:{$MACRO_NAME}
命名方式:大寫字母、數(shù)字和下劃線
配置:
全局

模板宏

主機(jī)宏

監(jiān)控同一個主機(jī)可以打開多路,優(yōu)先選擇agent
配置網(wǎng)絡(luò)自動發(fā)現(xiàn):
基于網(wǎng)絡(luò)掃描發(fā)現(xiàn)指定網(wǎng)絡(luò)中在線,然后添加主機(jī)
掃描在線主機(jī)問題,需要基于主機(jī)名來確定統(tǒng)一主機(jī),然后通過判斷某主機(jī)上基于哪些服務(wù)是否存在等方式來判斷是否現(xiàn)在
步驟1.基于主機(jī)名和服務(wù)掃描在線主機(jī)
步驟2 添加主機(jī),增加主機(jī)監(jiān)控模板
步驟3.根據(jù)主機(jī)之上發(fā)現(xiàn)的服務(wù),添加服務(wù)模板
主機(jī):主機(jī)被發(fā)現(xiàn)、主機(jī)丟失、主機(jī)停機(jī)、主機(jī)啟用
服務(wù):
發(fā)現(xiàn)事件
添加網(wǎng)絡(luò)發(fā)現(xiàn),如果根據(jù)agent發(fā)現(xiàn),需要想主機(jī)發(fā)送key請求

配置被發(fā)現(xiàn)的主機(jī)
[root@tomcat1 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.1.149 #指定服務(wù)器段IP地址
添加到監(jiān)控主機(jī)



key的定義:
在zabbix.agent.conf端的配置文件上由用戶通過UserParameter指令定義key
格式:UserParameter=key,command
實(shí)例:不帶參數(shù) 定義key
UserParameter=memory.usage.used,/usr/bin/free | awk '^Mem/{print $3}'
UserParameter=memory.usage.used,/usr/bin/free | awk '^Mem/{print $4}'
手動獲取數(shù)據(jù)
zabbix_get -s 192.168.1.162 -k "memory.usage.used"
網(wǎng)頁調(diào)用key需要在key行數(shù)據(jù)
實(shí)例:帶可以接受參數(shù)的定義key
UserParameter=memory.usage[*],/usr/bin/awk '/^$1/{print $$2}' /proc/meminfo
手動測試
zabbix_get -s 192.168.1.162 -k "memory.usage[參數(shù)]"
模板導(dǎo)入完成,必須在每一個被監(jiān)控的主機(jī)上配置相對應(yīng)定義key的文件
web頁面監(jiān)控
監(jiān)控hiding站點(diǎn)資源下載速度,及頁面相應(yīng)時間,相應(yīng)代碼
1.哪個頁面
web場景(web scenario)每個應(yīng)用都定義成一個場景
web頁面:每一個場景都應(yīng)該監(jiān)控哪些頁面
內(nèi)建key:
web.test.in:傳輸速率
web.test.time:響應(yīng)時長
web.test.rsocode :響應(yīng)碼



主動監(jiān)測和被動監(jiān)測
被動檢測:相對于agent而言;agent, server向agent請求獲取配置的各監(jiān)控項相關(guān)的數(shù)據(jù),agent接收請求、獲取數(shù)據(jù)并響應(yīng)給server;
主動檢測:相對于agent而言;agent(active),agent向server請求與自己相關(guān)監(jiān)控項配置,主動地將server配置的監(jiān)控項相關(guān)的數(shù)據(jù)發(fā)送給server;
agent端所需要基本配置:
ServerActive= #真正zabbix server端
Hostname= #報告的主機(jī)名
HostnameItem= #可以key發(fā)現(xiàn)主機(jī)名

zabbix自動捕獲數(shù)據(jù)
zabbix_sender發(fā)送數(shù)據(jù):
zabbix server上的某主機(jī)上,直接定義Item時隨便定義一個不與其它已有key沖突的key即可,即item type為“zabbix trapper";
zabbix_sender
-z zabbix_server_ip
-p zabbix_server_port
-s zabbix_agent_hostname
-k key
-o value
配置過程

SNMP和JMX監(jiān)控
SNMP:簡單網(wǎng)絡(luò)管理協(xié)議,主要用于監(jiān)控交換機(jī)或路由器等
沒有采集數(shù)據(jù)的服務(wù)端
linux上實(shí)現(xiàn)SNMP需要借助net-snmp程序包
OID:可被采集的數(shù)據(jù)取一個數(shù)字,是一個倒置的樹樁結(jié)構(gòu)
基于SNMP監(jiān)控:
SNMP:簡單網(wǎng)絡(luò)管理協(xié)議;
agent/nms
讀(get, getnext)、寫(set)、trap(陷阱);
161/udp 客戶端
162/udp 管理端
SNMP:
v1: 1989
v2c: 1993
v3: 1998
MIB:Management Information Base
OID:Object ID
Linux啟用snmp的方法:
# yum install net-snmp提供agent的 net-snmp-utils工具程序
配置文件:
/etc/snmp/snmpd.conf
定義ACL
.1.3.6.1.2.1.
1.1.0:系統(tǒng)描述信息,SysDesc
1.3.0:監(jiān)控時間, SysUptime
1.5.0:主機(jī)名,SysName
1.7.0:主機(jī)提供的服務(wù),SysService
2.1.0:網(wǎng)絡(luò)接口數(shù)目
2.2.1.2:網(wǎng)絡(luò)接口的描述信息
2.2.1.3:網(wǎng)絡(luò)接口類型
……
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.2 # 網(wǎng)絡(luò)接口的相關(guān)數(shù)據(jù)
view systemview included .1.3.6.1.4.1.2021 # 系統(tǒng)資料負(fù)載,memory, disk io, cpu load
view systemview included .1.3.6.1.2.1.25.1.1 啟動服務(wù):
systemctl start snmpd.service
測試工具:
# snmpget -v 2c -c public HOST OID
# snmpwalk -v 2c -c public HOST OID

JMX,zabbix不能直接去jMX上獲取數(shù)據(jù),需要配置java-gateway才可以,java-gateway也是服務(wù)
tomcat主機(jī)設(shè)置:
監(jiān)控tomcat:啟用接口
/etc/sysconfig/tomcat或/etc/tomcat/tomcat.conf文件,添加
CATALINA_OPTS="-Djava.rmi.server.hostname=(TOMCAT_SERVER_IP指當(dāng)前監(jiān)聽地址) -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
zabbix-java-gateway主機(jī)設(shè)置:
安裝 zabbix-java-gateway程序包,啟動服務(wù);
zabbix-server端設(shè)置(需要重啟服務(wù)):
JavaGateway=172.16.0.70
JavaGatewayPort=10052
StartJavaPollers=5 # 啟動多少個子進(jìn)程完成JMX
添加監(jiān)控項:
jmx[object_name,attribute_name]
object name - 它代表MBean的對象名稱
attribute name - 一個MBean屬性名稱,可選的復(fù)合數(shù)據(jù)字段名稱以點(diǎn)分隔
示例:
jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
jmx的詳細(xì)文檔:
https://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html
zabbix分布式監(jiān)控
node:中間代理每一個都能獨(dú)立的工作,擁有數(shù)據(jù)庫,比較重量級,幾乎全功能的監(jiān)控數(shù)據(jù)庫:現(xiàn)在已經(jīng)不支持
proxy:沒有配置,由server端分發(fā)給代理,采集到的數(shù)據(jù)臨時存儲,同步完成后,就刪除,也需要周期性的同步數(shù)據(jù)
適用:1.負(fù)載較大 2.跨機(jī)房,因為端口不確定,所以為了方便在防火墻上單獨(dú)管理
軟件包 zabbix-proxy-mysql
配置步驟:
1.安裝zabbix-proxy mariadb-server
2.初始化mariadb等相關(guān)信息,并且啟動mariadb服務(wù),初始化,創(chuàng)建相關(guān)庫,授權(quán),并且導(dǎo)入sql腳本
3.更改配置文件
Server=
zabbix server主機(jī)地址;
Hostname=
當(dāng)前代理服務(wù)器的名稱;在server添加proxy時,必須使用此處指定的名稱;
需要事先確保server能解析此名稱;
DBHost=
DBName=
DBUser=
DBPassword=
ConfigFrequency=10
DataSenderFrequency=1

4.將被監(jiān)控端更改為proxy,將proxy改為server,在定義主機(jī)時,直接經(jīng)過代理即可
調(diào)優(yōu)
Database:
歷史數(shù)據(jù)不要保存太長時長;
盡量讓數(shù)據(jù)緩存在數(shù)據(jù)庫服務(wù)器的內(nèi)存中;
觸發(fā)器表達(dá)式:減少使用min(), max(), avg();盡量使用last(),nodata();
數(shù)據(jù)收集:polling較慢(減少使用SNMP/agentless/agent);盡量使用trapping(agent(active));
數(shù)據(jù)類型:文本型數(shù)據(jù)處理速度較慢;盡量少收集類型為text或string類型的數(shù)據(jù);多使用類型為numeric的;
zabbix服務(wù)器的進(jìn)程:
(1) 服務(wù)器組件的數(shù)量;
alerter, discoverer, escalator, http poller, hourekeeper, icmp pinger, ipmi polller, poller, trapper, configration syncer, ...
StartPollers=60 #多開幾個處理請求,和cpu核心有關(guān)
StartPingers=10 #多啟用幾個測試連通性
...
StartDBSyncer=5 #數(shù)據(jù)同步,有多少個pollers最好配置多少個次選項
...
(2) 設(shè)定合理的緩存大小
CacheSize=8M
HistoryCacheSize=16M
HistoryIndexCacheSize=4M
TrendCacheSize=4M
ValueCacheSize=4M
(3) 數(shù)據(jù)庫優(yōu)化
分表:
history_*
trends*
events*
其它解決方案:
grafana:展示
collectd:收集
influxdb:存儲
grafana+collectd+influxdb
prometheus:
exporter:收集
alertmanager:
grafana:展示
openfalcon