Luga Lee
作者Luga Lee·2023-03-07 10:04
系统架构师·None

一文搞懂 Grafana Mimir

字数 7381阅读 1272评论 0赞 1

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

0 1 —

什么是 Grafana Mimir ?

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

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

0 2 —

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

0 3 —

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:        
              service_account: |          
                  {<secret>}
metaMonitoring: 
     serviceMonitor:    
              enabled: true

*0 4* —

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 提供了可扩展的长期存储解决方案。基于其强大特性,可以帮助组织轻松监控和分析他们的系统表现。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广