為什么要監控
監控是整個運維乃至整個產品生命周期中重要的一環,事前及時預警發現故障,事后提供詳實的數據用於追查定位問題。
對系統不間斷實時監控
實時反饋系統當前狀態
保證服務可靠性安全性
保證業務持續穩定運⾏
企業常見監控工具
cacti:擅長出圖,添加監控項很繁瑣
nagios:可以添加監控項,但不可圖形化
ganglia:分布式集群監控系統,適合於對上千台大型規模集群進行監控,性能成本比較低,批量管理更加方便,但不支持告警。
zabbix:基於web,提供分布式方式監控網絡和系統參數,出圖美觀,支持告警
promethus:適合於監控k8s
ELK:日志監控
zabbix工作原理
Agentd安裝在被監控的主機上,Agent負責定期收集客戶端本地各項數據,並發送至Zabbix Server端,Zabbix Server收到數據,將數據存儲到數據庫中,用戶基於Zabbix WEB可以看到數據在前端展現圖像。
當Zabbix監控某個具體的項目,該項目會設置一個觸發器閾值,當被監控的指標超過該觸發器設定的閾值,會進行一些必要的動作,動作包括:發送信息(郵件、微信、短信)、發送命令(SHELL 命令、Reboot、Restart、Install等)
1.硬件監控 路由器、交換機、防⽕牆、服務器
2.系統監控 Windows/Linux CPU、內存、磁盤、⽹絡、進程、TCP
3.服務監控 nginx、php、tomcat、redis、memcache、mysql
4.WEB監控 請求時間、響應時間、加載時間、
5.⽇志監控 ELk(收集、存儲、分析、展示) ⽇志易、阿里雲日志系統
6.安全監控 Firewalld(限制來源的ip)、WAF(Nginx+lua)、安全寶、⽜盾雲、安全狗
7.⽹絡監控 smokeping 多機房、監控寶、全國各地實時延遲
8.業務監控 活動引⼊多少流量、產⽣多少注冊量、帶來多⼤價值
安裝部署環境
安裝部署服務端
1.關閉防火牆和禁用selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i "s/SELINUX=.*/SELINUX=Disabled/" /etc/selinux/config
setenforce 0
或者放行相關端口:
firewall-cmd --permanent --zone=public --add-port=10050/tcp
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=10051/tcp
firewall-cmd --reload
2.安裝zabbix5.0的rpm源
官方源地址:
repo.zabbix.com
rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo
yum clean all
3.安裝軟件包
安裝 zabbix server 和 agent
yum install zabbix-server-mysql zabbix-agent -y
安裝 Software Collections,便於后續安裝高版本的 php,默認 yum 安裝的 php 版本為 5.4 過低
yum install centos-release-scl -y
啟用 zabbix 前端源,修改vi /etc/yum.repos.d/zabbix.repo,將[zabbix-frontend]下的 enabled 改為 1
[zabbix-frontend]
...
enabled=1
...
安裝 zabbix 前端和相關環境
yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl -y
數據庫安裝
1.安裝mariadb數據庫
yum install mariadb-server -y
systemctl enable --now mariadb
mariadb設置root密碼
mysqladmin -uroot password admin
使用 root 用戶進入 mysql,並建立 zabbix 數據庫,注意數據庫編碼
create database zabbix character set utf8 collate utf8_bin;
create user zabbix@localhost identified by 'zabbix';
grant all privileges on zabbix.* to zabbix@localhost;
##create user zabbix@localhost identified by 'zabbix'; 如果連不上數據庫可以加上這兩行
##grant all privileges on zabbix.* to zabbix@'%';
quit;
導入初始架構和數據,zabbix 數據庫用戶為 zabbix,密碼為 zabbix
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
導入成功,如下圖:
配置zabbix server數據庫連接:
修改 zabbix server 配置文件vi /etc/zabbix/zabbix_server.conf 里的數據庫密碼
vi /etc/zabbix/zabbix_server.conf
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
配置zabbix前端php-fpm:
編輯配置文件 vi /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf, add nginx to listen.acl_users directive.
listen.acl_users = apache,nginx
php_value[date.timezone] = Asia/Shanghai
Nginx端配置
nginx配置1:
編輯配置文件 vi /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf, uncomment and set 'listen' and 'server_name' directives.
# listen 80;
# server_name localhost;
nginx配置2:
注釋listen,server_name,root等默認配置
vim /etc/opt/rh/rh-nginx116/nginx/nginx.conf
server {
# listen 80 default_server;
# listen [::]:80 default_server;
# server_name _;
# root /opt/rh/rh-nginx116/root/usr/share/nginx/html;
# Load configuration files for the default server block.
# include /etc/opt/rh/rh-nginx116/nginx/default.d/*.conf;
啟動相關服務,並配置開機自動啟動
systemctl start zabbix-server rh-php72-php-fpm rh-nginx116-nginx
systemctl enable zabbix-server rh-php72-php-fpm rh-nginx116-nginx
使用瀏覽器訪問http://ip/zabbix 即可訪問 zabbix 的 web 頁面
默認登陸賬號密碼:Admin---zabbix
安裝部署zabbix-agent2
zabbix-agent2作為一款新的agent,未來可能會替代原有的agent
特性:
降低了TCP連接數量,也就是降低了資源消耗
用go語言開發,集成了zabbix-agent原有功能,並且易於通過插件擴展第三方功能
1)配置yum源
rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
2)安裝zabbix-agent2:
yum install -y zabbix-agent2
rpm -ql zabbix-agent2 //查看相關文件
egrep -v '^#|^$' /etc/zabbix/zabbix_agent2.conf //查看配置文件
3)配置 Zabbix-Agent 指向 Zabbix-Server
[root@m02 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=192.168.198.128
4)啟動 Zabbix-Agent , 默認監聽在 10050 端⼝
[root@m02 ~]# systemctl start zabbix-agent2
[root@m02 ~]# systemctl enable zabbix-agent2
[root@m02 ~]# netstat -lntp
zabbix添加監控主機
web界面介紹:
主機-->監控項-->模板-->觸發器-->執行動作-->告警媒介
1)配置ZabbixWeb⻚⾯,點擊配置->選擇主機->創建主機
zabbix添加監控項
有時候server端中自帶的模板沒有提供我們所需要的監控項,就需要我們手動進行添加監控項
客戶端自定義監控取值-->服務端web獲取監控項鍵值
1)簡單的自定義監控配置(單一服務狀態)
原理:
編輯客戶端配置文件,新增UserParameter=
舉例:監控nginx服務是否啟動(ps -ef |grep -c [n]ginx)
方式一,直接修改/etc/zabbix/zabbix_agent.conf配置文件參數:
vim /etc/zabbix/zabbix_agent2.conf
UserParameter=web_state,ps -ef |grep -c [n]ginx
方式二:在/etc/zabbix/zabbix_agent2.d/目錄下編寫自定義監控文件
vim web_server.conf
## UserParameter=鍵(變量名),值(變量信息)
UserParameter=web_state,ps -ef|grep -c [n]ginx
重啟服務:
systemctl restart zabbix-agent2
在服務端中測試:
yum install -y zabbix-get
zabbix_get -s 192.168.81.162 -k 'web_state'
WEB配置:
創建監控項
配置---主機---選擇設置監控項的主機---進入【監控項】---【創建監控項】
監控項頁面配置:
名稱:設置監控項名稱web_server_status→ 鍵值:設置定義好的監控項web_state→ 信息類型:指定監控輸出信息字符類型
→ 單位:指定輸出內容單位信息→ 更新間隔時間:默認30s→ 創建新的應用集:server-status(將新的監控項添加到新的應用集中)
檢查是否收集到監控信息:
監測→ 最新數據→ 應用集:篩選server_status
2)復雜的自定義監控配置(多個服務狀態)
監控一台主機上的多個服務的狀態,比如nginx,ssh,mysql等等多個服務的狀態信息,我們可以在在/etc/zabbix/zabbix_agent2.d/目錄下定義多個服務配置文件,當然,這樣比較麻煩,我們可以通過以下方法簡化配置:在/etc/zabbix/zabbix_agent2.d/下,定義一個傳參的配置文件,然后在WEB中,分別配置不同服務的監控項,這樣就節約了agent端配置多個配置文件的時間。
舉例:
將上面實驗1中的web_server.conf 改名為server_state.conf
# cd /etc/zabbix/zabbix_agentd.d/
# mv web_server.conf server_state.conf
# vim server_state.conf
UserParameter=server_state[*],ps -ef|grep -c $1
在zabbix-server命令測試
zabbix_get -s 172.16.1.7 -k 'server_state[ssh]'
在WEB中新建不同的監控項
以監控ssh服務狀態為例:
查看監測結果:
同理可以定義其它服務如:nginx,mysqld等等監控項
zabbix添加告警
1)頁面報警
創建觸發器(配置---主機---選擇相應監控主機觸發器---創建觸發器)
設置表達式:
#{監控主機名稱:鍵值名稱.調用的表達式函數}<=2
{m02:server_state[nginx].last()}<=2
參數說明:
last() 收集到最新信息(數值) *****
max() 在一定周期內,收集到的最大值
min() 在一定周期內,收集到的最小值
diff() 在一定時間內,判斷收集的信息是否不同
change() 在一定時間內,判斷收集的信息是否不同
avg() 取一段時間的平均值
至此: 已經看到提示報警
2)郵件告警
實驗nginx掛了將告警信息發送到郵箱
添加報警媒介,類型為Email,這里查了很多博客,全是以mailx為主的,需要配置腳本,其實我覺得直接用zabbix自己的email就可以,以163郵箱為例,先在web界面上創建一個email報警媒介,
發送測試郵件
假設nginx服務停止了,我們要通過配置里面的動作選項,經過動作里面的設置,讓指定用戶通過報警媒介發送郵件給指定負責人,剛剛配置好了報警媒介,現在配置動作:
可以將通過不同的分組將不同級別的報警進行分組發送,通過操作步驟將報警升級:比如,1h內責任人未進行報警處理,那么就自動進行第二步操作將告警發送給上級領導
配置 操作:
故障{TRIGGER.STATUS},服務器:{HOSTNAME1}發生: {TRIGGER.NAME}故障!
告警主機:{HOSTNAME1}
告警時間:{EVENT.DATE} {EVENT.TIME}
告警等級:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警項目:{TRIGGER.KEY1}
問題詳情:{ITEM.NAME}:{ITEM.VALUE}
當前狀態:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
現在配置好了動作,最后需要配置指定用戶發送郵件給負責人,指定用戶在動作選項已經選擇超級管理員Admin,現在選擇user setting配置
3)釘釘告警
實驗nginx掛了將告警信息發送到釘釘
先添加釘釘機器人, 將Webhook復制,填寫到下面腳本中
還需設置安全設置,我這只把zabbix-server地址填進去,這樣就禁止其他IP使用webhook
配置釘釘機器人腳本,釘釘Webhook代碼:
vim /usr/lib/zabbix/alertscripts/dingding.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests,json,sys,os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "webhook地址"
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
"at": {
"atMobiles": [
"186..." #需要@群里誰
],
"isAtAll": True #是否全部@,True為是,False為否
}
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[1]
msg(text)``
在zabbix-server的配置文件找到 ,進入對應的文件目錄/usr/lib/zabbix/alertscripts,這里是存放zabbix腳本的地方,web端可以通過執行此目錄修下的腳本,將腳本內容copy到dingding.py,給他執行權限 chmod +x dingding.py
記住腳本放置位置:
AlertScriptsPath=/usr/lib/zabbix/alertscripts
測試釘釘腳本:
釘釘信息:
配置報警媒介
在web端配置釘釘腳本媒介
腳本參數:https://www.dell.com/zh-cn
{ALERT.MESSAGE}
配置動作
接下來就是配置動作,和郵件一樣,只需要更改報警媒介為創建好的“釘釘報警”,最后添加User setting中的報警媒介,和之前一樣,在添加一個釘釘報警的
配置用戶
配置用戶Admin發送郵件:
測試\
4)企業微信告警
https://www.jianshu.com/p/ad72ca92120d
分布式監控:
分布式監控的作用
分擔server的集中式壓力 Agent > proxy >server
解決多機房之間的網絡延時問題 上海 > proxy > server