跳转至

配置文件

Loki 的配置文件非常复杂,配置起来有一定难度,所以我们非常有必要对 Loki 配置文件进行专门的分析。Loki 配置文件 loki.yaml 支持的内容和默认值数据:

# 用逗号分隔组件列表运行,默认的值 all 运行 Loki 在单个二进制文件中。
# 值 read 是一个别名,用于仅在同一进程中运行与读取路径相关的组件,如 querier 和 query-frontend。
# 值 write 同样是一个别名,用于仅在同一进程中运行与写路径相关的组件,如 ingester 和 distributor。
# 支持的值包括:all, compactor, distributor, ingester, querier, query-scheduler,
#  ingester-querier, query-frontend, index-gateway, ruler, table-manager, read, write。
# 当使用 `-list-target` 命令行标志运行 Loki 时,可以打印可用目标的完整列表。
[target: <string> | default = "all"]

# 通过 X-Scope-OrgID Header 启用身份验证,如果为 true,该 Header 必须存在。
# 如果为 false,OrgID 将始终设置为 "fake"。
[auth_enabled: <boolean> | default = true]

[ballast_bytes: <int> | default = 0]

# 配置已启动服务的 HTTP 和 gRPC 服务器通信。
[server: <server>]

# 配置 distributor。
[distributor: <distributor>]

# 配置 querier,仅在运行所有模块或 querier 时适用。
[querier: <querier>]

# query_scheduler 块配置 Loki 查询调度程序。
# 配置后,它将租户查询队列与查询前端分离
[query_scheduler: <query_scheduler>]

# 配置 Loki query-frontend 模块
[frontend: <frontend>]

# 在 Loki query-frontend 配置查询分割和缓存。
[query_range: <query_range>]

# 配置 Loki ruler 模块
[ruler: <ruler>]

# 配置 distributor 如何连接到 ingester。
# 仅在运行所有组件、distributor 或 querier 时适用。
[ingester_client: <ingester_client>]

# 配置 ingester 以及 ingester 如何将自己注册到 kv 存储。
[ingester: <ingester>]

# 配置 Loki 存储数据的地方
[storage_config: <storage_config>]

# 配置 Loki 在指定的存储中如何存储数据
[chunk_store_config: <chunk_store_config>]

# 配置 chunk 索引 schema 和存储的位置
[schema_config: <schema_config>]

# 配置 compactor 组件,该组件压缩索引分片以提高性能
[compactor: <compactor>]

# 配置每个租户或全局的限制
[limits_config: <limits_config>]

# 配置在 Loki querier 中运行的 worker - 拾取并执行查询前端排队的查询。
[frontend_worker: <frontend_worker>]

# 配置用于保留的 table manager。
[table_manager: <table_manager>]

# 配置 runtime config 模块,负责重新加载运行时配置文件。
[runtime_config: <runtime_config>]

# 配置 tracing
[tracing: <tracing>]

# 多个模块之间共享的通用配置。
# 如果在其他部分中给出了更具体的配置,则将忽略此部分中的相关配置。
[common: <common>]

# 使用情况报告的配置
[analytics: <analytics>]

这里我们主要介绍几个核心的配置块。

common

通用配置块 common 是由不同组件共享的公共定义,这样,就不必在多个地方重复配置了,下面是该配置块的相关属性:

# 不同 Loki 组件使用的公共存储配置
[storage: <storage>]

# 定义后,指定前缀将出现在端点路径的前面
[path_prefix: <string>]

# 传入的数据应该被复制到 ingester 组件多少次
[replication_factor: <int> | default = 3]

# 如果为 true,则 ingester、compactor 和 query_scheduler 的 ring tokens 将保存到 path_prefix 目录中的文件中。如果将其设置为 true 且 path_prefix 前缀为空,Loki 将出错。
[persist_tokens: <boolean>: default = false]

# 用于内部查找地址的通用的网络接口列表。
# 如果设置了更具体的 "instance_interface_names",则忽略此选项。
# 如果在公共的 ring 模块下配置了 "instance_interface_names",则该通用配置 "instance_interface_names" 只适用于前端,而不适用于与 ring 相关的组件(比如:distributor、ruler 等等)
[instance_interface_names: <list of string> | default = [<private network interfaces>]]

# Loki 组件用于暴露其地址的公共地址。
# 如果配置了更具体的 "instance_addr" 地址,该配置会被忽略。
# 如果 "instance_addr" 在公共 ring 部分下配置了,则该通用 "instance_addr" 配置只适用于前端,而不适用于与 ring 相关的组件(比如:distributor、ruler 等等)。
[instance_addr: <string>]

# 所有 Loki rings 使用的通用 ring 配置。
# 如果指定了通用的 ring 环,则其值用于定义任何未定义的 ring 值。
# 例如,你可以期望 distributor 的 ring 环使用公共部分中定义的 `heartbeat_period`,但前提是 distributor 的 ring 本身没有配置 `heartbeat_period`。
[ring: <ring>]

上面的通用配置块中有一个 storage 的配置项,用来定义 Loki 不同组件使用的公共存储配置。如果在配置文件的其他位置提供了对象存储客户端的任何特定配置,则该特定配置将取代通用存储配置,对应的属性如下所示:

# azure 配置
[azure: <azure_storage_config>]

# gcs 配置
[gcs: <gcs_storage_config>]

# s3 配置
[s3: <s3_storage_config>]

# swift 配置
[swift: <swift_storage_config>]

# 配置一个(本地)文件系统
[filesystem: <filesystem>]

[hedging: <hedging_config>]

storage_config

Loki 的存储引擎配置,这个配置块里面主要定义的是各类存储的一些基本信息。如下所示:

# 在 AWS 中的 chunks 存储的配置。必需的选项只有在 aws 出现时才需要。
aws:
  # S3 或 S3 兼容的 endpoint URL 地址,带有编码的 Key 和 Secret。
  # 如果仅将 region 配置为主机,则将推断出正确的端点。
  # CLI flag: -s3.url
  [s3: <string>]

  # 设置为 true 可强制请求使用 path-style 寻址
  # CLI flag: -s3.force-path-style
  [s3forcepathstyle: <boolean> | default = false]

  # 以逗号分隔的 buckets 名称列表,用于均匀分布 chunks。
  # 在 s3.url 标志中覆盖任意的 buckets
  # CLI flag: -s3.buckets
  [bucketnames: <string> | default = ""]

  # 连接的 S3 Endpoint
  # CLI flag: -s3.endpoint
  [endpoint: <string> | default = ""]

  # AWS 使用的区域
  # CLI flag: -s3.region
  [region: <string> | default = ""]

  # AWS Access Key ID.
  # CLI flag: -s3.access-key-id
  [access_key_id: <string> | default = ""]

  # AWS Secret Access Key.
  # CLI flag: -s3.secret-access-key
  [secret_access_key: <string> | default = ""]

  # 禁用 https
  # CLI flag: -s3.insecure
  [insecure: <boolean> | default = false]

  # 启用 AES256 AWS 服务器端加密
  # CLI flag: -s3.sse-encryption
  [sse_encryption: <boolean> | default = false]

  # ... 省略其他配置

  # 配置 DynamoDB 连接
  dynamodb:
    # DynamoDB URL 地址
    # CLI flag: -dynamodb.url
    dynamodb_url: <string>
    # ...... 省略 dynamodb 配置

# 在 Bigtable 中配置存储索引。只有在配置中定义了 bigtable 时,才需要必填字段。
bigtable:
  # BigTable project ID
   # CLI flag: -bigtable.project
  project: <string>

  # BigTable instance ID
  # CLI flag: -bigtable.instance
  instance: <string>

  # 配置连接到 Bigtable 的 gRPC 客户端
  [grpc_client_config: <grpc_client_config>]

# 配置存储 chunks 在 GCS 中,只有在配置中定义了 gcs 时才需要该字段
gcs:
  # 要放入 chunks 的 GCS 存储桶的名称。
  # CLI flag: -gcs.bucketname
  bucket_name: <string>

  # GCS客户端用于每个 PUT 请求的缓冲区大小,0表示禁用 buffer。
  # to disable buffering.
  # CLI flag: -gcs.chunk-buffer-size
  [chunk_buffer_size: <int> | default = 0]

  # 对 GCS 的请求超时的时间。
  # CLI flag: -gcs.request-timeout
  [request_timeout: <duration> | default = 0s]

# 在 Cassandra 中存储 chunks 和/或 索引的配置
cassandra:
  # 用逗号分隔的 Cassandra 实例的主机名或 IPs
  # CLI flag: -cassandra.addresses
  addresses: <string>
  # cassandra 端口
  # CLI flag: -cassandra.port
  [port: <int> | default = 9042]

  # ...... 省略

swift:
#   ...... 省略

# 存储索引在 BoltDB 中的配置。
boltdb:
  # BoltDB 索引文件路径
  # CLI flag: -boltdb.dir
  directory: <string>

# 存储 chunks 在本地文件系统
filesystem:
  # chunks 存储的路径
  # CLI flag: -local.chunk-directory
  directory: <string>

# 以 boltdb 文件的形式在对象存储(GCS/S3/Azure/Swift/Filesystem)中配置存储索引。
boltdb_shipper:
  # ingesters 将数据写入 boltdb 文件的目录,然后由 shipper 上传到配置的存储中
  # CLI flag: -boltdb.shipper.active-index-directory
  [active_index_directory: <string> | default = ""]

  # 用于保存 boltdb 文件的共享存储,支持的类型有:gcs、s3、azure、filesystem
  # CLI flag: -boltdb.shipper.shared-store
  [shared_store: <string> | default = ""]

  # 用于恢复查询的 boltDB 文件的缓存位置
  # CLI flag: -boltdb.shipper.cache-location
  [cache_location: <string> | default = ""]

  # 查询缓存中恢复的 boltDB 文件的 TTL
  # CLI flag: -boltdb.shipper.cache-ttl
  [cache_ttl: <duration> | default = 24h]

  # 将下载的文件与存储重新同步的频率
  # CLI flag: -boltdb.shipper.resync-interval
  [resync_interval: <duration> | default = 5m]

  # 为查询保留下载索引的天数,仅适用于以24小时周期创建的表。
  # CLI flag: -boltdb.shipper.query-ready-num-days
  [query_ready_num_days: <int> | default = 0]

  index_gateway_client:
    # Index Gateway gRPC 服务地址
    # CLI flag: -boltdb.shipper.index-gateway-client.server-address
    [server_address: <string> | default = ""]
    # 连接 Index Gateway gRPC 服务的 gRPC 客户端
    [grpc_client_config: <grpc_client_config>]

# 活跃索引的缓存有效期,不应高于 ingester 设置中的 `chunk_idle_period`。
# CLI flag: -store.index-cache-validity
[index_cache_validity: <duration> | default = 5m]

# 每批获取的最大 chunks 数。
# CLI flag: -store.max-chunk-batch-size
[max_chunk_batch_size: <int> | default = 50]

# 配置如何构建索引查询的缓存。
index_queries_cache_config: <cache_config>

distributor

distributor 配置块用于配置 distributor 组件,该配置块对应的属性有:

# 配置 distributors ring,在启用 "global" 摄取率策略时使用。
ring:
  kvstore:
    # ring 使用的后端存储,支持的值包括:consul、etcd、inmemory、memberlist
    # memberlist 使用的是 gossip 协议来让集群内的所有节点达到最终一致性的
    # CLI flag: -distributor.ring.store
    store: <string>

    # 存储中 key 的前缀, 应以 `/` 结尾。
    # CLI flag: -distributor.ring.prefix
    [prefix: <string> | default = "collectors/"]

    # Consul 客户端配置,只有当 store 配置为 `consul` 的时候才适用
    # 此块配置的 CLI 标志前缀为:distributor.ring
    [consul: <consul_config>]

    # ETCD v3 客户端配置,只有当 store 配置为 `etcd` 的时候才适用
    # 此块配置的 CLI 标志前缀为:distributor.ring
    [etcd: <etcd_config>]

  # 心跳超时,在此超时之后,ring 内的 distributor 被视为不健康,0表示never
  # CLI flag: -distributor.ring.heartbeat-timeout
  [heartbeat_timeout: <duration> | default = 1m]

ingester

ingester 配置块用于配置 loki ingester 组件,该配置块对应的属性有:

# 配置 ingester 的生命周期 - 将如何运行以及在何处注册以进行发现。
lifecycler:
  ring:
    kvstore:
      # ring 使用的后端存储,支持的值包括:consul、etcd、inmemory、memberlist
      # CLI flag: -ring.store
      [store: <string> | default = "consul"]

      # 存储中 key 的前缀, 应以 `/` 结尾。
      # CLI flag: -ring.prefix
      [prefix: <string> | default = "collectors/"]

      # consul 客户端配置
      # CLI flag: <no prefix>
      [consul: <consul_config>]

      # etcd 客户端配置
      # CLI flag: <no prefix>
      [etcd: <etcd_config>]

    # 心跳🏪后将跳过 ingesters 的读/写操作。
    # CLI flag: -ring.heartbeat-timeout
    [heartbeat_timeout: <duration> | default = 1m]

    # 要写入和读取的 ingesters 数。
    # CLI flag: -distributor.replication-factor
    [replication_factor: <int> | default = 3]

  # lifecycler 将生成并放入 ring 中的 tokens 数
  # 如果它加入 ring 而不从另一个 lifecycler 转移 token。
  # CLI flag: -ingester.num-tokens
  [num_tokens: <int> | default = 128]

  # 底层 ring 的心跳周期
  # CLI flag: -ingester.heartbeat-period
  [heartbeat_period: <duration> | default = 5s]

  # 当另一个成员离开时,要等待多长时间才能从另外成员处声明 tokens 和 chunks。将在到期后自动加入。
  # CLI flag: -ingester.join-after
  [join_after: <duration> | default = 0s]

  # 生成后观察 tokens 以解决冲突。当使用 gossip ring 的时候非常有用
  # CLI flag: -ingester.observe-period
  [observe_period: <duration> | default = 0s]

  # 准备就绪前的最短等待时间。这是为了解决 ingesters 退出和更新环的 race conditions。
  # CLI flag: -ingester.min-ready-duration
  [min_ready_duration: <duration> | default = 15s]

  # 要从中读取地址的网络接口的名称。
  # CLI flag: -ingester.lifecycler.interface
  interface_names:
    - [<string> ... | default = [<private network interfaces>]]

  # 退出前的 sleep 时间,以确保指标被正常抓取。
  # CLI flag: -ingester.final-sleep
  [final_sleep: <duration> | default = 30s]

# 最大转移 chunks 重试次数
# CLI flag: -ingester.max-transfer-retries
[max_transfer_retries: <int> | default = 0]

# flush 操作并发数
# CLI flag: -ingester.concurrent-flushes
[concurrent_flushes: <int> | default = 32]

# ingester 应多久检查一次是否有数据堵塞需要 flush
# CLI flag: -ingester.flush-check-period
[flush_check_period: <duration> | default = 30s]

# flush被取消前的超时时间
# CLI flag: -ingester.flush-op-timeout
[flush_op_timeout: <duration> | default = 10m]

# flush chunk 后,应在内存中保留多长时间。
# CLI flag: -ingester.chunks-retain-period
[chunk_retain_period: <duration> | default = 0s]

# 如果 chunk 没有达到最大块大小,则在刷新之前,chunk 应该在内存中保留多长时间,并且没有更新。
# 这意味着,只要 half-empty 的 chunks 没有接收到进一步的内容,它们在某个时间段之后仍将被刷新。
# CLI flag: -ingester.chunks-idle-period
[chunk_idle_period: <duration> | default = 30m]

# 一个 chunk block 未压缩的大小
# 当超过该阈值后,head block 会被裁剪并压缩到 chunk 中去。
# CLI flag: -ingester.chunks-block-size
[chunk_block_size: <int> | default = 262144]

# chunks 压缩后的大小
# 这是一个理想的大小,而不是一个确切的大小,如果因为其他原因(比如 chunk_idle_period)被 flush,chunks 可能会稍微大一些或者明显小一些。
# 值为0时,将创建固定10个blocks的块,非0值将创建具有可变 blocks 的块,以满足目标大小。
# CLI flag: -ingester.chunk-target-size
[chunk_target_size: <int> | default = 1572864]

# chunks的压缩算法(支持的值: gzip, lz4, snappy)
# 根据需求选择合适的算法:
# - `gzip` 最高的压缩率但是也是最慢的压缩速度 (144 kB/chunk)
# - `lz4` 最快的压缩速度 (188 kB/chunk)
# - `snappy` 快速流行的压缩算法 (272 kB/chunk)
# CLI flag: -ingester.chunk-encoding
[chunk_encoding: <string> | default = gzip]

# 用于同步 ingesters 以同时切割 chunks 的参数。
# 同步周期用于将传入条目滚动到新的 chunk,如果 chunk 的利用率不够高(例如 当 sync_min_utilization 被设置为0.5,小于50%),那么 chunk 的滚动就不会发生。
# CLI flag: -ingester.sync-period
[sync_period: <duration> | default = 0]

# 最小的同步利用率
# CLI flag: -ingester.sync-min-utilization
[sync_min_utilization: <float> | Default = 0]

# 当 push 失败后,流将向用户报告的最大错误数,0表示没限制。
# CLI flag: -ingester.max-ignored-stream-errors
[max_returned_stream_errors: <int> | default = 10]

# 内存中 timeseries chunk 的最大持续时间。
# 如果一个 timeseries 运行时间超过该值,当前 chunk 将刷新到存储,并创建一个新区块。
# CLI flag: -ingester.max-chunk-age
[max_chunk_age: <duration> | default = 2h]

# 过去多长时间 ingester 可以查询存储中的数据。
# 这只适用于使用 `filesystem` 存储的共享 ring 运行的多个 Loki 二进制文件,不会在二进制文件之间共享。
# 当使用任何共享存储比如S3、GCS的时候,该值必须设置为0。
# 使用除 `filesystem` 以外的任何对象存储时,将其配置为非零值是错误的。
# 使用值 -1 允许 ingester 在时间上无限远地查询存储。
# CLI flag: -ingester.query-store-max-look-back-period
[query_store_max_look_back_period: <duration> | default = 0]

# 忘记 ingesters 的心跳时间戳,比 `ring.kvstore.heartbeat_timeout` 还要早。
# 这相当于单击UI中的`/ring`、`forget` 按钮:
# ingester 将会从 ring 中移出掉。
# 当你确定不健康的节点不会返回时,这是一个有用的设置。
# 一个示例是当不使用有状态集时。
# 使用 `memberlist.rejoin_interval` > 0 来处理网络分区情况当使用成员列表时。
# CLI flag: -ingester.autoforget-unhealthy
[autoforget_unhealthy: <boolean> | default = false]

# ingester WAL 记录传入的日志和存储他们在本地文件系统为了保证已确认数据的持久性在进程崩溃的情况下。
wal:
  # 启用对 WAL 的写操作。
  # CLI flag: -ingester.wal-enabled
  [enabled: <boolean> | default = true]

  # WAL 数据目录
  # CLI flag: -ingester.wal-dir
  [dir: <filename> | default = "wal"]

  # 启用 WAL 时,应在关机时将 chunks 刷新到长期存储中
  # CLI flag: -ingester.flush-on-shutdown
  [flush_on_shutdown: <boolean> | default = false]

  # checkpoints 被创建的间隔
  # CLI flag: ingester.checkpoint-duration
  [checkpoint_duration: <duration> | default = 5m]

  # WAL 在重放期间可能使用的最大内存大小。
  # 达到后,在继续之前将数据刷新到存储中去。
  # 可以使用的单位后缀包括:KB、MB、GB。
  [replay_memory_ceiling: <string> | default = 4GB]

# ingesters 中用于进程内倒排索引的分片。
# 这必须被所有 schema 中的 shard factors 整除,否则 Loki 将不会启动。
[index_shards: <int> | default = 32]

querier

querier 配置块用于配置 querier 组件,包含的属性有:

# 在执行查询请求期间查询 ingesters 或存储的超时时间。
# CLI flag: -querier.query-timeout
[query_timeout: <duration> | default = 1m]

# 为实时跟踪请求提供服务的最长持续时间。
# CLI flag: -querier.tail-max-duration
[tail_max_duration: <duration> | default = 1h]

# 发送超过最小成功查询请求之前的等待时间。
# CLI flag: -querier.extra-query-delay
[extra_query_delay: <duration> | default = 0s]

# 最大回溯期,超过该值,查询不会发送到 ingester。
# 0 意味着所有的 queries 被发送到 ingester。
# CLI flag: -querier.query-ingesters-within
[query_ingesters_within: <duration> | default = 3h]

# 允许的最大并发查询数
# CLI flag: -querier.max-concurrent
[max_concurrent: <int> | default = 10]

# 仅查询存储中的数据,不尝试查询任何 ingesters
# CLI flag: -querier.query-store-only
[query_store_only: <boolean> | default = false]

# 是否允许查询多个租户
# CLI flag: -querier.multi-tenant-queries-enabled
[multi_tenant_queries_enabled: <boolean> | default = false]

# LogQL 引擎配置选项
engine:
  # 查询执行超时时间
  # CLI flag: -querier.engine.timeout
  [timeout: <duration> | default = 3m]

  # 查找日志行的最长时间,仅适用于即时日志查询。
  # CLI flag: -querier.engine.max-lookback-period
  [max_look_back_period: <duration> | default = 30s]

query_range

用于在 Loki 查询前端配置查询分割和缓存。

# 不推荐: 按日拆分查询并行执行。
# 用 -querier.split-queries-by-interval 代替.
# CLI flag: -querier.split-queries-by-day
[split_queries_by_day: <boolean> | default = false]

# 对传入查询进行变更,使其开始和结束与其步长保持一致。
# CLI flag: -querier.align-querier-with-step
[align_queries_with_step: <boolean> | default = false]

results_cache:  # 缓存
  cache: <cache_config>

# 缓存查询结果
# CLI flag: -querier.cache-results
[cache_results: <boolean> | default = false]

# 单个请求的最大重试次数
# CLI flag: -querier.max-retries-per-request
[max_retries: <int> | default = 5]

# 根据存储分片配置执行查询并行化,并查询AST。此功能仅由 chunks 存储引擎支持。
# CLI flag: -querier.parallelise-shardable-queries
[parallelise_shardable_queries: <boolean> | default = true]

schema_config

这里面主要定义的是 Loki 数据存储的策略,从默认的配置里面可以得到的信息是 Loki 里面保存的是2018年4月15日之后的数据,同时原始文件(chunks)存在 filesystem 中,index 存在 boltdb 当中且保存的周期是168小时。

# 用于 chunk 索引 schemas 配置
configs:
- [<period_config>]

其中就包含一个 period_config 列表,该配置块用于配置从特定的时间段应该使用哪些索引模式。

# 应该创建索引 buckets 的第一天的日期。
# 如果这是唯一的 `period_config`,则使用过去的日期,否则在希望模式切换时使用日期。
# YYYY-MM-DD 格式, 例如: 2018-04-15.
[from: <daytime>]

# 下面的 store 和 object_store 会决定使用哪个 <storage_config> key。

# 用于索引的存储:aws、aws-dynamo、gcp、bigtable、bigtable-hashed、cassandra、boltdb 或者 boltdb-shipper。
store: <string>

# 用于 chunks 的存储:aws、azure、gcp、bigtable、gcs、cassandra、swift 或者 filesystem
# 如果省略,则默认为与 store 相同的值。
[object_store: <string>]

# schema 使用的版本
schema: <string>

# 配置索引如何更新和存储
index:
  # 所有周期表的表前缀。
  prefix: <string>
  # Table 周期.
  [period: <duration> | default = 168h]
  # 要添加到所有管理的表中的标签。
  tags:
    [<string>: <string> ...]

# 配置 chunks 的更新和存储方式。
chunks:
  prefix: <string>
  [period: <duration> | default = 168h]
  tags:
    [<string>: <string> ...]

# 将创建多少个分片。仅当 schema 为 v10 或更高版本时使用。
[row_shards: <int> | default = 16]

Loki 对于数据存储的目标是向后兼容,通过修改 Schema 配置允许以增量方式升级到新的存储模式。首先,我们需要在schema_config 中创建一个新的 configs 条目,要记住的是新加的存储模式起始时间必须是将来的某个时间点,这样 Table Manager 就可以在之前创建所需的表,并确保不会查询现有数据。否则在查询时会因丢失旧的日志索引造成无法检索。例如我们要把2022年6月18日之后的 Loki 日志切换到 cassandra 和 S3 上,那么按照如下配置后,重启服务即可。

schema_config:
  configs:
  - from: 2018-04-15
    store: boltdb
    object_store: filesystem
    schema: v10
    index:
      prefix: index_
      period: 168h
  - from: 2022-06-18
    store: cassandra
    object_store: aws
    schema: v11
    index:
      prefix: index_
      period: 720h
    chunks:
      prefix: chunks_
      period: 720h
storage_config:
  boltdb:
    directory: /data/loki/index
  filesystem:
    directory: /data/loki/chunks
  cassandra:
    username: cassandra
    password: cassandra
    addresses: cassandra
    auth: true
    keyspace: lokiindex
  aws:
    s3: s3://<accessKey>:<secretKey>@<s3_url>/<buckets>
    s3forcepathstyle: true

上面的配置意思就是对于2022年6月18日之前保存的所有数据,Loki 使用 v10 的 schema,到点之后就采用 v11 的 schema 策略来存储日志。

cache_config

cache_config 块用来配置 Loki 将如何缓存 requests、chunks 和索引到一个后端缓存存储中去。

# 开启内存缓存
# CLI flag: -<prefix>.cache.enable-fifocache
[enable_fifocache: <boolean>]

# 缓存的默认有效期(除非重写)。
# CLI flag: -<prefix>.default-validity
[default_validity: <duration>]

# 在使用 memcached 时配置后台缓存
background:
  # 有多少 goroutines 用来写回 memcached。
  # CLI flag: -<prefix>.background.write-back-concurrency
  [writeback_goroutines: <int> | default = 10]

  # 后台写回 memcached 需要缓存多少 chunks。
  # CLI flagL -<prefix>.background.write-back-buffer
  [writeback_buffer: <int> = 10000]

# 配置 memcached
memcached:
  # 配置 memcached 中的 key 有效期
  # CLI flag: -<prefix>.memcached.expiration
  expiration: <duration>

  # 配置每个批处理请求中要获取的 keys 数量。
  # CLI flag: -<prefix>.memcached.batchsize
  batch_size: <int> | default = 1024

  # 对 memcached 的最大活动请求数。
  # CLI flag: -<prefix>.memcached.parallelism
  [parallelism: <int> | default = 100]

# 配置如何连接到一个或多个 memcached 服务器
memcached_client:
  # 缓存 chunks 时用于 memcached 服务的主机名。
  # 如果为空,没有 memcached 会被使用。将使用 SRV 查找。
  # CLI flag: -<prefix>.memcached.hostname
  [host: <string>]

  # 用于发现 memcached 服务器的 SRV 服务。
  # CLI flag: -<prefix>.memcached.service
  [service: <string> | default = "memcached"]

  # (实验性的) DNS 服务发现地址列表(逗号分隔)
  # https://cortexmetrics.io/docs/configuration/arguments/#dns-service-discovery
  # CLI flag: -<prefix>.memcached.addresses
  [addresses: <string> | default = ""]

  # memcached 请求超时时间
  # CLI flag: -<prefix>.memcached.timeout
  [timeout: <duration> | default = 100ms]

  # memcached 客户端池中的最大空闲连接数。
  # CLI flag: -<prefix>.memcached.max-idle-conns
  [max_idle_conns: <int> | default = 16]

  # 轮询 memcached 服务器的 DNS 的时间间隔。
  # CLI flag: -<prefix>.memcached.update-interval
  [update_interval: <duration> | default = 1m]

  # 是否使用一致哈希来发现多个 memcached 服务器。
  # CLI flag: -<prefix>.memcached.consistent-hash
  [consistent_hash: <boolean> | default = true]

  # CLI flag: -<prefix>.memcached.max-item-size
  [max_item_size: <int> | default = 0]
  # ...... 省略

redis:
  # 用于缓存的 Redis Server 或 Cluster 配置
  # CLI flag: -<prefix>.redis.endpoint
  [endpoint: <string>]
  # ...... 省略

fifocache:
  # 最大缓存大小(bytes)
  # CLI flag: -<prefix>.fifocache.max-size-bytes
  [max_size_bytes: <string> | default = "1GB"]

  # 最多缓存多少 items
  # CLI flag: -<prefix>.fifocache.max-size-items
  [max_size_items: <int> | default = 0]

  # 缓存有效期
  # The value of 0 disables auto-expiration.
  # CLI flag: -<prefix>.fifocache.ttl
  [ttl: <duration> | default = 1h]

table_manager

Table Manager 是 Loki的一个组件,主要负责在其时间段开始之前创建周期表,并在其数据时间范围超出保留期限时将其删除。它当前支持的后端包含如下

# 用于表容量更新的主“关闭开关”,例如故障排除时。
# CLI flag: -table-manager.throughput-updates-disabled
[throughput_updates_disabled: <boolean> | default = false]

# 用于表保留删除的主开关
# CLI flag: -table-manager.retention-deletes-enabled
[retention_deletes_enabled: <boolean> | default = false]

# 在删除表之前,它们将保留多长时间,0s表示禁用删除。
# 保留期必须是 index / chunks 表 "period" 的倍数。
# CLI flag: -table-manager.retention-period
[retention_period: <duration> | default = 0s]

# 表管理器轮询表的时间间隔。
# CLI flag: -table-manager.poll-interval
[poll_interval: <duration> | default = 2m]

# 在需要创建表之前的持续时间。
# CLI flag: -table-manager.periodic-table.grace-period
[creation_grace_period: <duration> | default = 10m]

# 配置 DynamoDB 索引表。
# The CLI flags prefix for this block config is: table-manager.index-table
index_tables_provisioning: <provision_config>

# 配置 DynamoDB chunk 表。
# The CLI flags prefix for this block config is: table-manager.chunk-table
chunk_tables_provisioning: <provision_config>

默认情况下,原始日志文件除了使用 filesystem 的存储有周期删除旧日志文件外,Loki 的其他 chunk 存储均不会删除旧日志文件 ,如果你的日志原始文件存储在 S3 上,那么我们可以直接找到旧的文件删除,这个动作仅仅只会影响我们查询不到这个时间区域的日志内容。如果你的 Loki 存储用了 table-based 的存储服务,那么日志的留存策略就会受到 Table Manager 的节制,它当前支持的后端包含如下:

  • Index 日志索引
  • Amazon DynamoDB
  • Google Bigtable
  • Apache Cassandra
  • BoltDB (主要用于本地环境)
  • Chunk 日志原始文件
  • Amazon DynamoDB
  • Google Bigtable
  • Apache Cassandra
  • Filesystem (主要用于本地环境)

由于具有破坏性,默认情况下 Table Manager 功能被禁用,我们可以在配置中显式启用数据删除策略并将其保留期设置为大于0。

table_manager:
  retention_deletes_enabled: true
  retention_period: 336h