ccww552010
作者ccww552010课题专家组·2023-12-04 19:49
软件开发工程师·某科技企业

Thanos基于MinIO存储高可用部署

字数 11127阅读 536评论 0赞 0

第一章 Thanos高可用架构

Thanos是一个开源工具和平台,用于扩展Prometheus的功能,提供长期存储、全局查询和高可用性。它通过存储网关、查询组件和其他模块实现数据的聚合、压缩和查询,从而为用户提供更灵活、可扩展的监控解决方案。

1.1. Thanos架构图

Thanos高可用架构分为两种模式 ,Sideca r 模式( 如图 1-1) 和Receiver模式 ( 如图 1-2)。

图1-1 Sidecar模式

图1-2 Receiver模式


1.2. Thanos各组件功能

Thanos提供 了 Sidecar、Query、Store、Receive、Rule、Compact、Query Frontend、Tools 8 个组件,这些组件的功能分别是:

  1. Sidecar
    Sidecar用于与Prometheu s 通信并从其获取数据块。它负责将获取的数据块上传到远程对象存储中,以实现数据的持久化存储。Sidecar 可以将数据块压缩并发送到远程存储,以便后续查询和分析。
  2. Query
    Query组件用于处理用户的查询请求,它从远程对象存储中获取数据,并执行查询操作以返回用户所需的监控数据。Query 组件具有分布式的查询能力,可以跨多个数据源执行查询操作,从而提供全局的监控数据查询功能。
  3. Store
    Store是Thanos 中的存储网关组件,它用于从远程对象存储中读取数据,并为查询组件提供数据。Store 组件可以对数据进行压缩和索引,以加速数据的检索和查询操作。
  4. Receive
    Receive组件用于接收来自Prometheus实例的数据流,并将数据流上传到远程对象存储中。Receive 组件可以处理来自多个Prometheus实例的数据,实现数据的聚合和上传。
  5. Rule
    Rule组件用于执行告警规则和规则评估,它可以从远程对象存储中获取数据,并执行告警规则以生成告警信息。Rule组件可以与Prometheus实例集成,实现监控数据的告警功能。
  6. Compact
    Compact组件用于对远程对象存储中的数据进行压缩和整理,以优化数据存储和查询性能。Compact 组件可以定期执行数据的压缩和整理操作,以确保数据存储的高效性和可用性。
  7. Query Frontend
    Query Frontend组件是用于处理用户查询请求的前端组件,它可以接收用户的查询请求,并将请求转发给后端的Query组件进行处理。Query Frontend组件提供用户友好的接口,以便用户可以方便地查询监控数据。
  8. Tools
    Tools 组件包含了一些辅助工具,用于管理、监控和维护 Thanos 系统。这些工具可以帮助用户进行系统配置、性能监控和故障排查,以确保系统的稳定性和可靠性。

1.3. Sidecar模式和Recevier模式

Sidecar来进行监控数据上传的边车模式和使用 Receive来接受数据的收取模式,两种模式只有数据从 Prometheus 到对象存储的方式有区别,其他结构是一样的。

  1. Sidecar模式
    (1) Sidecar模式是将Thanos Sidecar部署在每个Prometheus实例的代理。Sidecar负责与 Prometheus实例通信,获取其数据块,并将数据块上传到远程对象存储中,以实现数据的持久化存储。
    (2) Store 组件 从对象存储读取数据供其他组件查询 ;
    (3) Query 组件 从Sideca r 获取 实时监控 数据 , 基于 Store 组件 获取历史数据对外提供查询功能 ;
    (4) Rule 组件 从Sidecar和Store 组件 获取数据进行规则计算,如果触发告警就推送给AlertManager ;
    (5) Compactor 组件负责 对象存储 的 读写,下载数据进行数据降准和压缩,将处理好的数据上传到对象存储,并且删除已经降准过和压缩过的数据 ;
    (6) Query Frontend 基于 Quer y组件 提供查询缓存和查询分解的功能。
  2. Receiver模式
    对于收取模式,大致的结构和边车模式是一样的,只是没有了Sidecar组件,Prometheus 通过远程写功能将数据直接写给Receive r组件 ,Receiver 组件 将数据写给对象存储,Query 组件 查询数据从Receive r组件 和Store 组件 获取,Rule从Receive 组件 和Stor e组件 获取数据进行规则计算,Store和Compact or组件 的功能不变。

第二章 基于MinIO的Thanos存储配置

Thanos支持与多种对象存储集成,包括但不限于Amazon S3、Google Cloud Storage、Azure Blob Storage、阿里云对象存储(OSS)、Ceph、MinIO 等。通过 Thanos 的组件(如 Sidecar、Receive 等),可以配置和优化与这些对象存储的集成,实现监控数据的持久化存储、查询和分析。
Thanos需要存储大量的监控指标数据 , 并提供可靠数据存储和备份 , 同时提供优秀的查询能力 。 因此对象存储选择和配置尤为重要 。 本文选择MinIO作为Thanos的对象存储 。

2.1. MinIO优势

  1. 开发文档全面
    MinIO作为一款基于Golang 编程语言开发的一款高性能的分布式式存储方案的开源项目,有十分完善的官方文档。
  2. 高性能
    MinIO号称是目前速度最快的对象存储服务器。在标准硬件上,对象存储的读/写速度最高可以高达183 GB/s和171 GB/s。对象存储可以作为主存储层,用来处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。MinIO用作云原生应用程序的主要存储,和传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。
  3. 支持大部分主流开发语言
    目前MinIO支持市面主流的开发语言并且可以通过SDK快速集成快速集成使用。支持java,python,js,golang,.net,haskell等语言 。
  4. AWS S3标准兼容
    亚马逊云的S3 API(接口协议 ) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。MinIO 是第一个支持 S3 Select 的产品 。
  5. 安装部署非常简单
    MinIO安装部署非常简单。MinIO简单特性减少了出错的机会,节约了安装部署的时间,提供了可靠性,同时简单性又是性能的基础。
  6. 开放全部源代码+企业级支持
    MinIO基于Apache V2 license 100%开放源代码。这就意味着MinIO的用户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件。此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。
  7. 容器化集成方便
    MinIO提供了与k8s、etcd、docker等主流容器化技术深度集成方案。
  8. 管理界面的支持
    MinIO服务安装后,可以直接通过浏览器登录系统,完成文件夹、文件的管理。非常方便使用。
  9. 数据保护
    分布式Minio采用纠删码来防范多个节点宕机和位衰减bit rot。分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
  10. 数据一致性
    Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。
  11. 高可用
    多节点组成的分布式minio可保证服务的高可用。一个N节点的分布式Minio,只要有N/2节点在线,数据就是安全的。不过至少 需要 有N/2+1个节点才能创建新的对象。

2.2. MinIO分布式架构**

如图 2-1 所示 , MinIO分布式架构 。

图2-1 MinIO分布式架构

MinIO 是一个开源的分布式对象存储服务,其架构设计旨在实现高性能、高可用和可扩展性。MinIO 分布式集群存储架构通常由多个MinIO服务组成,这些服务可以运行在物理服务器、虚拟机或容器中 , 对外提供标准 S3 接口以进行统一访问。
在MinIO的架构中,有两种类型的节点:存储节点和网关节点。

  1. 存储节点负责存储实际的对象数据,它们之间通过分布式算法来实现数据的复制和分布。这些存储节点可以动态地加入或离开集群,从而实现高可用性和容错性。
  2. 网关节点则负责接收客户端的请求并将其转发给存储节点。网关节点可以通过负载均衡算法来分发请求,从而实现横向扩展和提高性能。
  3. MinIO集群使用Erasure Code技术来实现数据的冗余和恢复,确保数据的可靠性和持久性。此外,MinIO还提供了分布式元数据管理和一致性保证机制,以确保集群的稳定性和数据的一致性。

2.3. 基于kubernetes Minio配置

2.3.1. 创建kubernetes本地PV

  1. 创建本地存储类
#创建存储类资源
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: node-local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

#创建日志存储类资源
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: minio-log-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
  1. 基于k 8 s node节点本地磁盘挂载目录创建pv
#创建pv资源
apiVersion: v1
kind: PersistentVolume
metadata:
   name: node1-volume-01  #根据需求指定pv名称
spec:
  capacity:
   storage: 80Gi  #根据需求修改存储大小
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: node-local-storage
  local:
   path: /minio/data1 #拥有volume的文件路径
  nodeAffinity:
   required:
    nodeSelectorTerms:
    - matchExpressions:
      - key: kubernetes.io/hostname
        operator: In
        values:
        - node1 #选择拥有当前资源需求的节点
  1. 创建租户日志pv
#创建pv资源并根据实际需求修改log_pv.yaml文件name、path、values字段的值
apiVersion: v1
kind: PersistentVolume
metadata:
   name: minio-log-pv #根据租户名称修改该值
spec:
  capacity:
   storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: minio-log-storage
  local:
   path: /minio/data1 #拥有volume的文件路径
  nodeAffinity:
   required:
    nodeSelectorTerms:
    - matchExpressions:
      - key: kubernetes.io/hostname
        operator: In
        values:
        - node1 #选择拥有当前资源需求的节点

2.3.2. 创建租户

#创建名称空间
kubectl create ns <namespace>

#初始化租户
# server:MinIO实例数量
# volumes:挂载盘的总数
# capacity:挂载盘的总容量
kubectl minio tenant create  <tenant-name> \\
--servers 4 --volumes 4  \\ 
--capacity 320Gi \\
--storage-class node-local-storage \\
--audit-logs-storage-class minio-log-storage \\ 
--namespace <namespace> \\
--image reg.chebai.org/icospaas/minio/minio:RELEASE.2022-06-20T23-13-45Z \\ 
--audit-logs-image reg.chebai.org/icospaas/minio/operator:v4.4.25 \\  
--audit-logs-pg-init-image reg.chebai.org/icospaas/minio/busybox:1.33.1  \\ 
--audit-logs-pg-image  reg.chebai.org/icospaas/minio/postgres:13

2.3.3. 创建租户对外访问ingress

###控制台ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: console
  namespace: <namespace>
  annotations:
   nginx.ingress.kubernetes.io/proxy-body-size: <100m>
   nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
   nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  ingressClassName: "nginx"
  rules:
  - host: <domain>
    http:
      paths:
      - backend:
          service:
            name: minio-console
            port:
              number: 9443
        path: /
        pathType: Prefix

###租户minio ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minio
  namespace: <namespace>
  annotations:       
   nginx.ingress.kubernetes.io/proxy-body-size: <100m>
   nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
   nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  ingressClassName: "nginx"
  rules:
  - host: minio.default.svc.cluster.local
    http:
      paths:
      - backend:
          service:
            name: minio
            port:
              number: 9000
        path: /
        pathType: Prefix

2.4. Thanos配置Minio对象存储

2.4.1. 创建MinIO的secret对象

# thanos-storage-minio.yaml
type: s3
config:
 # bucket 名称
  bucket: thanos
# minio 访问地址
  endpoint: minio.default.svc.cluster.local 
  access_key: minio
  secret_key: minio123
  insecure: true
  signature_version2: false

# 创建Minio访问信息secret
kubectl create secret generic thanos-objectstorage \\
--from-file=thanos.yaml=thanos-storage-minio.yaml \\
-n monitoring

2.4.2. Thanos配置MinIO

2.4.2.1. Store组件

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: thanos-store-gateway
  namespace: kube-mon
  labels:
    app: thanos-store-gateway
spec:
  replicas: 1
  selector:
    matchLabels:
      app: thanos-store-gateway
  serviceName: thanos-store-gateway
  template:
    metadata:
      labels:
        app: thanos-store-gateway
        thanos-store-api: "true"
    spec:
      containers:
        - name: thanos
          image: thanosio/thanos:v0.18.0
          args:
            - "store"
            - "--log.level=debug"
            - "--data-dir=/data"
            - "--objstore.config-file=/etc/secret/thanos.yaml"
            - "--index-cache-size=500MB"
            - "--chunk-pool-size=500MB"
          ports:
            - name: http
              containerPort: 10902
            - name: grpc
              containerPort: 10901
          livenessProbe:
            httpGet:
              port: 10902
              path: /-/healthy
          readinessProbe:
            httpGet:
              port: 10902
              path: /-/ready
          volumeMounts:
            - name: object-storage-config
              mountPath: /etc/secret
              readOnly: false
      volumes:
        - name: object-storage-config
          secret:
            secretName: thanos-objectstorage

2.4.2.2. 配置Thanos SideCar

volumes:
- name: object-storage-config
# 挂载MinIO secret
  secret:
    secretName: thanos-objectstorage
args:
- sidecar
- --log.level=debug
- --tsdb.path=/prometheus
- --prometheus.url=http://localhost:9090
- --reloader.config-file=/etc/prometheus/prometheus.yaml.tmpl
- --reloader.config-envsubst-file=/etc/prometheus-shared/prometheus.yaml
- --reloader.rule-dir=/etc/prometheus/rules/
# 指定MinIO存储配置
- --objstore.config-file=/etc/secret/thanos.yaml
volumeMounts:
- name: object-storage-config
  mountPath: /etc/secret
  readOnly: false

2.4.2.3. Compactor组件配置

    spec:
      containers:
        - name: thanos
          image: thanosio/thanos:v0.18.0
          args:
            - "compact"
            - "--log.level=debug"
            - "--data-dir=/data"
# 指定MinIO存储配置文件
            - "--objstore.config-file=/etc/secret/thanos.yaml"
            - "--wait"
          volumeMounts:
            - name: object-storage-config
              mountPath: /etc/secret
              readOnly: false
      volumes:
        - name: object-storage-config
          secret:
            secretName: thanos-objectstorage

第三章 Thanos存储高可用和安全性

3.1. 冗余和备份

Thanos 是一个用于 Prometheus 监控系统的开源工具,它提供了一种可扩展的方式来进行监控数据的冗余和备份。Thanos主要通过以下几种方式来实现数据的冗余和备份:

  1. 分布式存储:Thanos可以将监控数据存储在分布式的对象存储后端,比如 Minio 等。这样可以确保数据的持久性和可靠性,即使部分节点出现故障也不会丢失数据。
  2. 数据复制:Thanos 支持数据的复制,可以将数据复制到多个存储后端,从而实现数据的冗余备份。这样即使某个存储后端发生故障,仍然可以从其他存储后端获取数据。
  3. 故障转移:Thanos提供了故障转移的机制,可以自动将数据从故障的节点迁移到正常的节点上,从而确保数据的可用性。
  4. 数据压缩和分片:Thanos支持对监控数据进行压缩和分片存储,从而节省存储空间并提高数据的读取性能。

3.2. 数据保留策略

Thanos提供了数据保留策略的功能,以便根据需求来管理监控数据的保留和清理。数据保留策略的主要目的是控制监控数据的存储时间,并在达到指定时间后自动清理过期的数据,以节省存储空间并提高系统性能。
Thanos的数据保留策略通常由以下几个方面组成:

  1. 保留期限(Retention Period):指定了监控数据在存储后应该保留的时间长度。例如,可以设置数据保留期限为一年,这意味着超过一年的监控数据将会被自动清理。
  2. 存储层级(Storage Tier):Thanos支持将监控数据分为不同的存储层级,每个层级可以有不同的保留期限。例如,可以将数据分为长期存储和短期存储,分别设置不同的保留期限。
  3. 数据清理策略(Data Cleanup Policy):指定了数据清理的规则和方式,比如可以根据时间或者数据大小来进行清理。
  4. 数据压缩策略(Data Compaction Policy):指定了对监控数据进行压缩和归档的策略,以节省存储空间。
    通过以上策略,Thanos可以根据用户需求自动管理监控数据的保留和清理,确保数据的合规性和存储效率。这样可以避免数据过期后占用过多的存储空间,同时保留足够的历史数据用于分析和故障排查。

3.3. 监控和警报

Thanos监控存储后端的健康状况和性能的方式包括以下几个方面:

  1. Prometheus监控:Thanos通常与Prometheus集成使用。通过 Prometheus,Thanos 可以监控存储后端的性能指标,如读取速率、写入速率、存储空间使用情况等。这些指标可以帮助管理员了解存储后端的运行状态,及时发现潜在的性能问题。
  2. 存储后端的可用性监控:Thanos通过定期向存储后端发送请求来监控其可用性。如果存储后端无法响应请求,Thanos 将记录相关的错误信息,并在必要时触发警报,以便管理员及时采取措施。
  3. 指标和警报规则:Thanos提供了一些预定义的指标和警报规则,用于监控存储后端的健康状况。这些规则可以根据存储后端的特性和需求进行配置,比如设置存储空间使用率超过一定阈值时触发警报,或者存储后端的响应时间超过一定阈值时触发警报。
  4. 数据一致性检查:Thanos通过定期进行数据一致性检查,确保存储后端的数据在不同的副本之间保持一致。如果发现数据不一致的情况,Thanos将记录相关的错误信息,并在必要时触发警报,以便管理员及时进行修复。

通过以上方式,Thanos能够全面监控存储后端的健康状况和性能,帮助管理员及时发现问题并采取措施,以保证存储后端的稳定运行。

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

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

X社区推广