Skip to content

VictoriaMetrics

简介

VictoriaMetrics是一种快速、经济高效且可扩展的监控解决方案和时间序列数据库。 支持单点和集群两种架构。官方给出对于低于每秒一百万个数据点的摄取速率,建议使用单节点版本而不是集群版本。但是建议在生产中使用多存储节点的模式,insert、select节点可以是单个,这样可以确保数据是高可用的。 建议至少有 50% 的可用内存,以便妥善处理可能的工作负载峰值。

简单举几个特点:

  • 可以作为Prometheus的长期远端存储。

  • Vmstore本身提供数据压缩,要比Prometheus本地存储、Thanos的所需存储空间低7倍。

  • 在处理百万级别的时间序列(又名高基数)时,比Prometheus、Thanos所需内存低7倍。

  • 支持备份恢复。

VMCluster

VMCluster是Victor Metrics的集群版,主要由三个组件组成; img.pngimg_1.png

vmstorage(存储节点)

有状态服务

负责时序数据的长期存储。

处理数据的持久化,并且对数据进行压缩、归档以节省存储空间,同时保持高效的数据检索。在集群模式下,通常会有多个vmstorage节点支持更大规模的存储需求和提高数据冗余。

vminsert(插入节点)

无状态服务

负责接收从客户端或代理发来的监控数据。

用来接收写请求、缓冲和批量处理数据,在处理好时序数据后再发送给存储节点,减少对存储节点的直接压力。

vmselect(查询节点)

无状态服务

负责处理查询请求。

用来处理用户或程序请求数据时,vmselect从存储节点检索时序数据,并执行必要的过滤、聚合等工作。将最终结果返回给请求者。

生态

  • vmagent - 轻量级代理,用于通过基于拉动基于推送的协议接收指标,将其转换并发送到已配置的与 Prometheus 兼容的远程存储系统,例如 VictoriaMetrics。

  • vmalert - 用于处理与 Prometheus 兼容的警报和记录规则的服务。

  • vmalert-tool - 用于验证警报和记录规则的工具。

  • vmauth - 针对 VictoriaMetrics 产品优化的授权代理和负载均衡器。

  • vmgateway - 具有每个租户速率限制功能的授权代理。

  • vmctl - 用于在不同存储系统之间迁移和复制数据以获取指标的工具。

  • vmbackup、vmrestore和vmbackupmanager - 用于为 VictoriaMetrics 数据创建备份和从备份恢复的工具。

  • vmcluster - vminsert、vmselect和VictoriaMetrics 集群vmstorage的组件。

  • VictoriaLogs - 用户友好、经济高效的日志数据库。

VictoriaMetrics 单节点配置示例

单节点 VictoriaMetrics 的配置可以通过命令行参数或环境变量来设置。一些常用的配置选项包括:

  • httpListenAddr: HTTP服务监听地址和端口(例如 "0.0.0.0:8428")

  • retentionPeriod: 数据保留期限,默认是1月(例如 "12" 表示12个月),最低保留24小时/1天

  • storageDataPath:数据存储路径(例如 "/var/lib/victoriametrics/")

  • promscrape.config:prometheus target采集配置文件;

  • remoteWrite.url:使用 Prometheus 兼容的远程存储端点(例如 VictoriaMetrics),将数据发送到哪里;

启动命令示例:

./victoria-metrics-prod \
-storageDataPath=/var/lib/victoriametrics/ \
-retentionPeriod=12 \
-httpListenAddr=0.0.0.0:8428

VictoriaMetrics 集群配置示例

vmstorage 配置

  • httpListenAddr: 该节点的HTTP监听地址和端口

  • vminsertAddr: 处理vminsert流量的地址

  • vmselectAddr: 处理vmselect流量的地址

  • storageDataPath: 数据存储目录

  • retentionPeriod: 数据保留期限

  • cluster.storageNodes: 其他存储节点的地址列表

vminsert 配置

  • httpListenAddr: vminsert节点HTTP监听地址和端口

  • storageNode: vmstorage节点地址列表,vminsert会将数据分布到这些节点

vmselect 配置

  • httpListenAddr: vmselect节点HTTP监听地址和端口

  • storageNode: vmstorage节点地址列表,vmselect从这些节点查询数据

对于生产环境,你可能还需要进行更多的调优,包括但不限于:

  • TLS/SSL 加密: 保护数据在传输过程中的安全。
  • 高可用性的配置: 包括数据的冗余存储、负载均衡和自动故障切换。
  • 资源限制与调整: 根据系统资源(CPU、内存和存储IO)调整并发量、内存使用等。
  • 监控和警报: 设置监控系统,对VictoriaMetrics的各项指标,如响应时间、错误率、资源使用状况进行实时监控,并在异常情况下发出警报。

快照功能

vmbackup工具为了安全性,避免将数据备份到storageDataPath指定的目录,因为这个目录由VictoriaMetrics实时使用。进行备份时,应选择另外的目录,以免备份操作与VictoriaMetrics存储实时数据的操作冲突,从而可能导致数据损坏或一系列的问题。

命令方式创建

支持备份到指定目录


vmbackup -storageDataPath /var/lib/victoriametrics/ -dst fs:///backups/victoriametrics/

接口方式创建

创建快照

使用/snapshot/create以创建快照。

http://<victoriametrics-addr>:8428/snapshot/create

快照会在存储目录下创建<-storageDataPath>/snapshots,可以使用vmbackup随时将快照存档到备份存储。

页面返回以下 JSON 响应:

{"status":"ok","snapshot":"<snapshot-name>"}

删除快照

删除单个快照

使用/snapshot/delete来删除快照。

http://<victoriametrics-addr>:8428/snapshot/delete?snapshot=<snapshot-name>

注意:

  • 不要使用rm或类似命令删除其中的子目录,因为这将导致某些快照数据未被删除。更喜欢
  • 不要使用cp或rsync类似命令复制子目录,因为这些命令很可能不会复制快照中存储的某些数据。首选使用vmbackup来制作快照数据的副本。

删除所有快照

使用/snapshot/delete_all以删除所有快照。

http://<victoriametrics-addr>:8428/snapshot/delete_all

查看快照

使用/snapshot/list返回可用快照的列表。

http://<victoriametrics-addr>:8428/snapshot/list

快照恢复

恢复过程可以随时中断。当vmrestore使用相同的参数重新启动时,它会自动从中断点恢复。

./vmrestore -src=<storageType>://<path/to/backup> -storageDataPath=<local/path/to/restore>
  • <storageType>://<path/to/backup>是使用vmbackup制作的备份路径vmrestore可以从以下存储类型恢复备份:
    • gst:-src=gs://<bucket>/<path/to/backup>
    • S3:-src=s3://<bucket>/<path/to/backup>
    • Azure Blob 存储:-src=azblob://<container>/<path/to/backup>
    • 任何与 S3 兼容的存储,例如MinIO、Ceph 或Swift。参阅这些文档。
    • 本地文件系统:-src=fs://</absolute/path/to/backup>
  • <local/path/to/restore>是将恢复数据的文件夹的路径。

安装

单点模式部署

单点架构是all-in-one,一个服务内集成多个功能,如:采集、写入、查询、存储等。

采集端配置

使用Secret可以实现配置热加载, 内容经过base64加密;

apiVersion: v1
kind: Secret
metadata:
  name: vm-agent-target
  namespace: observability
type: Opaque
data:
  prometheus.yaml: ICAgIGdsb2JhbDoKICAgICAgc2NyYXBlX2ludGVydmFsOiAxMHMKICAgIHNjcmFwZV9jb25maWdzOgogICAgICAtIGpvYl9uYW1lOiB2bWFnZW50CiAgICAgICAgc3RhdGljX2NvbmZpZ3M6CiAgICAgICAgICAtIHRhcmdldHM6IFsibG9jYWxob3N0Ojg0MjgiXQoKICAgICAgLSBqb2JfbmFtZTogImt1YmVybmV0ZXMtYXBpc2VydmVycyIKICAgICAgICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6CiAgICAgICAgICAtIHJvbGU6IGVuZHBvaW50cwogICAgICAgIHNjaGVtZTogaHR0cHMKICAgICAgICB0bHNfY29uZmlnOgogICAgICAgICAgY2FfZmlsZTogL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydAogICAgICAgICAgaW5zZWN1cmVfc2tpcF92ZXJpZnk6IHRydWUKICAgICAgICBiZWFyZXJfdG9rZW5fZmlsZTogL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuCiAgICAgICAgcmVsYWJlbF9jb25maWdzOgogICAgICAgICAgLSBzb3VyY2VfbGFiZWxzOgogICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIF9fbWV0YV9rdWJlcm5ldGVzX25hbWVzcGFjZSwKICAgICAgICAgICAgICAgIF9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSwKICAgICAgICAgICAgICAgIF9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50X3BvcnRfbmFtZSwKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIGFjdGlvbjoga2VlcAogICAgICAgICAgICByZWdleDogZGVmYXVsdDtrdWJlcm5ldGVzO2h0dHBzCiAgICAgIC0gam9iX25hbWU6ICJrdWJlcm5ldGVzLW5vZGVzIgogICAgICAgIHNjaGVtZTogaHR0cHMKICAgICAgICB0bHNfY29uZmlnOgogICAgICAgICAgY2FfZmlsZTogL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydAoKICAgICAgICAgIGluc2VjdXJlX3NraXBfdmVyaWZ5OiB0cnVlCiAgICAgICAgYmVhcmVyX3Rva2VuX2ZpbGU6IC92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbgogICAgICAgIGt1YmVybmV0ZXNfc2RfY29uZmlnczoKICAgICAgICAgIC0gcm9sZTogbm9kZQogICAgICAgIHJlbGFiZWxfY29uZmlnczoKICAgICAgICAgIC0gYWN0aW9uOiBsYWJlbG1hcAogICAgICAgICAgICByZWdleDogX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispCiAgICAgICAgICAtIHRhcmdldF9sYWJlbDogX19hZGRyZXNzX18KICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IGt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzCiAgICAgICAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWVdCiAgICAgICAgICAgIHJlZ2V4OiAoLispCiAgICAgICAgICAgIHRhcmdldF9sYWJlbDogX19tZXRyaWNzX3BhdGhfXwogICAgICAgICAgICByZXBsYWNlbWVudDogL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzCg==

Deploy

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata: 
  name: victoria-metrics-data
  namespace: observability
spec: 
  storageClassName: "local-path" 
  accessModes: 
    - ReadWriteOnce
  resources: 
    requests: 
      storage: 100Gi 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: victoria-metrics
  namespace: observability
spec:
  selector:
    matchLabels:
      app: victoria-metrics
  template:
    metadata:
      labels:
        app: victoria-metrics
    spec:
      containers:
        - name: vm
          image: victoriametrics/victoria-metrics:v1.79.8
          imagePullPolicy: IfNotPresent
          args:
            - -storageDataPath=/var/lib/victoria-metrics-data
            - -retentionPeriod=2w
            - -promscrape.config=/etc/prometheus/prometheus.yaml
          ports:
            - containerPort: 8428
              name: http
          volumeMounts:
            - mountPath: /var/lib/victoria-metrics-data
              name: storage
            - mountPath: "/etc/prometheus/"
              name: prometheus-config
              readOnly: true
      volumes:
        - name: prometheus-config
          secret:
            secretName: vm-agent-target
            items:
            - key: "prometheus.yaml"
              path: "prometheus.yaml"
        - name: storage
          persistentVolumeClaim:
            claimName: victoria-metrics-data
---
apiVersion: v1
kind: Service
metadata:
  name: victoria-metrics
  namespace: observability
spec:
  type: NodePort
  ports:
    - port: 8428
  selector:
    app: victoria-metrics

配置热加载

当修改采集配置后可通过发送Post请求来热加载配置文件

curl -X POST http://192.168.1.190:31425/-/reload

UI

VM的UI也提供了像Prometheus那种很丰富的查询功能;

img_2.png


集群模式部署

VM集群服务间请求方式

Operator

安装Operator

# helm repo add vm https://victoriametrics.github.io/helm-charts
# helm repo update
# helm install victoria-operator vm/victoria-metrics-operator
# kubectl -n monitoring get pod
NAME                                                           READY   STATUS    RESTARTS   AGE
victoria-operator-victoria-metrics-operator-7b886f85bb-jf6ng   1/1     Running   0          20s

安装核心组件

集群配置

# vi vmcluster.yaml
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMCluster
metadata:
  name: vmcluster
  namespace: monitoring
spec:
  retentionPeriod: "1" 
  vmstorage:
    replicaCount: 2
    image:
      repository: victoriametrics/vmstorage
      tag: v1.93.4-cluster
      pullPolicy: Always
    storage:
      volumeClaimTemplate:
        metadata:
          name: data
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: cbs
          resources:
            requests:
              storage: 100Gi
    resources:
      limits:
        cpu: "1"
        memory: "1Gi"
      requests:
        cpu: "0.5"
        memory: "500Mi"
              
  vmselect:
    replicaCount: 2
    cacheMountPath: "/select-cache"
    image:
      repository: victoriametrics/vmselect
      tag: v1.93.4-cluster
      pullPolicy: Always
    storage:
      volumeClaimTemplate:
        spec:
          resources:
            requests:
              storage: "1Gi"
    resources:
      limits:
        cpu: "1"
        memory: "1Gi"
      requests:
        cpu: "0.5"
        memory: "500Mi"
        
  vminsert:
    replicaCount: 2
    image:
      repository: victoriametrics/vminsert
      tag: v1.93.4-cluster
      pullPolicy: Always
    resources:
      limits:
        cpu: "1"
        memory: "1Gi"
      requests:
        cpu: "0.5"
        memory: "500Mi"

安装

# kubectl apply -f vmcluster.yaml
vmcluster.operator.victoriametrics.com/vmcluster created

查看状态


# kubectl -n monitoring get pod | grep vmcluster
vminsert-vmcluster-77886b8dcb-jqpfw                            1/1     Running   0          20s
vminsert-vmcluster-77886b8dcb-l5wrg                            1/1     Running   0          20s
vmselect-vmcluster-0                                           1/1     Running   0          20s
vmselect-vmcluster-1                                           1/1     Running   0          20s
vmstorage-vmcluster-0                                          1/1     Running   0          20s
vmstorage-vmcluster-1                                          1/1     Running   0          20s

安装VM Agent 采集配置

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: prom-scrape-configs
  namespace: monitoring
stringData:
  prom-scrape-configs.yaml: |-

    - job_name: 'kubernetes-kubelets'
      kubernetes_sd_configs:
        - role: node
      relabel_configs:
        - source_labels: [__address__]
          regex: '(.*):10250'
          replacement: '${1}:9100'
          target_label: __address__
          action: replace
        - action: labelmap
          regex: __meta_kubernetes_node_label_(.+)

服务部署配置

apiVersion: operator.victoriametrics.com/v1beta1
kind: VMAgent
metadata:
  name: vmagent
  namespace: monitoring
spec:
  selectAllByDefault: true
  additionalScrapeConfigs:
    key: prom-scrape-configs.yaml
    name: prom-scrape-configs
  resources:
    requests:
      cpu: 10m
      memory: 10Mi
  replicaCount: 1
  remoteWrite:
  - url: "http://vminsert-vmcluster:8480/insert/0/prometheus/api/v1/write"

注意:如果以高可用方式(多副本)运行,必须开启重复数据删除的功能。

安装

# kubectl apply -f scrape-config.yaml
secret/prom-scrape-configs created
# kubectl apply -f vmagent.yaml
vmagent.operator.victoriametrics.com/vmagent created
# kubectl -n monitoring get pod | grep vmagent
vmagent-vmagent-cf9bbdbb4-tm4w9                                2/2     Running   0          20s

参考文档

VMStorage 存储规划

计算公式

磁盘用量(bytes) = 瞬时指标量[m] x 单个数据点大小 x 60 x 24 x 存储时间(天)

瞬时存储的指标量:max(increase(vm_rows{}[1m]))

单个数据点大小:sum(vm_data_size_bytes{}) / sum(vm_rows{})

最佳实践配置

问题:指标量过高导致VmAgent OOM

默认情况下,vmagent解析来自抓取目标的完整响应,应用重新标记,然后将生成的指标一次性推送到存储中。当抓取目标公开少量指标(例如少于 10K)时,此模式在大多数情况下效果很好。但是,当抓取目标公开大量指标时(例如,在大型Kubernetes集群中vmagent抓取时kube-state-metrics),此模式可能会占用大量内存。建议为此类目标启用流解析模式。启用此模式后,vmagent将分块处理来自抓取目标的响应。这可以在抓取公开数百万个指标的目标时节省内存。

scrape_configs:
- job_name: 'big-federate'
  stream_parse: true    // 再较大的指标Job中添加此配置
  static_configs:
  - targets:
    - big-prometheus1
    - big-prometheus2
  metrics_path: /federate
  params:
    'match[]': ['{__name__!=""}']

Released under the GPL License.