Prometheus監控神器-Alertmanager篇(4)


本章節主要講解Alertmanager高可用的搭建與配置的詳細的知識內容。

為了提升Prometheus的服務可靠性,我們會部署兩個或多個的Prometheus服務,兩個Prometheus具有相同的配置(Job配、告警規則、等),當其中一個Down掉了以后,可以保證Prometheus持續可用。

AlertManager自帶警報分組機制,即使不同的Prometheus分別發送相同的警報給Alertmanager,Alertmanager也會自動把這些警報合並處理。

去重 分組 路由
Daduplicates Groups Route
將相同的警報合並成一個 根據定義的分組 經過路由分發給指定的receiver

雖然Alertmanager 能夠同時處理多個相同的Prometheus的產生的警報,如果部署的Alertmanager是單節點,那就存在明顯的的單點故障風險,當Alertmanager節點down機以后,警報功能則不可用。

解決這個問題的方法就是使用傳統的HA架構模式,部署Alertmanager多節點。但是由於Alertmanager之間關聯存在不能滿足HA的需求,因此會導致警報通知被Alertmanager重復發送多次的問題。

alertmanager-ha

Alertmanager為了解決這個問題,引入了Gossip機制,為多個Alertmanager之間提供信息傳遞機制。確保及時的在多個Alertmanager分別接受到相同的警報信息的情況下,不會發送重復的警報信息給Receiver.

Gossip 機制

要知道什么是Gossip機制,必須了解清楚Alertmanager中的每一次警報通知是如何產生的,下面一圖很詳細的闡述了警報個流程:

alertmanager-ha

階段 描述
Silence 在這個階段中Alertmanager會判斷當前通知是否匹配任何靜默規則;如果沒有則進入下一個階段,否則會中斷流程不發送通知。
Wait Alertmanager 會根據當前集群中所處在的順序[index],等待 index * 5s 的時間。
Dedup 當等待結束完成,進入 Dedup 階段,這時會判斷當前Alertmanager TSDB中警報是否已經發送,如果發送則中斷流程,不發送警報。
Send 如果上面的未發送,則進入 Send 階段,發送警報通知。
Gossip 警報發送成功以后,進入最后一個階段 Gossip ,通知其他Alertmanager節點,當前警報已經發送成功。其他Alertmanager節點會保存當前已經發送過的警報記錄。

Gossip的倆個關鍵:

  • Alertmanager 節點之間的Silence設置相同,這樣確保了設置為靜默的警報都不會對外發送

  • Alertmanager 節點之間通過Gossip機制同步警報通知狀態,並且在流程中標記Wait階段,保證警報是依次被集群中的Alertmanager節點讀取並處理。

搭建本地 Alertmanager 集群

啟動Alertmanager集群之前,需要了解一些集群相關的參數

參數 說明
--cluster.listen-address="0.0.0.0:9094" 集群服務監聽端口
--cluster.peer 初始化關聯其他節點的監聽地址
--cluster.advertise-address 廣播地址
--cluster.gossip-interval 集群消息傳播時間,默認 200s
--cluster.probe-interval 各個節點的探測時間間隔
# 直接復制之前已經安裝過的Alertmanager文件夾

cp -r alertmanager/ /usr/local/alertmanager01
cp -r alertmanager/ /usr/local/alertmanager02
cp -r alertmanager/ /usr/local/alertmanager03

# 復制完成以后,寫入啟動腳本,

# Alertmanager01
cat << EOF> /lib/systemd/system/alertmanager01.service
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/alertmanager01/bin/alertmanager \
--config.file=/usr/local/alertmanager01/conf/alertmanager.yml \
--storage.path=/usr/local/alertmanager01/data \
--web.listen-address=":19093" \
--cluster.listen-address=192.168.1.220:19094 \
--log.level=debug
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target
EOF

# Alertmanager02

cat << EOF> /lib/systemd/system/alertmanager02.service
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/alertmanager02/bin/alertmanager \
--config.file=/usr/local/alertmanager02/conf/alertmanager.yml \
--storage.path=/usr/local/alertmanager02/data \
--web.listen-address=":29093" \
--cluster.listen-address=192.168.1.220:29094 \
--cluster.peer=192.168.1.220:19094 \
--log.level=debug
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target
EOF

# Alertmanager03

cat <<EOF > /lib/systemd/system/alertmanager03.service
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/alertmanager03/bin/alertmanager \
--config.file=/usr/local/alertmanager03/conf/alertmanager.yml \
--storage.path=/usr/local/alertmanager03/data \
--web.listen-address=":39093" \
--cluster.listen-address=192.168.1.220:39094 \
--cluster.peer=192.168.1.220:19094 \
--log.level=debug
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target
EOF

# 開啟systemd腳本啟動
systemctl enable alertmanager01 alertmanager02 alertmanager03
systemctl start alertmanager01 alertmanager02 alertmanager03

啟動完成后,就可以訪問http://192.168.1.220:19093可以看到以下集群狀態了,我這里是為了測試,本地啟動了多個端口,如果是實際生產環境中,是不同節點以及不同的IP,這些根據自己的需求設計即可。

alert-gossip

Prometheus中的配置:

  external_labels: # 聯邦集群附加的Label標識,可以附加在警報中,這樣用於標識警報來源於那個Prometheus
    dc: prom-master
alerting:
  alert_relabel_configs:
    - source_labels: [dc]
      regex: (.+)\d+
      target_label: dc
  alertmanagers:
    - static_configs:
        #- targets: ['127.0.0.1:9093']
        - targets: ['192.168.1.220:19093','192.168.1.220:29093','192.168.1.220:39093']

配置完成以后,重啟或者reloadPrometheus服務,訪問http://192.168.1.220:19090/config就可以看到具體的配置信息了。

prom-config

到此,Alertmanager集群配置就完成了,對於集群中的警報測試很簡單,直接down掉一個端口,然后觸發警報,看看警報是否可以正常發送。

wecaht


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM