还有就是今天要聊的是,一文搞懂 Grafana Mimir

Hello folks,我是 Luga,今天我们来分享一下与 Grafana 有关的观测性话题- Grafana Mimir。 作为一个开源软件项目,Grafana Mimir 主要为 Prometheus 提供可扩展的长期存储功能支撑。

01

什么是 Grafana Mimir ?‍‍

作为一个开源的、水平可扩展的、高可用的、多租户的开源项目,Grafana Mimir 主要应用于流行的开源监控和告警系统 Prometheus 提供可扩展的长期存储。

基于 AGPLv3 许可下发布,Grafana Mimir 始于 Grafana Labs,并于 2022 年宣布,使其成为最具可扩展性、性能最高的开源指标时间序列数据库。同时,凭借其易于安装和维护、大规模可扩展性、全局指标视图、廉价和耐用的存储、高可用性以及本地多租户特性优势,使得 Grafana Mimir 成为 Prometheus 生态中最为有力的强大后勤补充。

02

Grafana Mimir 核心优势

1、易维护性

Grafana Mimir 的核心优势之一便是易于“安装和维护”。该项目的大量文档、教程和部署工具使其入门起来既快速又简单。Grafana Mimir 的整体模式允许只使用一个二进制文件,不需要额外的依赖项。此外,与 Grafana Mimir 一起打包的最佳实践仪表板、警报和运行手册可以轻松监控系统的健康状况并保持其平稳运行。

2、可扩展性

同时,Grafana Mimir 的水平可扩展架构使其能够处理大量时间序列数据。内部测试表明,该系统可以处理多达 10 亿个活动时间序列,从而实现大规模的可扩展性。这意味着 Grafana Mimir 可以跨多台机器运行,从而能够处理比单个 Prometheus 实例多几个数量级的时间序列。

3、全局视图

除此之外,Grafana Mimir 的另一个关键优势是它能够提供全局的指标视图。该系统使用户能够运行聚合来自多个 Prometheus 实例的系列的查询,从而提供所有系统的全面视图。查询引擎还广泛并行化查询执行,即使是最高基数的查询也能以极快的速度执行。

4、数据持久性

Grafana Mimir 使用对象存储来进行长期数据存储,利用了这种无处不在的、高性价比、高耐久性的技术。该系统与多个对象存储实现兼容,包括 AWS S3、谷歌云存储、Azure Blob 存储、OpenStack Swift 以及任何与 S3 兼容的对象存储。这为用户提供了一种廉价、耐用的方式来存储用于长期分析的指标。

5、通过复制实现高可用性

高可用性是 Grafana Mimir 的另一个关键特性。系统复制传入的指标,确保在机器发生故障时不会丢失任何数据。其水平可扩展架构还意味着它可以在零停机的情况下重启、升级或降级,确保指标摄取或查询不会中断。

6、原生多租户‍‍

最后,Grafana Mimir 的原生多租户允许独立团队或业务部门的数据和查询隔离,使这些组可以共享同一个集群。高级限制和服务质量控制确保容量在租户之间公平共享,使其成为拥有多个团队和部门的大型组织的绝佳选择。

03

Grafana Mimir 分布式架构‍

Grafana Mimir 的分布式架构可参考如下示意图:

针对架构中的不同组件功能解析,大家可以参考如下文件以及源码进行探究,具体如下:

serviceMonitor:
  enabled: true

# disabled, external ruler is used
ruler:
  enabled: false

# disabled, external alertmanager is used
alertmanager:
  enabled: false

# disabled, blocks_storage is used
minio:
  enabled: false

compactor:
  nodeSelector:
    app: mimir
  tolerations:
    - key: app
      value: compactor
      operator: Equal
      effect: NoSchedule
  persistentVolume:
    storageClass: standard-rwo
    size: 50Gi
  resources:
    limits:
      cpu: 1200m
      memory: 2Gi
    requests:
      cpu: 1200m
      memory: 2Gi

distributor:
  extraArgs:
    distributor.ingestion-rate-limit: "10000000000000"
  replicas: 5
  nodeSelector:
    app: mimir
  tolerations:
    - key: app
      value: distributor
      operator: Equal
      effect: NoSchedule
  resources:
    limits:
      memory: 4Gi
      cpu: 2
    requests:
      memory: 4Gi
      cpu: 2

ingester:
  extraArgs:
    ingester.max-global-series-per-user: "0"
    ingester.max-global-series-per-metric: "0"
  nodeSelector:
    app: mimir
  tolerations:
    - key: app
      value: ingester
      operator: Equal
      effect: NoSchedule
  persistentVolume:
    size: 150Gi
    storageClass: standard-rwo
  replicas: 5
  resources:
    limits:
      memory: 25Gi
      cpu: 4
    requests:
      memory: 25Gi
      cpu: 4

chunks-cache:
  nodeSelector:
    app: mimir
  enabled: true
  replicas: 2

index-cache:
  nodeSelector:
    app: mimir
  enabled: true
  replicas: 3

metadata-cache:
  nodeSelector:
    app: mimir
  enabled: true

results-cache:
  nodeSelector:
    app: mimir
  enabled: true

overrides_exporter:
  nodeSelector:
    app: mimir
  replicas: 1
  resources:
    limits:
      memory: 256Mi
    requests:
      cpu: 100m
      memory: 128Mi

querier:
  extraArgs:
    querier.max-fetched-chunks-per-query: "8000000"
  replicas: 4
  nodeSelector:
    app: mimir
  tolerations:
    - key: app
      operator: Equal
      value: querier
      effect: NoSchedule
  resources:
    limits:
      memory: 24Gi
      cpu: 2
    requests:
      memory: 24Gi
      cpu: 2

query_frontend:
  replicas: 1
  nodeSelector:
    app: mimir
  tolerations:
    - key: app
      operator: Equal
      value: query-frontend
      effect: NoSchedule
  resources:
    limits:
      memory: 6Gi
      cpu: 2
    requests:
      memory: 6Gi
      cpu: 2

store_gateway:
  persistentVolume:
    size: 50Gi
  replicas: 1
  nodeSelector:
    app: mimir
  tolerations:
    - key: app
      operator: Equal
      value: store-gateway
      effect: NoSchedule
  resources:
    limits:
      cpu: 1
      memory: 6Gi
    requests:
      cpu: 1
      memory: 6Gi

mimir:
  structuredConfig:
    limits:
      out_of_order_time_window: 1h
    blocks_storage:
      backend: gcs
      gcs:
        bucket_name: <bucket_name>
        service_account: |
          {<secret>}
metaMonitoring:
  serviceMonitor:
    enabled: true

04

Grafana Mimir 安装部署

基于 Docker 部署

首先,我们借助 Git 命令行 获取 Grafana Mimir 存储库分支,具体如下所示:

[leonli@Leon ~ ] % git clone https://github.com/grafana/mimir.git
Cloning into 'mimir'...
remote: Enumerating objects: 155741, done.
remote: Counting objects: 100% (387/387), done.
remote: Compressing objects: 100% (199/199), done.
eceiving objects:   3% (5177/155741), 3.01 MiB | 51.00 KiB/s 
...

然后,进行 mimir 目录对应的子目录“play-with-grafana-mimir/”下执行 Docker 命令行启动,具体如下所示:‍

[leonli@Leon ~ ] % docker-compose up -d

至此, Grafana Mimir 容器已正常启动,此时,我们在本地主机上打开 Grafana http://localhost:9000 并查看显示 Grafana Mimir 集群状态和健康状况的仪表板。并基于仪表板查看 Grafana Mimir 显示的相关指标集信息。

基于上述命令行所展现,Grafana Mimir 拓扑参考结构示意图如下所示,我们可根据实际情况进行配置操作。

基于上述拓扑结构,我们大概可以看出,对于整个启动命令所涉及的相关组件,具体如下:‍‍

1、Grafana Mimir

单体模式 Mimir 的三个实例以提供高可用性,同时,启用多租户(租户 ID 为 Demo)。

2、Minio

用于块、规则和警报的 S3 兼容持久存储。

3、Prometheus

抓取 Grafana Mimir 指标,然后将它们写回 Grafana Mimir 以确保摄取指标的可用性。

4、Grafana

包括一个预安装的数据源来查询 Grafana Mimir 以及用于监控 Grafana Mimir 的预装仪表板。

5、Load balancer

一个简单的基于 NGINX 的负载均衡器,在主机上暴露 Grafana Mimir 端点。

基于 Helm 部署

通常,我们在生产环境部署 Grafana Mimir 集群,建议需要满足如下环境要求,具体:

1、硬件要求:

具有至少 4 个内核和 16GiB RAM 的单个 Kubernetes 节点

2、软件要求:

Kubernetes 1.20 或更高版本以及 Helm v3 +‍‍‍‍‍

具体安装操作如下所示:

1、创建 ns,例如,将其命名为“mimir-devops”,具体如下:

[leonli@Leon ~ ] % kubectl create namespace mimir-devops 

2、设置 Helm 存储库,具体如下:

[leonli@Leon ~ ] % helm repo add grafana https://grafana.github.io/helm-charts && helm repo update

3、配置访问入口,入口使得我们能够从外部访问 Kubernetes Cluster。具体如下所示:

[leonli@Leon ~ ] % vi custom.yaml
nginx:
  ingress:
    enabled: true
    ingressClassName: nginx
    hosts:
      - host: <ingress-host>
        paths:
          - path: /
            pathType: Prefix
    tls:
      # empty, disabled.

注意:

要查看 Helm chart 安装的所有可配置参数,可使用如下命令行进行。

[leonli@Leon ~ ] % helm show values grafana/mimir-distributed.

4、安装 Grafana Mimir

[leonli@Leon ~ ] % helm -n mimir-devops install mimir grafana/mimir-distributed -f custom.yaml

至此,Grafana Mimir 已安装完成,大家可根据实际情况进行部署配置。

总的来说,Grafana Mimir 是一个强大的多功能系统,为 Prometheus 提供了可扩展的长期存储解决方案。基于其强大特性,可以帮助组织轻松监控和分析他们的系统表现。

关于 Grafana Mimir 更多内容,大家可参考 https://grafana.com/ !

Adiós !

··································

Hello folks,我是 Luga,一个 10 年+ 技术老司机,从 IT 屌丝折腾到码畜,最后到“酱油“架构师。如果你喜欢技术,不喜欢呻吟,那么恭喜你,来对地方了,关注我,共同学习、进步、超越~

您的每一个点赞、在看及分享,我都认真当成了喜欢 ~

正文完