菜单
文档breadcrumb arrow Grafana Lokibreadcrumb arrow 设置breadcrumb arrow 迁移breadcrumb arrow 从 SSD 迁移到分布式
开源 RSS

从 SSD 迁移到分布式

本指南提供从简单可伸缩部署 (SSD) 迁移到 Loki 分布式微服务部署的说明。在开始迁移之前,请确保您已阅读注意事项部分。

注意

本指南以 AWS 部署为例。但是,迁移过程适用于其他云提供商。这是因为底层数据存储无需更改。

注意事项

从简单可伸缩部署迁移到分布式部署可能实现零停机,但这需要仔细规划。应考虑以下事项

  1. Helm 部署:本指南假设您使用 Helm 部署 Loki。其他迁移方法也可能,但本指南不涵盖。
  2. Kubernetes 资源:此迁移方法要求您在关闭 SSD pod 之前启动分布式 Loki pod。这意味着您的 Kubernetes 集群需要有足够的资源同时运行 SSD 和分布式 Loki pod。
  3. 数据:底层数据存储无需更改。虽然数据丢失或损坏的可能性很小,但强烈建议在开始迁移过程之前备份数据。如果您使用云提供商,可以创建快照/备份。
  4. 配置:本指南不涵盖所有配置参数。我们只介绍需要更改的参数。其他参数可以保持不变。但是,如果 pattern_ingesters=true,则需要在关闭 SSD Ingester 之前启动 patternIngesters。这主要用于 Grafana 日志下钻功能。
  5. 区域感知 Ingester:本指南目前不涵盖区域感知 Ingester。我们目前的建议是禁用区域感知 Ingester 或查阅Mimir 迁移指南。请注意,Mimir 和 Loki 并非所有参数都相同。

前提条件

在开始迁移过程之前,请确保满足以下前提条件

  1. 通过 kubectl 访问您的 Kubernetes 集群。
  2. 已安装 Helm。

示例 SSD 部署

本示例将使用以下 SSD 部署作为参考

注意

本示例仅作为需要更改的参数的参考。您自己的配置中可能还有其他参数,例如 limits_configgatewaycompactor 等。这些参数可以保持不变。

yaml
---
loki:
   schemaConfig:
     configs:
       - from: "2024-04-01"
         store: tsdb
         object_store: s3
         schema: v13
         index:
           prefix: loki_index_
           period: 24h
   storage_config:
     aws:
       region: eu-central-1
       bucketnames: aws-chunks-bucket
       s3forcepathstyle: false
   ingester:
       chunk_encoding: snappy
   ruler:
    enable_api: true
    storage:
      type: s3
      s3:
        region: eu-central-1
        bucketnames: aws-ruler-bucket
        s3forcepathstyle: false
      alertmanager_url: http://prom:9093
   querier:
      max_concurrent: 4

   storage:
      type: s3
      bucketNames:
        chunks: "aws-chunks-bucket"
        ruler: "aws-ruler-bucket"
      s3:
        region: eu-central-1

deploymentMode: SimpleScalable

# SSD
backend:
 replicas: 2
read:
 replicas: 3
write:
 replicas: 3

# Distributed Loki
ingester:
 replicas: 0
 zoneAwareReplication:
  enabled: false

querier:
 replicas: 0
 maxUnavailable: 0
queryFrontend:
 replicas: 0
 maxUnavailable: 0
queryScheduler:
 replicas: 0
distributor:
 replicas: 0
 maxUnavailable: 0
compactor:
 replicas: 0
indexGateway:
 replicas: 0
 maxUnavailable: 0
ruler:
 replicas: 0
 maxUnavailable: 0

# Single binary Loki
singleBinary:
 replicas: 0

minio:
 enabled: false

阶段 1:部署 Loki 分布式组件

在此阶段,我们将与 SSD 组件一起部署分布式 Loki 组件。我们还将 deploymentMode 更改为 SimpleScalable<->DistributedSimpleScalable<->Distributed 迁移模式允许在简单可伸缩和完全分布式架构之间实现零停机过渡。在迁移过程中,两种部署类型同时运行,共享相同的对象存储后端。

下表列出了哪些组件接管了 SSD 组件的职责

简单可伸缩组件分布式组件
写 (Deployment)Distributor + Ingester
读 (StatefulSet)Query Frontend + Querier
后端 (StatefulSet)Compactor + Ruler + Index Gateway

迁移期间 Loki 如何处理请求路由

Gateway (nginx) 根据端点类型处理请求路由

  1. 写入路径 (loki/api/v1/push)
    • 最初路由到简单可伸缩写入组件
    • 逐渐转移到 Distributor
    • 两条写入路径共享相同的对象存储,确保数据一致性
  2. 读取路径 (/loki/api/v1/query)
    • 路由到简单可伸缩读取或分布式 Query Frontend
    • 由于两种架构都从同一存储读取,查询结果一致
  3. 管理/后台操作
    • 压缩、保留和规则评估由后端或各自的分布式组件处理
    • 操作通过对象存储锁协调

开始迁移过程

  1. 创建现有 values.yaml 文件的副本,并将其命名为 values-migration.yaml

    bash
    cp values.yaml values-migration.yaml
  2. 接下来修改以下参数;deploymentModeingester 以及基于以下注释的组件。

    yaml
    ---
    loki:
      schemaConfig:
        configs:
          - from: "2024-04-01"
            store: tsdb
            object_store: s3
            schema: v13
            index:
              prefix: loki_index_
              period: 24h
      storage_config:
        aws:
          region: eu-central-1
          bucketnames: aws-chunks-bucket
          s3forcepathstyle: false
      ingester:
        chunk_encoding: snappy
        # Add this to ingester; this will force ingesters to flush before shutting down
        wal:
          flush_on_shutdown: true
      ruler:
        enable_api: true
        storage:
          type: s3
          s3:
            region: eu-central-1
            bucketnames: aws-ruler-bucket
            s3forcepathstyle: false
          alertmanager_url: http://prom:9093
      querier:
        max_concurrent: 4
    
      storage:
        type: s3
        bucketNames:
          chunks: "aws-chunks-bucket"
          ruler: "aws-ruler-bucket"
        s3:
          region: eu-central-1
    
    # Important: Make sure to change this to SimpleScalable<->Distributed
    deploymentMode: SimpleScalable<->Distributed
    
    # SSD
    backend:
      replicas: 2
    read:
      replicas: 3
    write:
      replicas: 3
    
    # Distributed Loki
    # Spin up the distributed components
    ingester:
      replicas: 3
      zoneAwareReplication:
        enabled: false
    querier:
      replicas: 3
      maxUnavailable: 0
    queryFrontend:
      replicas: 2
      maxUnavailable: 0
    queryScheduler:
      replicas: 2
    distributor:
      replicas: 2
      maxUnavailable: 0
    compactor:
      replicas: 1
    indexGateway:
      replicas: 2
      maxUnavailable: 0
    ruler:
      replicas: 1
      maxUnavailable: 0
    
    # Single binary Loki
    singleBinary:
      replicas: 0
    
    minio:
      enabled: false

    更改如下

    • ingester.wal.flush_on_shutdown: true:这将强制 Ingester 在关闭前刷新。这对于防止数据丢失非常重要。
    • deploymentMode: SimpleScalable<->Distributed:这将允许 SSD 和分布式组件同时运行。
    • 启动所有分布式组件并设置所需的副本数。
  3. 使用以下命令部署分布式组件

    bash
    helm upgrade --values values-migration.yaml loki grafana/loki -n loki 

    注意

    在继续下一阶段之前,务必等待所有组件完全启动。您可以使用以下命令检查组件的状态

    bash
    kubectl get pods -n loki

    在继续下一阶段之前,请让所有组件达到 Running 状态。

阶段 2:转换为分布式组件

迁移的最后阶段是将所有流量切换到分布式组件。这是通过缩减 SSD 组件并将 deploymentMode 更改为 Distributed 来完成的。步骤如下

  1. 创建 values-migration.yaml 的副本,并将其命名为 values-distributed.yaml

    bash
    cp values-migration.yaml values-distributed.yaml
  2. 接下来修改以下参数;deploymentMode 以及基于以下注释的组件。

    yaml
    ---
    loki:
      schemaConfig:
        configs:
          - from: "2024-04-01"
            store: tsdb
            object_store: s3
            schema: v13
            index:
              prefix: loki_index_
              period: 24h
      storage_config:
        aws:
          region: eu-central-1
          bucketnames: aws-chunks-bucket
          s3forcepathstyle: false
      ingester:
        chunk_encoding: snappy
        wal:
          flush_on_shutdown: true
      ruler:
        enable_api: true
        storage:
          type: s3
          s3:
            region: eu-central-1
            bucketnames: aws-ruler-bucket
            s3forcepathstyle: false
          alertmanager_url: http://prom:9093
      querier:
        max_concurrent: 4
    
      storage:
        type: s3
        bucketNames:
          chunks: "aws-chunks-bucket"
          ruler: "aws-ruler-bucket"
        s3:
          region: eu-central-1
    
    # Important: Make sure to change this to Distributed
    deploymentMode: Distributed
    
    # SSD
    # Scale down the SSD components
    backend:
      replicas: 0
    read:
      replicas: 0
    write:
      replicas: 0
    
    # Distributed Loki
    ingester:
      replicas: 3
      zoneAwareReplication:
        enabled: false
    querier:
      replicas: 3
      maxUnavailable: 0
    queryFrontend:
      replicas: 2
      maxUnavailable: 0
    queryScheduler:
      replicas: 2
    distributor:
      replicas: 2
      maxUnavailable: 0
    compactor:
      replicas: 1
    indexGateway:
      replicas: 2
      maxUnavailable: 0
    ruler:
      replicas: 1
      maxUnavailable: 0
    
    # Single binary Loki
    singleBinary:
      replicas: 0
    
    minio:
      enabled: false

    更改如下

    • deploymentMode: Distributed:这将允许分布式组件独立运行。
    • 将所有 SSD 组件缩减到 0
  3. 使用以下命令部署最终配置

    bash
    helm upgrade --values values-distributed.yaml loki grafana/loki -n loki 
  4. 部署完成后,您可以使用以下命令验证所有组件是否正在运行

    bash
    kubectl get pods -n loki

您应该会看到所有分布式组件正在运行,并且 SSD 组件已被移除。

下一步?

分布式模式下的 Loki 本质上比 SSD 模式更复杂。建议对您的 Loki 部署进行元监控,以确保一切运行顺畅。您可以按照元监控指南执行此操作。