Zabbix監控使用進階
1. Zabbix基於SNMP監控
1.1 zabbix-web所能指定的監控方式
ssh/telnet agent:master/agent SNMP:Simple Network Management Protocol IPMI:Intelligent Platform Management Interface 智慧平臺管理介面 # 原本是一種Interl架構的企業系統的周邊裝置所採用的一種工業標準 # IPMI也是一個開放的免費標準,使用者無需支付額外的費用即可使用此標準 JMX:Java Management eXtension (Java管理擴充套件) # 用於通過Java自己的介面對java程式進行監控 # 監控JVM虛擬機器 # zabbix-java-gateway用於獲取監控資料 # 如果在伺服器端定義Type為Trapper,那麼客戶端可以向伺服器端傳送任意型別的資料 # 服務端收到把它儲存下來就可以了
1.2 SNMP概述
1)snmp協議用途
SNMP:Simple Network Management Protocol 簡單網路管理協議(非常古老的協議)
- 用於網路管理的協議
- SNMP用於網路裝置的管理:交換機、路由器
版本:
- v1:1989
- v2c:1993
- v3:1998
2)snmp的元件
MIB:Management Information Base 管理資訊庫(每一個agent都有一個MIB庫)
- 定義了所有可被管理對方的集合,而且還額外定義了被管理物件的名稱、訪問許可權、資料型別等屬性
- 實現了能夠定義雙方可接受的監控元件以及監控元件中資料儲存格式的一個元件
- 還能實現將每一個被管理物件的ID (Object ID,OID)對應到名稱的轉換
MIB檢視:MIB庫的子集
- 授權:將某MIB檢視與某Community繫結來實現
SMI:MIB表示符號
SNMP協議本身
3)snmp通訊方式
# NMS端 “讀”(get,getnext) 操作:管理員向裝置獲取資料 “寫” (set)操作:管理員向裝置執行設定操作 “Trap”(trap)操作:裝置需要在重要狀況改變的時候,向管理員通報事件的發生 # Agent端 Response:返回一個或多個引數值
4)所使用的埠
- Agent:161/udp
- NMS:162/dup
5)工作模式
- NMS端向agent端採集資料(NMS表示監控節點)
- agent端向NMS端報告資料
- NMS請求agent修改配置
1.3 Linux上啟用snmp
# 安裝相關的程式包 yum install -y net-snmp net-snmp-utils net-snmp-libs # 定義配置檔案 vim /etc/snmp/snmpd.conf # 為了方便,乾脆就定義成 .1.3.6.1.2.1 ,把最後一個1去掉 # 啟動服務 systemctl start snmpd # 被監控端開啟的服務,監聽在 161/udp 上 systemctl start snmptrapd # 監控端開啟的服務(如果允許被監控端啟動主動監控時啟用)
1.4 snmp配置檔案
1)配置檔案概覽
- 定義認證符,將社群名稱"public"對映為"安全名稱"
- 將安全名稱對映到一個組名
- 為我們建立一個檢視,讓我們的團隊有權利
2)OID(Object ID)
- 1.3.6.1.2.1
最後一個1才表示跟Internet相關,從這裡開始定義一臺主機的相關物件,具體有:
1:system # 1.3.6.1.2.1.1 2:interface # 1.3.6.1.2.1.2 4:ip # 1.3.6.1.2.1.4 6:tcp # 1.3.6.1.2.1.6 7:udp # 1.3.6.1.2.1.7
1.5 配置SNMP監控
1)配置並啟動snmp
# 修改配置檔案 [root@c7_110 ~]# vim /etc/snmp/snmpd.conf view systemview included .1.3.6.1.2.1.1 view systemview included .1.3.6.1.2.1.2 # 網路介面的相關資料 view systemview included .1.3.6.1.4.1.2021 # 系統資源負載,memory, disk io, cpu load view systemview included .1.3.6.1.2.1.25 # 如果不想定義這麼多,為了方便,可以直接定義一個 .1.3.6.1.2.1 # 然後啟動snmp [root@c7_110 ~]# systemctl start snmpd
2)新增一個snmp介面並配置templates
2. Zabbix基於JMX監控
2.1 JMX概述
Java虛擬機器(JVM)具有內建的外掛,使得能夠使用JMX監視和管理它,還可以使用JMX監視工具化的應用程式
JMX(Java Management Extensions)Java管理擴充套件
2.2 JMX監控配置過程
1)zabbix-java-gateway主機設定
# 在某主機上(不一定要是在Zabbix_Server上)安裝zabbix-java-gateway程式包 yum install -y zabbix-java-gateway # 對zabbix-java-gateway進行配置,也可以不用配置,直接啟動 vim /etc/zabbix/zabbix_java_gateway.conf Listen_IP=10.0.0.110 # 監聽地址,可修改成0.0.0.0 Listen_PORT=10052 # 監聽zabbix_java程序的埠,預設是10052 TIMEOUT=10 # zabbix_java的超時時間 # 啟動zabbix-java-gateway systemctl start zabbix-java-gateway.service
2)配置zabbix-server訪問java-gateway
JavaGateway=10.0.0.110 #即 zabbix server IP地址 JavaGatewayPort=10052 StartJavaPollers=5 # 與啟動程序輪詢個數
# 配置完成之後需要重啟zabbix-server
3)開啟JMX遠端監控
vim /usr/local/tomcat/bin/catalina.sh # 如果是yum安裝的tomcat,要在/etc/sysconfig/tomcat中修改 #啟用JVM介面,預設沒有啟用 export CATALINA_OPTS=$CATALINA_OPTS "-Djava.rmi.server.hostname=10.0.0.110 -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" ### jmx[object_name,attribute_name] object name # 它代表MBean的物件名稱 attribute name - # 一個MBean屬性名稱,可選的複合資料欄位名稱以點分隔 # 示例:jmx["java.lang:type=Memory","HeapMemoryUsage.used"] # 配置完成後需要重啟tomcat
4)在web上定義JMX監控
和SNMP相同,只需要定義一個JMX Interface即可,然後新增一個JMX的templates,其他操作完全相同
2.3 從外部匯入Templates模板
- 搜尋相關的監控模板:https://share.zabbix.com/
3. Zabbix分散式監控
3.1 分散式監控概述
1)Zabbix的三種架構
- Server-agent
- Server-Node-agent:使用節點(node)
- Server-Proxy-agent:使用代理(proxy)
zabbix能高效的監控分散式IT架構,在大型環境中zabbix提供兩種解決方案:proxy和node
2) Proxy or Node
代理(proxy)用於本區域資料蒐集,並將資料傳送給server
節點(node)提供完整的zabbix server用以建立分散式監控中的層級
3.2 使用節點(node)
節點(node)提供完整的Zabbix Server用以建立分散式監控中的層級
Node本身是一臺server,它有有整的web頁面,完整的資料庫,它將資料來源源不斷的傳送給Master
- 解決host過多時單臺Server面臨效能瓶頸的問題
- 使用多個instance,每個instance是獨立的一套zabbix,有database和Frontent(optional)
- 支援熱插播,Node和Server的連線可以隨時斷開,但不影響Node的正常執行
- Node定時給Server傳送configuration、history、event
- Server定時給Node傳送configuration
- 所有配置變更只能在Node節點操作,不能在Server操作
- 支援樹狀結構,Node又可以是一個Server
3.3 使用代理(proxy)
代理(proxy)用於本區域資料手機,並將資料傳送給server
Proxy只有一個proxy的daemon程序,Proxy也有自己的資料庫,但它的資料庫只會儲存一定時間的資料,它與Master通訊是將一批資訊打包後傳送到Master,Master將這些資料merge如Master資料庫
- Proxy不會向Server同步 configuration ,只會接收
- Proxy的資料庫定時會將資料傳送該Server,Proxy本地資料庫只儲存最近沒有傳送的資料
Master-Proxy相比Master-Node的優先:
- Proxy壓力小,資料庫只儲存一定時間資料
- Master壓力變小,資料不是源源不斷獲取,減小IO壓力
- 架構更清晰,易維護
3.4 Server-Proxy-agent配置示例
1)在proxy主機上安裝軟體包
yum install -y zabbix-proxy zabbix-proxy-mysql zabbix-get zabbix-agent zabbix-sender
2)為proxy建立一個數據庫並授權
# 建立資料庫 create database zabbix_proxy character set utf8; # 建立使用者並授權 grant all on zabbix_proxy.* to zbxuser@'10.0.%.%' identified by 'woshiniba' # 重新整理許可權 flush privileges
3)匯入sql檔案
- zabbix-proxy-mysql 包裡面帶有
# 複製並解壓 cp /usr/share/doc/zabbix-proxy-mysql-3.4.4/schema.sql.gz ./ gzip -d schema.sql.gz # 匯入資料,匯入到剛剛建好的zabbix_proxy庫中 mysql -root -p zabbix_proxy < schema.sql
4)配置並啟用zabbix-proxy
### 配置zabbix-proxy vim /etc/zabbix/zabbix_proxy.conf Server=10.0.0.202 # server 的IP ServerPort=10051 # server 的埠 Hostname=zbxproxy.hgzero.com # 主機名 ListenPort=10051 # proxy自己的監聽埠 EnableRemoteCommands=1 # 允許遠端命令 LogRemoteCommands=1 # 記錄遠端命令的日誌 # 資料的配置 DBHost=10.0.0.88 DBName=zabbix_proxy DBUser=zbxuser DBPassword=woshiniba ConfigFrequency=30 # 多長時間,去服務端拖一次有自己監控的操作配置;為了實驗更快的生效,這裡設定30秒,預設3600s DataSenderFrequency=1 # 每一秒向server 端發一次資料,傳送頻度 ### 啟動zabbix-proxy systemctl start zabbix-proxy
5)通過proxy代理的節點上操作
- 假設有一臺節點node2,通過proxy代理
# 在node2的zabbix_agent配置檔案中填入Zabbix Server和Proxy的地址 vim /etc/zabbix/zabbix_agentd.conf Server=10.0.0.88,10.0.0.202 ServerActive=10.0.0.88,10.0.0.202
6)在web上建立配置agent 代理
- 這個時候再建立Host時,就可以看到剛剛配置的proxy了,可以選擇是否通過proxy來監控
4. Zabbix通過微信發告警資訊
4.1 註冊企業微信並配置
1)註冊企業微信
- 註冊地址:https://work.weixin.qq.com/wework_admin/register_wx
- 註冊成功後進入後臺進行配置
2)新增告警組並新增成員
3)記錄企業ID
4)建立應用並填寫相關資訊
4.2 配置Zabbix Server
1)確認剛剛記錄的資訊
告警組使用者的賬號、企業ID、建立應用的Secret、Agentld
2)下載訊息推送指令碼並測試
- 指令碼地址:https://github.com/OneOaaS/weixin-alert
- 也可以選用其他指令碼或者自行開發指令碼
下載指令碼後,將指令碼儲存在 /usr/lib/zabbix/alertscripts 後,修改許可權及屬主屬組:
chmod 755 wechat chown zabbix.zabbix wechat
測試指令碼:
[root@c7_node_02 alertscripts]# ./wechat --corpid=wwd43fee2ab4dbfb21 --corpsecret=pa2dgtdf8V0lFWwYaoG62345g_R39dodmK37RPJeOMOs --msg="現在在進行告警測試" --user=hgzerowzh --agentid=1000002 {"errcode":0,"errmsg":"ok","invaliduser":""} # 引數說明 -corpid= 我們企業裡面的id --corpsecret= 這裡就是我們Secret裡面的id -msg= 內容 -user=我們邀請使用者的賬號
- 注意:指令碼在安放完成之後,要重啟zabbix-server
3)在Zabbix Server上新增報警媒介
4)為對應的使用者新增報警媒介
5)建立Action
建立Action時,在“操作”中選擇 “Send Message”,並通過 “微信報警” 傳送給使用者
# 操作資訊內容 故障發生:{TRIGGER.NAME} 故障主機:{HOSTNAME1} IP地址:{HOST.CONN} 告警時間:{EVENT.DATE}{EVENT.TIME} 告警等級:{TRIGGER.SEVERITY} 告警資訊:{TRIGGER.NAME} 告警專案:{TRIGGER.KEY1} 問題詳情:{ITEM.NAME} : {ITEM.VALUE} 當前狀態:{TRIGGER.STATUS} : {ITEM.VALUE1} 事件ID:{EVENT.ID} # 恢復操作資訊內容 故障恢復:{HOSTNAME1} 已恢復! IP地址:{HOST.CONN} 告警時間:{EVENT.DATE}{EVENT.TIME} 告警等級:{TRIGGER.SEVERITY} 告警資訊:{TRIGGER.NAME} 告警專案:{TRIGGER.KEY1} 問題詳情:{ITEM.NAME} : {ITEM.VALUE} 當前狀態:{TRIGGER.STATUS} : {ITEM.VALUE1} 事件ID:{EVENT.ID}
6)微信接受資訊檢視
主動觸發事件後,來檢視微信是否能接受到資訊
5. Zabbix調優相關
5.1 Zabbix調優
1)Database
歷史資料不要儲存太長時長;
儘量讓資料快取在資料庫伺服器的記憶體中;
2)觸發器表示式
減少使用聚合函式min(), max(), avg();儘量使用last(),nodata(),因為聚合函式,要運算
資料收集:polling較慢(減少使用SNMP/agentless/agent);儘量使用trapping(agent(active)主動監控);
資料型別:文字型資料處理速度較慢;儘量少收集型別為文字 text或string型別的資料;多使用型別為numeric 數值型資料 的;
5.2 zabbix伺服器的程序
1)伺服器元件的數量
alerter, discoverer, escalator, http poller, hourekeeper, icmp pinger, ipmi polller, poller, trapper, configration syncer, ... StartPollers=60 StartPingers=10 ... StartDBSyncer=5 ...
2)設定合理的快取大小
CacheSize=8M HistoryCacheSize=16M HistoryIndexCacheSize=4M TrendCacheSize=4M ValueCacheSize=4M
3)資料庫優化
# 分表: history_* trends* events*
5.3 其它解決方案
# 其他解決方案,grafana+collectd+influxdb grafana:展示 collectd:收集 influxdb:儲存 # prometheus exporter:收集 alertmanager: grafana:展示