prometheus2.0 在參數上有原先的1.X有較大的變化,很多參數被去掉了。另外優化了CPU占用、存儲空間占用等,具體可以看官方文檔。
這裡貼一下prometheus2.0的聯邦(又稱Shard)搭建方法,一些理論知識就不貼了,自己去google扒吧:
聯邦有不同的用例。它通常用于實作可擴充的prometheus,或者将metrics從一個服務的prometheus拉到另一個Prometheus上用于展示。
分層聯邦:
分層聯邦允許普羅米修斯擴充到數十個資料中心和數百萬個節點的環境。在這種用例中,聯邦拓撲類似于一棵樹,更進階别的普羅米修斯伺服器從大量的從屬伺服器收集彙總的時間序列資料。
跨服務聯邦:
In cross-service federation, a Prometheus server of one service is configured to scrape selected data from another service's Prometheus server to enable alerting and queries against both datasets within a single server.
在跨服務聯合中,一個服務的普羅米修斯伺服器被配置為從另一個服務的普羅米修斯伺服器中刮取標明的資料,以使得能夠針對單個伺服器内的兩個資料集進行警報和查詢。
For example, a cluster scheduler running multiple services might expose resource usage information (like memory and CPU usage) about service instances running on the cluster. On the other hand, a service running on that cluster will only expose application-specific service metrics. Often, these two sets of metrics are scraped by separate Prometheus servers. Using federation, the Prometheus server containing service-level metrics may pull in the cluster resource usage metrics about its specific service from the cluster Prometheus, so that both sets of metrics can be used within that server.
例如,運作多個服務的叢集排程程式可能會暴露有關在叢集上運作的服務執行個體的資源使用情況資訊(如記憶體和CPU使用情況)。另一方面,在該群集上運作的服務将僅公開特定于應用程式的服務度量标準。通常,這兩套名額是由單獨的普羅米修斯伺服器來抓取的。使用聯邦,包含服務級别度量的普羅米修斯伺服器可以從叢集普羅米修斯拉入有關其特定服務的叢集資源使用度量,以便這兩組度量可以在該伺服器内使用。
【舉個例子:我們要監控mysqld的運作狀态,可以使用1個主Prometheus+2個分片Prometheus(一個用來采集node_exporter的metrics、一個用來采集mysql_exporter的metrics),然後在主Prometheus上做彙總】
安裝prometheus和mysqld_exporter、postgres_exporter的步驟也不寫了,很簡單的,exporter的部署我們通常用ansible或saltstack之類的工具批量分發。
我這裡實驗起見,在一台機器上跑了3個shard節點,1個global節點。
Node1: 10.0.20.25 (跑了老版本的prometheus1.7、mysql_exporter、postgres_exporter,這是之前做實驗搭建的環境)
Node2: 10.0.20.26 (跑了prometheus2.0、mysql_exporter、postgres_exporter)
下面開始在Node2上開始我們的聯邦的配置吧。
注意: 我這裡做實驗的時候,跨服務聯邦的配置還不太規範,照官方的說法是 采用多個獨立的Prometheus節點分别采集node_exporter、mysql_exporter、postgres_exporter 這些metrics,然後再在GLOBAL節點做彙總。
cd /usr/local/prometheus
編寫存放要采集主機的檔案:
cat mysqld.json
1
2
3
4
5
6
7
8
9
10
11
12
13
<code>[</code>
<code> </code><code>{</code>
<code> </code><code>"targets"</code><code>: [</code>
<code> </code><code>"10.0.20.26:9104"</code><code>,</code>
<code> </code><code>"10.0.20.26:9100"</code><code>,</code>
<code> </code><code>"10.0.20.25:9104"</code><code>,</code>
<code> </code><code>"10.0.20.25:9100"</code>
<code> </code><code>],</code>
<code> </code><code>"labels"</code><code>: {</code>
<code> </code><code>"services"</code><code>: </code><code>"dba_test"</code><code>,</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code>]</code>
cat pgsql.json
<code> </code><code>"10.0.20.26:9187"</code><code>,</code>
<code> </code><code>"10.0.20.25:9187"</code>
<code> </code><code>"services"</code><code>: </code><code>"dba_test_pgsql"</code><code>,</code>
3個Shard節點配置檔案如下:
節點1,搜集的是mysql的資訊
cat prometheus1.yml
14
15
16
<code>global:</code>
<code> </code><code>scrape_interval: 15s </code><code># Set the scrape interval to every 15 seconds. Default is every 1 minute.</code>
<code> </code><code>evaluation_interval: 15s </code><code># Evaluate rules every 15 seconds. The default is every 1 minute.</code>
<code> </code><code># scrape_timeout is set to the global default (10s).</code>
<code>alerting:</code>
<code> </code><code>alertmanagers:</code>
<code> </code><code>- static_configs:</code>
<code> </code><code>- targets:</code>
<code> </code><code># - alertmanager:9093</code>
<code>rule_files:</code>
<code> </code><code># - "first_rules.yml"</code>
<code> </code><code># - "second_rules.yml"</code>
<code>scrape_configs:</code>
<code> </code><code>- job_name: </code><code>'mysql'</code>
<code> </code><code>file_sd_configs:</code>
<code> </code><code>- files: [</code><code>'./mysqld.json'</code><code>]</code>
節點2,搜集的是pgsql的資訊
cat prometheus2.yml
<code> </code><code>- job_name: </code><code>'pgsql'</code>
<code> </code><code>- files: [</code><code>'./pgsql.json'</code><code>]</code>
節點3,搜集的是prometheus節點的資訊
cat prometheus3.yml
17
18
19
<code> </code><code>- job_name: </code><code>'prometheus25'</code>
<code> </code><code>static_configs:</code>
<code> </code><code>- targets: [</code><code>'10.0.20.25:9090'</code><code>]</code>
<code> </code><code>- job_name: </code><code>'prometheus26'</code>
<code> </code><code>- targets: [</code><code>'10.0.20.26:9090'</code><code>]</code>
然後,啟動3個分片節點:
<code>.</code><code>/prometheus</code> <code>--web.listen-address=</code><code>"0.0.0.0:9091"</code> <code>--storage.tsdb.path=</code><code>"data1/"</code> <code>--config.</code><code>file</code><code>=</code><code>"prometheus1.yml"</code> <code>--web.</code><code>enable</code><code>-admin-api</code>
<code>.</code><code>/prometheus</code> <code>--web.listen-address=</code><code>"0.0.0.0:9092"</code> <code>--storage.tsdb.path=</code><code>"data2/"</code> <code>--config.</code><code>file</code><code>=</code><code>"prometheus2.yml"</code> <code>--web.</code><code>enable</code><code>-admin-api </code>
<code>.</code><code>/prometheus</code> <code>--web.listen-address=</code><code>"0.0.0.0:9093"</code> <code>--storage.tsdb.path=</code><code>"data3/"</code> <code>--config.</code><code>file</code><code>=</code><code>"prometheus3.yml"</code> <code>--web.</code><code>enable</code><code>-admin-api</code>
再來配置GLOBAL節點:
cat prometheus.yml 内容如下:
20
21
22
23
24
25
26
27
<code> </code><code>- job_name: </code><code>'federate'</code>
<code> </code><code>scrape_interval: 15s</code>
<code> </code><code>honor_labels: </code><code>true</code>
<code> </code><code>metrics_path: </code><code>'/federate'</code>
<code> </code><code>params:</code>
<code> </code><code>'match[]'</code><code>:</code>
<code> </code><code>- </code><code>'{job=~"prometheus.*"}'</code>
<code> </code><code>- </code><code>'{job="mysql"}'</code>
<code> </code><code>- </code><code>'{job="pgsql"}'</code>
<code> </code><code>- targets:</code>
<code> </code><code>- </code><code>'10.0.20.26:9091'</code>
<code> </code><code>- </code><code>'10.0.20.26:9092'</code>
<code> </code><code>- </code><code>'10.0.20.26:9093'</code>
啟動GLOBAL節點:
<code>.</code><code>/prometheus</code> <code>--web.listen-address=</code><code>"0.0.0.0:9090"</code> <code>--storage.tsdb.path=</code><code>"data_global/"</code> <code>--config.</code><code>file</code><code>=</code><code>"prometheus.yml"</code> <code>--web.</code><code>enable</code><code>-admin-api</code>
配好後,整個目錄 如下圖:
可以通路原先的3個shard節點,擷取到對應的mysql、pgsql、prometheus的采集資訊:
<a href="http://10.0.20.26:9091/graph">http://10.0.20.26:9091/graph</a>
<a href="http://10.0.20.26:9091/graph">http://10.0.20.26:9092/graph</a>
<a href="http://10.0.20.26:9091/graph">http://10.0.20.26:9093/graph</a>
這樣,我們就配好了prometheus的聯邦啦。是不是很簡單??
注意: 有些時候 ,我們要求告警資訊實時性特别高,這種情況下,告警的采集(以granfana為例)不建議使用連接配接到聯邦GLOBAL節點的方式,建議直連後端對應的Shard節點,以免因為GLOBAL采集資料延遲,而導緻發送告警的延遲情況出現。
結合grafana:
然後,可以在grafana裡面做展示了,直接上圖:
這裡填instance 的時候,我用了個通配符,一次性列出符合條件的全部主機,但是唯一的缺點是,這樣就不能用grafana自帶的告警啦,因為目前grafana的告警還不支援動态寫法,除非我們寫死了node_load5{instance=~'10.0.20.26:9100'} 這樣才行。
下面是我配好的部分截圖:
本文轉自 lirulei90 51CTO部落格,原文連結:http://blog.51cto.com/lee90/2062252,如需轉載請自行聯系原作者