基於VictoriaMetrics的大規模監控實戰

https://zahui.fan/posts/0cebb8ae/

victoriametrics原生支持水平擴展,並且大部分兼容Prometheus語法,官方文檔地址:https://docs.victoriametrics.com/

這個是victoriametrics官方的集羣架構

victoriametrics集羣架構

我公司用到的集羣架構

我公司用到的集羣

目前用到3臺機器

IP部署的服務
10.200.4.74 vmauth、vmselect、vminsert、vmstorage、vmalert
10.200.4.75 vmselect、vminsert、vmstorage
10.200.4.76 vmselect、vminsert、vmstorage

vmstorage

首先需要把存儲部署上,多個存儲之間數據是不同步的,也就是說所有的storege組件之間是感知不到彼此的。通過vmselect和vminsert採用一致性hash算法來確定讀取/寫入哪臺節點。

vmstorage啓動命令

BASH
1
2
3
4
5
6
7
8
./vmstorage-prod -httpListenAddr "0.0.0.0:8482" \   # vmstorage監聽端口
-storageDataPath ./data \ # 數據存儲位置
-retentionPeriod 60d \ # 數據保留多久
-vminsertAddr "0.0.0.0:8400" \ # insert服務連接的端口
-vmselectAddr "0.0.0.0:8401" \ # select服務連接的端口
-dedup.minScrapeInterval=30s \ # 和vmselect保持一致
-loggerTimezone "Asia/Shanghai" \
-loggerLevel INFO

vminsert

BASH
1
2
3
4
5
./vminsert-prod -httpListenAddr "0.0.0.0:8480" \
-storageNode 10.200.4.74:8400,10.200.4.75:8400,10.200.4.76:8400 \ # 指定所有storege節點
-replicationFactor 2 \ # 副本數2
-loggerTimezone"Asia/Shanghai" \
-loggerLevel INFO

vmselect

vmselect啓動命令

BASH
1
2
3
4
5
6
./vmselect-prod -httpListenAddr "0.0.0.0:8481" \
-selectNode 10.200.4.74:8481,10.200.4.75:8481,10.200.4.76:8481 \ # select的所有節點
-storageNode 10.200.4.74:8401,10.200.4.75:8401,10.200.4.76:8401 \ # 指定所有storage節點
-dedup.minScrapeInterval=30s \ # 重複數據刪除,如果是從Prometheus寫入的話,必須和Prometheus的scrape_interval保持一致。
-loggerTimezone "Asia/Shanghai" \
-loggerLevel INFO

vmalert

BASH
1
2
3
4
5
6
7
8
9
10
./vmalert-prod -rule=./rules/* \                            # 告警規則目錄
-datasource.url=http://10.200.4.74:8427 \ # vmselect的url,一般都是負載均衡地址
-datasource.basicAuth.username admin \ # vmselect的url認證用戶名
-datasource.basicAuth.password 123456 \ # vmselect的url認證密碼
-notifier.url=http://10.200.4.63:9093 \ # alertmanager地址
-remoteWrite.url=http://10.200.4.74:8427 \ # vminsert的url,一般都是負載均衡地址
-remoteWrite.basicAuth.username admin \ # vminsert的url認證用戶名
-remoteWrite.basicAuth.password 123456 \ # vminsert的url認證密碼
-evaluationInterval=15s \
-httpListenAddr=0.0.0.0:8080

負載均衡配置

vmauth負載均衡配置

BASH
1
./vmauth-prod -auth.config=./vmauth.yml

其中vmauth.yml的配置

YML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
users:
- username: "admin"
password: "123456"
url_map:
- src_paths:
- "/api/v1/query"
- "/api/v1/query_range"
- "/api/v1/label/[^/]+/values"
url_prefix:
- "http://10.200.4.74:8481/select/0/prometheus"
- "http://10.200.4.75:8481/select/0/prometheus"
- "http://10.200.4.76:8481/select/0/prometheus"
- src_paths: ["/api/v1/write"]
url_prefix:
- "http://10.200.4.74:8480/insert/0/prometheus"
- "http://10.200.4.75:8480/insert/0/prometheus"
- "http://10.200.4.76:8480/insert/0/prometheus"
# headers:
# - "X-Scope-OrgID: abc"

nginx負載均衡配置

如果你不想用vmauth,nginx功能可以完全覆蓋vmauth

nginx配置示例:

TEXT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
upstream  vmselect {
server 10.200.4.74:8481 weight=5 ;
server 10.200.4.75:8481 weight=5 ;
server 10.200.4.76:8481 weight=5 ;
}

server {
listen 8000;
server_name _;
auth_basic "authentication"; # 開啓基本認證
auth_basic_user_file conf.d/.htpasswd; # 密碼文件
location / {
proxy_pass http://vmselect/select/0/prometheus/;
}
}

upstream vminsert {
server 10.200.4.74:8480 weight=5 ;
server 10.200.4.75:8480 weight=5 ;
server 10.200.4.76:8480 weight=5 ;
}

server {
listen 8001;
server_name _;
auth_basic "authentication"; # 開啓基本認證
auth_basic_user_file conf.d/.htpasswd; # 密碼文件
location / {
proxy_pass http://vminsert/insert/0/prometheus/;
}
}

.htpasswd文件格式:

TEXT
1
admin:$1$QYnl4A1Q$I8Q712.eKtG9m7sAb9oeM1

admin是用戶名, :後面的是密碼, 密碼可以使用openssl passwd -1 123456 來生成(假設原始密碼是123456)

常用的配置

Prometheus通過remote_write寫入vm集羣

官方文檔:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write

YML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
remote_write:
- url: "http://10.200.4.74:8001/api/v1/write" # 通過負載均衡地址
# - url: "http://10.200.4.74:8480/insert/0/prometheus/api/v1/write" # 直接連接vminsert組件
basic_auth:
username: admin
password: 123456
remote_timeout: 30s
tls_config:
insecure_skip_verify: true
queue_config:
capacity: 2500
max_shards: 200
min_shards: 1
max_samples_per_send: 500
batch_send_deadline: 5s
min_backoff: 30ms
max_backoff: 5s

參數說明:

官方地址:https://prometheus.io/docs/practices/remote_write/

  • capacity

    定義:每個內存隊列(shard:分片)的容量。

    一旦WAL被阻塞,就無法將樣本附加到任何分片,並且所有吞吐量都將停止。所以在大多數情況下,單個隊列容量應足夠打以避免阻塞其他分片,但是太大的容量可能會導致過多的內存消耗,並導致重新分片期間清除隊列的時間更長。

    容量建議:將容量設置爲3-10倍max_samples_per_send

  • max_shards

    顧名思義,最大的分片數(即隊列數),也可以理解爲遠程寫的並行度。peometheus遠程寫的時候會使用所有的分片,只有在寫隊列落後於遠程寫的速度,使用的隊列數會達到max_shards,目的在於提高遠程寫的吞吐量。

    PS:在操作過程中,Prometheus將根據傳入的採樣率,未發送的未處理樣本數以及發送每個樣本所花費的時間,連續計算要使用的最佳分片數。(實際的分片數是動態調整的)

  • min_shards

    最小分片配置Prometheus使用的最小分片數量,並且是遠程寫入開始時使用的分片數量。如果遠程寫入落後,Prometheus將自動擴大分片的數量,因此大多數用戶不必調整此參數。但是,增加最小分片數將使Prometheus在計算所需分片數時避免在一開始就落後。

  • max_samples_per_send

    定義:每次遠程寫發送的最大指標數量,即批處理;

    這個值依賴於遠程存儲系統,對於一些系統而言,在沒有顯著增加延遲的情況下發送更多指標數據而運行良好,然而,對於另外一些系統而言,每次請求中發送大量指標數據可能導致其出現故障,使用的默認值是適用於絕大多數系統的。

  • batch_send_deadline

    定義:單一分片批量發送指標數據的最大等待時間;

    即使排隊的分片尚未達到max_samples_per_send,也會發送請求。 對於對延遲不敏感的小批量系統,可以增加批量發送的截止時間,以提高請求效率。

  • min_backoff

    定義:遠程寫失敗的最小等待時間;

    min_backoff是第一次的重試等待時間,第二次等待時間是其2倍,以此類推,直到max_backoff的值;

  • max_backoff

    定義:遠程寫失敗的最大等待時間;

Grafana直接查詢VM集羣

Grafana配置地址:

說明地址
負載均衡地址 http://10.200.4.74:8000
vmselect地址 http://10.200.4.74:8481/select/0/prometheus

其他API地址

目錄:http://10.200.4.74:8481/select/0/

vmui:http://10.200.4.74:8481/select/0/vmui/

每個組件都有/metrics,可以接入監控

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章