文章目錄
- 一.前置知識
- 1.監控與報警
- 2.監控系統的設計
- 3.監控系統的分類
- 二、prometheus概述
- 1.什么是prometheus
- 2.prometheus的歷史
- 3.為什么要學習prometheus
- 4.prometheus的使用場景
- 5.prometheus的宏觀架構圖
- 6.prometheus軟件下載地址
- 三、部署prometheus server監控軟件
- 1.同步集群時間
- 2.下載prometheus軟件包
- 3.安裝prometheus軟件包
- 4.查看prometheus程序的幫助信息
- 5.前臺啟動prometheus服務
- 6.后臺啟動prometheus服務
- 7.prometheus的配置文件說明
- 8. 練習
- 四、部署node exporter監控軟件
- 五、通過容器啟動node_exporter和cadvisor
- 六、添加靜態配置(static_configs)實戰案例
- 七、動態發現添加exporter實戰案例
- 八、prometheus監控數據格式概述
- 九、查看Linux相關的key
- 十、prometheus中常用的函數
- 十一、課堂練習
- 十二、pushgateway的部署
- 十三、監控TCP狀態腳本案例
- 十四、監控容器運行時間腳本案例
- 十五、prometheus微觀架構(了解即可)
- 十六、企業級監控案例
- 十七、alertmanager實戰案例
- 十八、可能會遇到的問題
- 私信詢問
- 詳細可以私信詢問Kubernetes進階篇day6,day07,day08,day09,day10,day11,day12,
一.前置知識
1.監控與報警
很多小伙伴總是把監控和報警混在混在一起說,其實這是兩個概念,我們需要單獨理解。監控:監控是把行為表現展示出來,用來觀察的。報警:報警則是當監控獲取的數據發生異常并且到達了某個臨界點的時候,采用各種報警媒介來通知用戶(比如項目負責人,運維人員,公司領導等)。
2.監控系統的設計
如果監控系統設計的不好,那么在實際工作中可能會頻繁出問題。監控系統的設計部分應該包括但不限于以下幾個參考點:(1)評估系統的業務流程,業務種類和架構系統各個企業的產品不同,業務方向不同,程序代碼不同,系統架構更不同。因此對于各個地方的細節都需要有一定程度的認知,才可以開起設計的源頭。(2)分類出所需的監控系種類:一般可分為業務級別監控,系統級別監控,網絡監控,程序代碼監控,日志監控,用戶行為分析監控和其它種類監控。(3)監控技術的方案選擇各種監控軟件層出不窮,開源的,商業的,自行開發的,幾百種可選方案。運維架構師憑借一些因素開始選材,針對企業的結構特點,大小,種類,人員多少等等選擇合適的技術方案。(4)監控的人員安排運維團隊的任務劃分,責任到人,分塊進行。開發團隊的配合人員選取,很多監控涉及的工作,都需要跟開發人員配合才開源進行。(5)其它
3.監控系統的分類
接下來我們對監控系統的分類做簡單的概要說明,讓大家對這些數據有一個大致的印象。業務監控:可以包含用戶訪問QPS,DAU日活,訪問狀態(可以基于返回狀態碼),業務接口(注冊,登錄,聊天,上傳,留言,短信,搜索等),產品轉換率,充值額度,用戶投訴等等這些宏觀的概念(公司上層領導比較關心,因此我們運維人員應該將其放在第一位)。系統監控:主要是跟操作系統相關的基本監控項,比如CPU,內存,硬盤,IO,TCP鏈接,流量等等。網絡監控:對網絡狀態的監控(交換機,路由器,防火墻,VPN等),互聯網公司必不可少,但是很多時候又被忽略,例如:IDC機房內網之間,外網之間的丟包率,延遲等等。日志監控:監控中的重頭戲,往往單獨設計和搭建,全部種類的日志都有需要采集,常見的解決方案如Elstic stack(有免費版),Splunk(付費版)等。程序監控:一般需要和開發人員配合,程序中嵌入各種接口,直接獲取數據或者特質的日志格式。
二、prometheus概述
1.什么是prometheus
Prometheus是一個開源系統監控和警報工具包,最初是在SoundCloud上構建的。自2012年成立以來,許多公司和組織都采用了Prometheus,該項目擁有非常活躍的開發者和用戶社區。Prometheus現在是一個獨立的開源項目,獨立于任何公司進行維護。為了強調這一點,并澄清項目的治理結構,Prometheus于2016年加入云原生計算基金會,作為繼Kubernetes之后的第二個托管項目。我們可以簡單的理解Prometheus是一個監控系統同時也是一個時間序列數據庫。推薦閱讀:官網地址:https://prometheus.io官方文檔:https://prometheus.io/docs/introduction/overview/GitHub地址:https://github.com/prometheus
2.prometheus的歷史
Prometheus受啟發于Google的Brogmon監控系統(相似的Kubernetes是從Google的Brog系統演變而來),從2012年開始由前Google工程師在Soundcloud以開源軟件的形式進行研發,并且于2015年早期對外發布早期版本。2016年5月繼Kubernetes之后成為第二個正式加入CNCF基金會的項目,同年6月正式發布1.0版本。2017年底發布了基于全新存儲層的2.0版本,能更好地與容器平臺、云平臺配合。Prometheus作為新一代的云原生監控系統,目前已經有超過650+位貢獻者參與到Prometheus的研發工作上,并且超過120+項的第三方集成。推薦閱讀:https://www.prometheus.wang/quickstart/why-monitor.html
3.為什么要學習prometheus
可能你在網上看到了有網友使用zabbix監控docker和kubernetes的解決方案,并行之有效,那咱們為啥還要學習prometheus這個監控系統呢?Prometheus是一個開源的完整監控解決方案,其對傳統監控系統的測試和告警模型進行了徹底的顛覆,形成了基于中央化的規則計算、統一分析和告警的新模型。 相比于傳統監控系統Prometheus具有以下優點:(1)易于管理Prometheus核心部分只有一個單獨的二進制文件,不存在任何的第三方依賴(數據庫,緩存等等)。唯一需要的就是本地磁盤,因此不會有潛在級聯故障的風險。Prometheus基于Pull模型的架構方式,可以在任何地方(本地電腦,開發環境,測試環境)搭建我們的監控系統。對于一些復雜的情況,還可以使用Prometheus服務發現(Service Discovery)的能力動態管理監控目標。(2)監控服務的內部運行狀態Pometheus鼓勵用戶監控服務的內部狀態,基于Prometheus豐富的Client庫,用戶可以輕松的在應用程序中添加對Prometheus的支持,從而讓用戶可以獲取服務和應用內部真正的運行狀態。(3)時間序列(time series)所謂的時間序列(time series)指的是一系列有序的數據,通常是指等時間間隔的采樣數據,說白了就是分為X和Y軸,其中X軸是按照時間間隔進行推進,而Y軸是有序的數字。(4)強大的數據模型所有采集的監控數據均以指標(metric)的形式保存在內置的時間序列數據庫當中(TSDB)。所有的樣本除了基本的指標名稱以外,還包含一組用于描述該樣本特征的標簽。(5)強大的查詢語言PromQLPrometheus內置了一個強大的數據查詢語言PromQL。 通過PromQL可以實現對監控數據的查詢、聚合。同時PromQL也被應用于數據可視化(如Grafana)以及告警當中。通過PromQL可以輕松回答類似于以下問題:1>.在過去一段時間中95%應用延遲時間的分布范圍?2>.預測在4小時后,磁盤空間占用大致會是什么情況?4>.CPU占用率前5位的服務有哪些?(過濾)(6)高效對于監控系統而言,大量的監控任務必然導致有大量的數據產生。而Prometheus可以高效地處理這些數據,對于單一Prometheus Server實例而言它可以處理:數以百萬的監控指標和每秒處理數十萬的數據點。而zabbix對此相對來說就有點吃力了;(7)可擴展(支持集群)Prometheus是如此簡單,因此你可以在每個數據中心、每個團隊運行獨立的Prometheus Sevrer。Prometheus對于聯邦集群的支持,可以讓多個Prometheus實例產生一個邏輯集群,當單實例Prometheus Server處理的任務量過大時,通過使用功能分區(sharding)+聯邦集群(federation)可以對其進行擴展。(8)易于集成使用Prometheus可以快速搭建監控服務,并且可以非常方便地在應用程序中進行集成。目前支持: "Java","JMX","Python","Go","Ruby",".Net", "Node.js"等等語言的客戶端SDK,基于這些SDK可以快速讓應用程序納入到Prometheus的監控當中,或者開發自己的監控數據收集程序。同時這些客戶端收集的監控數據,不僅僅支持Prometheus,還能支持Graphite這些其他的監控工具。同時Prometheus還支持與其他的監控系統進行集成:"Graphite", "Statsd", "Collected", "Scollector", "muini", "Nagios"等。Prometheus社區還提供了大量第三方實現的監控數據采集支持:"JMX", "CloudWatch", "EC2","MySQL","PostgresSQL", "Haskell", "Bash", "SNMP", "Consul", "Haproxy", "Mesos", "Bind", "CouchDB", "Django", "Memcached", "RabbitMQ", "Redis", "RethinkDB", "Rsyslog"等等。(9)可視化Prometheus Server中自帶了一個Prometheus UI,通過這個UI可以方便地直接對數據進行查詢,并且支持直接以圖形化的形式展示數據。同時Prometheus還提供了一個獨立的基于Ruby On Rails的Dashboard解決方案Promdash。最新的Grafana可視化工具也已經提供了完整的Prometheus支持,基于Grafana可以創建更加精美的監控圖標。基于Prometheus提供的API還可以實現自己的監控可視化UI。(10)開放性通常來說當我們需要監控一個應用程序時,一般需要該應用程序提供對相應監控系統協議的支持。因此應用程序會與所選擇的監控系統進行綁定。為了減少這種綁定所帶來的限制。對于決策者而言要么你就直接在應用中集成該監控系統的支持,要么就在外部創建單獨的服務來適配不同的監控系統。而對于Prometheus來說,使用Prometheus的client library的輸出格式不止支持Prometheus的格式化數據,也可以輸出支持其它監控系統的格式化數據,比如Graphite。因此你甚至可以在不使用Prometheus的情況下,采用Prometheus的client library來讓你的應用程序支持監控數據采集。Prometheus除了上述說到的優點,其實也有以下不足之處:(1)學習成本太大,尤其是其獨有的數學命令行,學習起來很吃力,而且全是英文文檔;(2)對磁盤資源也是耗費的較大,這個具體要看監控的集群量和監控項的多少和保存時間的長短;(3)有網友稱在1.x版本中可能會發生數據丟失的風險,因此生產環境中建議大家使用較新的2.x發行版;溫馨提示:(1)zabbix采用的是MySQL數據庫,Prometheus采用的是時間序列數據庫,由于監控數據并不需要更新,監控數據會存在大量的寫入和查詢,其底層實現會更高,具體細節原理可自行查閱資料,Prometheus是支持外部數據庫存儲的,但我覺得完全沒有必要在生產環境中這樣做;(2)如果上述10點還不足以打動你學習Prometheus,那我再說一點比較現實的,國內目前很多中小企業都在使用Prometheus監控docker,Kubernetes,學習它有助于咱們找工作。
4.prometheus的使用場景
適用的場景(When does it fit?)Prometheus適用于記錄任何純數字時間序列。它既適合以機器為中心的監控,也適合監控高度動態的面向服務的架構。在微服務的世界中,它對多維數據收集和查詢的支持是一個特殊的優勢。Prometheus是為可靠性而設計的,它是您在中斷期間訪問的系統,讓您能夠快速診斷問題。每個 Prometheus服務器都是獨立的,不依賴于網絡存儲或其他遠程服務。當基礎架構的其他部分損壞時,您可以依賴它,并且您無需設置大量基礎架構即可使用它。(請記住該點,這是優點也是缺點喲~)不適用的場景(When does it not fit?)如上所示,Prometheus重視可靠性。即使在出現故障的情況下,您也可以隨時查看有關系統的可用統計信息。如果您需要100%的準確性,例如按請求計費,Prometheus不是一個好的選擇,因為收集的數據可能不夠詳細和完整。在這種情況下,您最好使用其他系統來收集和分析計費數據,并使用Prometheus進行其余的監控。推薦閱讀:https://prometheus.io/docs/introduction/overview/#when-does-it-fithttps://prometheus.io/docs/introduction/overview/#when-does-it-not-fit
5.prometheus的宏觀架構圖
如下圖所示,展示了普羅米修斯(prometheus)的建筑和它的一些生態系統組成部分。(1)Prometheus server:prometheus的服務端,負責收集指標和存儲時間序列數據,并提供查詢接口。(2)exporters:如果想要監控,前提是能獲取被監控端數據,并且這個數據格式必須遵循Prometheus數據模型,這樣才能識別和采集,一般使用exporter數據采集器(類似于zabbix_agent端)提供監控指標數據。exporter數據采集器,除了官方和GitHub提供的常用組件exporter外,我們也可以為自己自研的產品定制exporters組件喲。(3)Pushgateway:短期存儲指標數據,主要用于臨時性的任務。比如備份數據庫任務監控等。本質上我們可以理解為Pushgateway可以幫咱們監控自定義的監控項,這需要咱們自己編寫腳本來推送到Pushgateway端,而后由Prometheus server從Pushgateway去pull監控數據。換句話說,請不要被官方的架構圖蒙騙了,咱們完全可以基于Pushgateway來監控咱們自定義的監控項喲,這些監控項完全可以是長期運行的呢!(4)Service discovery:服務發現,例如我們可以配置動態的服務監控,無需重啟Prometheus server實例就能實現動態監控。(5)Alertmanager:支持報警功能,比如可以支持基于郵件,微信,釘釘報警。據網友反饋該組件在生產環境中存在缺陷,因此我們可以考慮使用Grafana來展示并實現報警功能。(6)Prometheus Web UIPrometheus比較簡單的Web控制臺,通常我們可以使用grafana來集成做更漂亮的Web展示喲。溫馨提示:大多數Prometheus組件都是用Go編寫的,這使得它們易于構建和部署為靜態二進制文件
6.prometheus軟件下載地址
官方的下載地址:https://prometheus.io/download/推薦閱讀:https://prometheus.io/docs/instrumenting/exporters/https://github.com/danielqsj/kafka_exporterhttps://github.com/prometheus-community/elasticsearch_exporterhttps://github.com/oliver006/redis_exporterhttps://github.com/prometheus/mysqld_exporterhttps://github.com/nlighten/tomcat_exporterhttps://github.com/nginxinc/nginx-prometheus-exporterhttps://github.com/dabealu/zookeeper-exporter...
三、部署prometheus server監控軟件
1.同步集群時間
我們在安裝prometheus server監控軟件之前,需要同步集群時間。由于prometheus是一個時間序列數據庫,因此其對系統時間的準確性要求很高,必須保證本機時間實時同步。關于集群時間同步,此處我就不浪費口舌了,在以前的章節中我們已經介紹過了,請自行實現。僅供參考:yum -y install ntpdate && ntpdate ntp1.aliyun.com
2.下載prometheus軟件包
如下圖所示,我們在下載軟件之前,可以先選擇prometheus將要安裝的操作系統及其CPU架構.推薦閱讀:https://prometheus.io/download/
3.安裝prometheus軟件包
[root@docker01 /buffes/softwares]# tar xf prometheus-2.28.0.linux-amd64.tar.gz -C /buffes/softwares/
[root@docker01 /buffes/softwares]#
[root@docker01 /buffes/softwares]# cd /oldboy/softwares/
[root@docker01 /buffes/softwares]#
[root@docker01 /buffes/softwares]#
[root@docker01 /buffes/softwares]# ln -sv prometheus-2.28.0.linux-amd64 prometheus
"prometheus" -> "prometheus-2.28.0.linux-amd64"
[root@docker01 /buffes/softwares]# 溫馨提示:建議大家創建符號鏈接,不僅僅可以輸入更短的路徑,而是方便版本管理。
4.查看prometheus程序的幫助信息
[root@docker01 /buffes/softwares/prometheus]# ./prometheus --help溫馨提示:啟動時若不指定配置文件,則會使用其默認的配置參數喲:"--config.file"的默認值為"prometheus.yml""--web.listen-address"的默認值為"0.0.0.0:9090""--web.max-connections"的默認值為"512
5.前臺啟動prometheus服務
[root@docker01 /buffes/softwares/prometheus]# ./prometheus 生產環境中啟動參數參考案例:--web.listen-address="0.0.0.0:9090"--web.read-timeout=5m請求連接最大的等待時間,防止太多的空閑鏈接占用資源。--web.max-connections=10最大網絡連接數。--storage.tsdb.path="data/"指定本地存儲數據的路徑,這個參數很重要,請將指定的路徑有足夠的存儲空間。不要隨便放在一個目錄,比如某些開發隨意將數據放在根目錄下,導致根目錄存儲容量100%,從而見解導致服務(我在生產環境中就有一個開發犯過這樣的錯誤,導致tomcat無法訪問)無法訪問,甚至連sshd服務也無法對外提供服務。--storage.tsdb.retention=15dprometheus開始采集監控數據后,會存在內存和硬盤中。對于保留期限的設置很重要,太長的話硬盤和內存吃不消,太短的話要查看歷史數據就沒有了,企業中設置15天(保留最近2個星期的數據)比較合適。--query.timeout=2m 可以防止用戶查詢語句出現了慢查詢超過2分鐘后會自動中止PQL的執行喲~--query.max-concurrency=20防止太多的用戶并發查詢。溫馨提示:(1)如下圖所示,我們啟動時可以使用默認配置參數,啟動服務時會阻塞當前終端。(2)如果想要后臺啟動可以使用nohup工具實現后臺啟動;
6.后臺啟動prometheus服務
[root@docker01 ~]# vim /etc/profile.d/prometheus.sh
[root@docker01 ~]#
[root@docker01 ~]# cat /etc/profile.d/prometheus.sh
#!/bin/bashexport PROMETHEUS_HOME=/oldboy/softwares/prometheus
export PATH=$PATH:$PROMETHEUS_HOME
[root@docker01 ~]#
[root@docker01 ~]# source /etc/profile.d/prometheus.sh
[root@docker01 ~]#
[root@docker01 ~]# nohup prometheus --config.file="$PROMETHEUS_HOME/prometheus.yml" &>>/var/log/buffes_prometheus.log &
[1] 2728
[root@docker01 ~]# 除了使用nohup工具之外,我們也可以使用"screen"工具將其放在后臺管理喲:(1)screen -ls查看放在后臺的進程。存在"Attached"和"Detached"兩種進程。(2)screen開啟一個終端,可以運行一些命令,比如ping,然后按"ctrl + a + d"直接將當前終端放在后臺。"crtl + d"則表示直接退出當前終端。(3)screen -r ID進入到某個終端ID,建議進入到標記有"Detached"的終端喲~ 溫馨提示:當screen管理幾十個后臺任務時,可能就有點可讀性較差了,此時我們也可以使用daemonize將其放入后臺進行管理
7.prometheus的配置文件說明
global:scrape_interval: 設置prometheus采集數據的間隔時間,默認是1分鐘。通常該值設置15秒就夠用了。學習環境中我們可以將其設置為5秒。如果設置的間隔時間過短,比如設置為1秒,可能會造成更多的存儲空間喲。evaluation_interval: 監控數據規則的評估評論,默認值為每1分鐘。通常該值設置每15秒評估一次規則就夠用了。舉個例子: 假如我們定義的rule(規則)是當內存使用率大于70%就發出報警,那么prometheus會默認15秒來執行這個規則并檢查內存的情況。# Alertmanager configuration(先戰略性忽略)
alerting:alertmanagers:- static_configs:- targets:# - alertmanager:9093rule_files:# - "first_rules.yml"# - "second_rules.yml"# 抓取數據的配置
scrape_configs:job_name: 定義任務的名稱。static_configs:定義靜態的配置,比如使用targets指定要監控的對象。file_sd_configs:定義基于文件的動態配置,比如使用files指定文件路徑,使用refresh_interval指定監控的間隔時間。溫馨提示:(1)Alertmanager configuration是用來報警的,我們會有專門的章節來講解它,此處先忽略;(2)Alertmanager也可以被其它插件取代,比如基于grafana實現監控報警;
8. 練習
默認情況下是無賬號密碼驗證的,我們可以基于nginx實現反向代理,而后設置相應的賬號密碼。該步驟過于簡單,請同學們使用5分鐘搞定,課件休息10分鐘。
四、部署node exporter監控軟件
五、通過容器啟動node_exporter和cadvisor
六、添加靜態配置(static_configs)實戰案例
七、動態發現添加exporter實戰案例
八、prometheus監控數據格式概述
九、查看Linux相關的key
十、prometheus中常用的函數
十一、課堂練習
十二、pushgateway的部署
十三、監控TCP狀態腳本案例
十四、監控容器運行時間腳本案例
十五、prometheus微觀架構(了解即可)
十六、企業級監控案例
十七、alertmanager實戰案例
十八、可能會遇到的問題
…
…
…