Alertmanager 高可用安裝配置
本章節(jié)主要講解Alertmanager高可用的搭建與配置的詳細(xì)的內(nèi)容。
為了提升Prometheus的服務(wù)可靠性,我們會(huì)部署兩個(gè)或多個(gè)的Prometheus服務(wù),兩個(gè)Prometheus具有相同的配置(Job配、告警規(guī)則、等),當(dāng)其中一個(gè)Down掉了以后,可以保證Prometheus持續(xù)可用。
AlertManager自帶警報(bào)分組機(jī)制,即使不同的Prometheus分別發(fā)送相同的警報(bào)給Alertmanager,Alertmanager也會(huì)自動(dòng)把這些警報(bào)合并處理。
| 去重 | 分組 | 路由 |
|---|---|---|
| Daduplicates | Groups | Route |
| 將相同的警報(bào)合并成一個(gè) | 根據(jù)定義的分組 | 經(jīng)過路由分發(fā)給指定的receiver |
雖然Alertmanager 能夠同時(shí)處理多個(gè)相同的Prometheus的產(chǎn)生的警報(bào),如果部署的Alertmanager是單節(jié)點(diǎn),那就存在明顯的的單點(diǎn)故障風(fēng)險(xiǎn),當(dāng)Alertmanager節(jié)點(diǎn)down機(jī)以后,警報(bào)功能則不可用。
解決這個(gè)問題的方法就是使用傳統(tǒng)的HA架構(gòu)模式,部署Alertmanager多節(jié)點(diǎn)。但是由于Alertmanager之間關(guān)聯(lián)存在不能滿足HA的需求,因此會(huì)導(dǎo)致警報(bào)通知被Alertmanager重復(fù)發(fā)送多次的問題。

Alertmanager為了解決這個(gè)問題,引入了Gossip機(jī)制,為多個(gè)Alertmanager之間提供信息傳遞機(jī)制。確保及時(shí)的在多個(gè)Alertmanager分別接受到相同的警報(bào)信息的情況下,不會(huì)發(fā)送重復(fù)的警報(bào)信息給Receiver.
Gossip 機(jī)制
要知道什么是Gossip機(jī)制,必須了解清楚Alertmanager中的每一次警報(bào)通知是如何產(chǎn)生的,下面一圖很詳細(xì)的闡述了警報(bào)個(gè)流程:

| 階段 | 描述 |
|---|---|
Silence | 在這個(gè)階段中Alertmanager會(huì)判斷當(dāng)前通知是否匹配任何靜默規(guī)則;如果沒有則進(jìn)入下一個(gè)階段,否則會(huì)中斷流程不發(fā)送通知。 |
Wait | Alertmanager 會(huì)根據(jù)當(dāng)前集群中所處在的順序[index],等待 index * 5s 的時(shí)間。 |
Dedup | 當(dāng)?shù)却Y(jié)束完成,進(jìn)入 Dedup 階段,這時(shí)會(huì)判斷當(dāng)前Alertmanager TSDB中警報(bào)是否已經(jīng)發(fā)送,如果發(fā)送則中斷流程,不發(fā)送警報(bào)。 |
Send | 如果上面的未發(fā)送,則進(jìn)入 Send 階段,發(fā)送警報(bào)通知。 |
Gossip | 警報(bào)發(fā)送成功以后,進(jìn)入最后一個(gè)階段 Gossip ,通知其他Alertmanager節(jié)點(diǎn),當(dāng)前警報(bào)已經(jīng)發(fā)送成功。其他Alertmanager節(jié)點(diǎn)會(huì)保存當(dāng)前已經(jīng)發(fā)送過的警報(bào)記錄。 |
Gossip倆個(gè)關(guān)鍵:
Alertmanager 節(jié)點(diǎn)之間的Silence設(shè)置相同,這樣確保了設(shè)置為靜默的警報(bào)都不會(huì)對(duì)外發(fā)送
Alertmanager 節(jié)點(diǎn)之間通過Gossip機(jī)制同步警報(bào)通知狀態(tài),并且在流程中標(biāo)記Wait階段,保證警報(bào)是依次被集群中的Alertmanager節(jié)點(diǎn)讀取并處理。
搭建本地 Alertmanager 集群
啟動(dòng)Alertmanager集群之前,需要了解一些集群相關(guān)的參數(shù)
| 參數(shù) | 說明 |
|---|---|
--cluster.listen-address="0.0.0.0:9094" | 集群服務(wù)監(jiān)聽端口 |
--cluster.peer | 初始化關(guān)聯(lián)其他節(jié)點(diǎn)的監(jiān)聽地址 |
--cluster.advertise-address | 廣播地址 |
--cluster.gossip-interval | 集群消息傳播時(shí)間,默認(rèn) 200s |
--cluster.probe-interval | 各個(gè)節(jié)點(diǎn)的探測時(shí)間間隔 |
# 直接復(fù)制之前已經(jīng)安裝過的Alertmanager文件夾cp -r alertmanager/ /usr/local/alertmanager01cp -r alertmanager/ /usr/local/alertmanager02cp -r alertmanager/ /usr/local/alertmanager03# 復(fù)制完成以后,寫入啟動(dòng)腳本,# Alertmanager01cat << EOF> /lib/systemd/system/alertmanager01.service[Unit]Description=alertmanagerDocumentation=https://prometheus.io/After=network.targetStartLimitIntervalSec=0[Service]Type=simpleUser=prometheusExecStart=/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=debugRestart=alwaysRestartSec=1[Install]WantedBy=multi-user.targetEOF# Alertmanager02cat << EOF> /lib/systemd/system/alertmanager02.service[Unit]Description=alertmanagerDocumentation=https://prometheus.io/After=network.targetStartLimitIntervalSec=0[Service]Type=simpleUser=prometheusExecStart=/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=debugRestart=alwaysRestartSec=1[Install]WantedBy=multi-user.targetEOF# Alertmanager03cat </lib/systemd/system/alertmanager03.service [Unit]Description=alertmanagerDocumentation=https://prometheus.io/After=network.targetStartLimitIntervalSec=0[Service]Type=simpleUser=prometheusExecStart=/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=debugRestart=alwaysRestartSec=1[Install]WantedBy=multi-user.targetEOF# 開啟systemd腳本啟動(dòng)systemctl enable alertmanager01 alertmanager02 alertmanager03systemctl start alertmanager01 alertmanager02 alertmanager03
啟動(dòng)完成后,就可以訪問http://192.168.1.220:19093可以看到以下集群狀態(tài)了,我這里是為了測試,本地啟動(dòng)了多個(gè)端口,如果是實(shí)際生產(chǎn)環(huán)境中,是不同節(jié)點(diǎn)以及不同的IP,這些根據(jù)自己的需求設(shè)計(jì)即可。

Prometheus中的配置:
alerting:alert_relabel_configs:- source_labels: [dc]regex: (.+)\d+target_label: dcalertmanagers:- 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服務(wù),訪問http://192.168.1.220:19090/config就可以看到具體的配置信息了。

到此,Alertmanager集群配置就完成了,對(duì)于進(jìn)群中的警報(bào)測試很簡單,直接down掉一個(gè)端口,然后觸發(fā)警報(bào),看看警報(bào)是否可以正常發(fā)送。
