从 SSD 迁移到分布式
本指南提供从简单可伸缩部署 (SSD) 迁移到 Loki 分布式微服务部署的说明。在开始迁移之前,请确保您已阅读注意事项部分。
注意
本指南以 AWS 部署为例。但是,迁移过程适用于其他云提供商。这是因为底层数据存储无需更改。
注意事项
从简单可伸缩部署迁移到分布式部署可能实现零停机,但这需要仔细规划。应考虑以下事项
- Helm 部署:本指南假设您使用 Helm 部署 Loki。其他迁移方法也可能,但本指南不涵盖。
- Kubernetes 资源:此迁移方法要求您在关闭 SSD pod 之前启动分布式 Loki pod。这意味着您的 Kubernetes 集群需要有足够的资源同时运行 SSD 和分布式 Loki pod。
- 数据:底层数据存储无需更改。虽然数据丢失或损坏的可能性很小,但强烈建议在开始迁移过程之前备份数据。如果您使用云提供商,可以创建快照/备份。
- 配置:本指南不涵盖所有配置参数。我们只介绍需要更改的参数。其他参数可以保持不变。但是,如果
pattern_ingesters=true
,则需要在关闭 SSD Ingester 之前启动patternIngesters
。这主要用于 Grafana 日志下钻功能。 - 区域感知 Ingester:本指南目前不涵盖区域感知 Ingester。我们目前的建议是禁用区域感知 Ingester 或查阅Mimir 迁移指南。请注意,Mimir 和 Loki 并非所有参数都相同。
前提条件
在开始迁移过程之前,请确保满足以下前提条件
- 通过
kubectl
访问您的 Kubernetes 集群。 - 已安装 Helm。
示例 SSD 部署
本示例将使用以下 SSD 部署作为参考
注意
本示例仅作为需要更改的参数的参考。您自己的配置中可能还有其他参数,例如
limits_config
、gateway
、compactor
等。这些参数可以保持不变。
---
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<->Distributed
。SimpleScalable<->Distributed
迁移模式允许在简单可伸缩和完全分布式架构之间实现零停机过渡。在迁移过程中,两种部署类型同时运行,共享相同的对象存储后端。
下表列出了哪些组件接管了 SSD 组件的职责
简单可伸缩组件 | 分布式组件 |
---|---|
写 (Deployment) | Distributor + Ingester |
读 (StatefulSet) | Query Frontend + Querier |
后端 (StatefulSet) | Compactor + Ruler + Index Gateway |
迁移期间 Loki 如何处理请求路由
Gateway (nginx) 根据端点类型处理请求路由
- 写入路径 (
loki/api/v1/push
)- 最初路由到简单可伸缩写入组件
- 逐渐转移到 Distributor
- 两条写入路径共享相同的对象存储,确保数据一致性
- 读取路径 (
/loki/api/v1/query
)- 路由到简单可伸缩读取或分布式 Query Frontend
- 由于两种架构都从同一存储读取,查询结果一致
- 管理/后台操作
- 压缩、保留和规则评估由后端或各自的分布式组件处理
- 操作通过对象存储锁协调
开始迁移过程
创建现有
values.yaml
文件的副本,并将其命名为values-migration.yaml
。cp values.yaml values-migration.yaml
接下来修改以下参数;
deploymentMode
、ingester
以及基于以下注释的组件。--- 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 和分布式组件同时运行。- 启动所有分布式组件并设置所需的副本数。
使用以下命令部署分布式组件
helm upgrade --values values-migration.yaml loki grafana/loki -n loki
注意
在继续下一阶段之前,务必等待所有组件完全启动。您可以使用以下命令检查组件的状态
kubectl get pods -n loki
在继续下一阶段之前,请让所有组件达到
Running
状态。
阶段 2:转换为分布式组件
迁移的最后阶段是将所有流量切换到分布式组件。这是通过缩减 SSD 组件并将 deploymentMode
更改为 Distributed
来完成的。步骤如下
创建
values-migration.yaml
的副本,并将其命名为values-distributed.yaml
。cp values-migration.yaml values-distributed.yaml
接下来修改以下参数;
deploymentMode
以及基于以下注释的组件。--- 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
。
使用以下命令部署最终配置
helm upgrade --values values-distributed.yaml loki grafana/loki -n loki
部署完成后,您可以使用以下命令验证所有组件是否正在运行
kubectl get pods -n loki
您应该会看到所有分布式组件正在运行,并且 SSD 组件已被移除。
下一步?
分布式模式下的 Loki 本质上比 SSD 模式更复杂。建议对您的 Loki 部署进行元监控,以确保一切运行顺畅。您可以按照元监控指南执行此操作。