大數據技術與架構 大數據技術與架構node
在進入本文以前,我先問你們一個問題,大家公司或者業務系統上是如何對生產集羣上的數據同步任務、實時計算任務或者是調度任務自己的執行狀況和日誌進行監控的呢?可能你會回答是自研或者ELK系統或者Zabbix系統。
今天咱們要介紹的主角可能會弔打上面的監控系統哦。
隨着容器技術的發展,Kubernetes 已然成爲你們追捧的容器集羣管理系統。Prometheus 做爲生態圈 Cloud Native Computing Foundation(簡稱:CNCF)中的重要一員,其活躍度僅次於 Kubernetes,現已普遍用於 Kubernetes 集羣的監控系統中。
在 Flink 任務的監控上,本文將簡要介紹 Prometheus 體系中的組件如何使用,實例演示 Prometheus 的安裝,配置及使用。並最終造成一套 Flink 任務監控的解決方案。linux
Prometheus 是由前 Google 工程師從 2012 年開始在 Soundcloud 以開源軟件的形式進行研發的系統監控和告警工具包,自此之後,許多公司和組織都採用了 Prometheus 做爲監控告警工具。Prometheus 的開發者和用戶社區很是活躍,它如今是一個獨立的開源項目,能夠獨立於任何公司進行維護。爲了證實這一點,Prometheus 於 2016 年 5 月加入 CNCF 基金會,成爲繼 Kubernetes 以後的第二個 CNCF 託管項目。
最初,Prometheus 被用在微服務系統的監控上,微服務的落地一直都是業界重點關注的問題,其中除了部署難外,最大的問題就是集羣監控、系統配置和系統治理等方面的帶來的挑戰。
2019 年 Flink 橫空出世後,隨之而來的運維、監控成爲你們關注的重點。做爲新一代的監控框架,就像網易在實踐過程提出的同樣,Prometheus 具備如下特色:golang
Prometheus 的總體架構以及生態系統組件以下圖所示:
Prometheus Server 直接從監控目標中或者間接經過推送網關來拉取監控指標,它在本地存儲全部抓取到的樣本數據,並對此數據執行一系列規則,以彙總和記錄現有數據的新時間序列或生成告警。能夠經過 Grafana 或者其餘工具來實現監控數據的可視化。
Prometheus 生態圈中包含了多個組件,Prometheus 的主要模塊包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及圖形界面。其中許多組件是可選的:web
Prometheus 全部採集的監控數據均以指標(metric)的形式保存在內置的時間序列數據庫當中(TSDB):屬於同一指標名稱,同一標籤集合的、有時間戳標記的數據流。除了存儲的時間序列,Prometheus 還能夠根據查詢請求產生臨時的、衍生的時間序列做爲返回結果。
上面這段話是否是聽起來十分拗口?咱們用人話來解釋一下:
Prometheus 所採集到的數據被定義爲【指標】。存儲的數據爲【時間序列】,所謂時間序列(或稱動態數列)是指將同一統計指標的數值按其發生的時間前後順序排列而成的數列。而存儲的數據庫爲自帶的時序數據庫TSDB。正則表達式
Prometheus 中每一條時間序列由指標名稱(Metrics Name)以及一組標籤(鍵值對)惟一標識。其中指標的名稱(metric name)能夠反映被監控樣本的含義(例如,http_requeststotal — 表示當前系統接收到的 HTTP 請求總量),指標名稱只能由 ASCII 字符、數字、下劃線以及冒號組成,同時必須匹配正則表達式 [a-zA-Z:][a-zA-Z0-9:]*。
標籤的名稱只能由 ASCII 字符、數字以及下劃線組成並知足正則表達式 [a-zA-Z][a-zA-Z0-9_]*。其中以 _做爲前綴的標籤,是系統保留的關鍵字,只能在系統內部使用。標籤的值則能夠包含任何 Unicode 編碼的字符。數據庫
在時間序列中的每個點稱爲一個樣本(sample),樣本由如下三部分組成:apache
Prometheus 的客戶端庫中提供了四種核心的指標類型。編程
咱們能夠在官網下載Prometheus的安裝包:https://prometheus.io/download/ 。這裏咱們同時安裝Prometheus和Grafana,而後進行解壓:服務器
tar xvfz prometheus-*.tar.gz cd prometheus-*
啓動:微信
$ cd prometheus/ // 查看版本 $ ./prometheus --version // 運行server $ ./prometheus --config.file=prometheus.yml
訪問本地的http://localhost:9090/ 便可以看到Prometheus的graph頁面。
安裝grafana
rpm -ivh grafana-6.5.2-1.x86_64.rpm
啓動:
service grafana-server start
訪問http://localhost:3000/ 能夠看到grafana 界面。
固然,Prometheus還有不少其餘組件服務於不一樣的場景,例如pushgateway和nodeexporter。他們各自的做用能夠在官網查看。咱們暫時不作介紹。
這裏假設咱們要監控每個服務器的狀態,這時候咱們就須要node_manager這個組件。
咱們也是直接安裝啓動:
$ tar xvfz node_exporter-xxx.tar.gz // 進入解壓出的目錄 $ cd node_exporter-xxx // 運行監控採集服務 $ ./node_exporter
將node_exporter添加到Prometheus服務器,咱們請求一下本地的http://localhost:9090/ 能夠看到當前機器的一些指標:
總之,若是你要監控不一樣的目標,那麼就須要安裝Prometheus體系中不一樣的組件。關於詳細的安裝過程和配置過程咱們不作過多展開,你們能夠網上搜索有很是多的教程。
咱們先來看一下總體的監控架構:
這裏面有幾個核心的組件:
metrics.reporter.promgateway.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter metrics.reporter.promgateway.host: node1 metrics.reporter.promgateway.port: 9091 metrics.reporter.promgateway.jobName: flinkjobs metrics.reporter.promgateway.randomJobNameSuffix: false metrics.reporter.promgateway.deleteOnShutdown: true
prometheus.yml中的配置:
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] labels: instance: 'prometheus' - job_name: 'linux' static_configs: - targets: ['localhost:9100'] labels: instance: 'localhost' - job_name: 'pushgateway' static_configs: - targets: ['localhost:9091'] labels: instance: 'pushgateway'
而後咱們把 Flink集羣、nodeManager、pushGateway、Prometheus、Grafana分別啓動起來。
因爲上面一句配置好Flink、 nodeManager、pushGateway,而且在Grafana中已經添加了prometheus 數據源,因此Grafana中會自動獲取到 flink job的metrics 。咱們進入 Grafana 首頁,點擊New dashboard,建立一個新的dashboard。
選中以後,即會出現對應的監控指標
對於 Flink 任務,咱們須要監控的指標包括JobManager 服務器狀態、Checkpoint狀況、程序運行時長、Taskmanager內存,流量。甚至能夠加上operator的進出流量用來定位反壓問題。
事實上Prometheus自從一出世,便受到了關注,咱們用同程藝龍數據庫監控系統的實踐來看一下生產上是如何使用Prometheus的。
目前同程的總體監控架構設計以下圖所示:
其中幾個關鍵的組件以下:
這是同程用 golang 開發的監控信息採集 agent,負責採集監控指標和實例日誌。監控指標包括了該宿主機的相關信息(實例、容器)。
官方提供的組件,由於 Prometheus 是經過 pull 的方式獲取數據的,若是讓 Prometheus Server 去每一個節點拉數據,那麼監控服務的壓力就會很大,咱們是在監控幾千個實例的狀況下作到 10s 的採集間隔(固然採用聯邦集羣的模式也能夠,可是這樣就要須要部署 Prometheus Server。再加上告警相關的東西之後,整個架構會變的比較複雜。)。因此 agent 採起數據推送至 pushgateway,而後由 Prometheus Server 去 pushgateway 上面 pull 數據。這樣在 Prometheus Server 在寫入性能知足的狀況下,單臺機器就能夠承載整個系統的監控數據。考慮到跨機房採集監控數據的問題,能夠在每一個機房都部署 pushgateway 節點,同時還能緩解單個 pushgateway 的壓力。
Prometheus Server 去 pushgateway 上面拉數據的時間間隔設置爲 10s。多個 pushgateway 的狀況下,就配置多個組便可。爲了確保 Prometheus Server 的高可用,能夠再加一個 Prometheus Server 放到異地容災機房,配置和前面的 Prometheus Server 同樣。若是監控須要保留時間長的話,也能夠配置一個採集間隔時間較大的 Prometheus Server,好比 5 分鐘一次,數據保留 1 年。
使用 Alertmanager 前,須要先在 Prometheus Server 上面定義好告警規則。支持郵件、微信、webhook 多種類型,告警是經過 webhook 的方式,將觸發的告警推送至指定 API,而後經過這個接口的服務進行二次加工。
Prometheus 完美支持 Grafana,能夠經過 PromQL 語法結合 Grafana,快速實現監控圖的展現。爲了和運維平臺關聯,經過 url 傳參的方式,實現了運維平臺直接打開指定集羣和指定實例的監控圖。
目前同程基於 Prometheus 的監控系統,承載了整個平臺全部實例、宿主機、容器的監控。採集週期 10S,Prometheus 一分鐘內每秒平均攝取樣本數 9-10W。僅僅使用一臺物理機(不包括高可用容災資源)就能夠承載當前的流量,而且還有很大的容量空間(CPU\Memory\Disk)。若是將來單機沒法支撐的狀況下,能夠擴容成聯邦集羣模式。