Compactor

简要概述

压缩器(compactor)是 Cortex 中的一个关键服务,它通过将多个数据块合并为一个更大的优化块,帮助减少存储成本并提高查询速度。通过去除重复数据和减小索引大小,压缩器能够有效地减少存储需求。同时,通过压缩数据块,查询过程中需要查询的数据块数量也减少,从而提高了查询的效率和速度。

此外,压缩器还负责更新每个租户的桶索引。桶索引是查询服务、存储网关和规则引擎等组件用于发现存储中新数据块的重要工具。通过保持桶索引的更新,压缩器确保其他组件能够及时发现新的数据块,以便进行查询、存储和规则处理等操作。

注意:使用该组件时,对 alertmanager、ruler 与 block 不能使用相同的 s3 bucket 名称。

如何工作

块压缩有两个主要好处:

  1. 垂直压缩:相同时间范围内由所有输入者上传的块被垂直压缩。
  2. 水平压缩:将具有较小时间范围的块水平压缩为一个较大的块。

垂直压缩将同一时间范围(默认为2小时)内由输入者上传的租户的所有块合并为一个块,并且通过去重复样本将原本写入 N 个块(由于复制而产生)。这一步将每个租户在单个2小时时间范围内的块数从 #(输入者的数量) 减少到1。

水平压缩在垂直压缩之后触发,将相邻的两个2小时时间范围内的多个块压缩为一个更大的块。尽管此压缩后块块块的总大小不会改变,但它仍然可以显著减少存储网关在内存中保留的索引和索引头的大小。

jpg1

分片支持

启用分片后,多个实例可以协作,通过租户对块进行分片和分配工作负载。在任何给定时间,一个租户的所有块由单个块压缩器实例处理,但不同租户的压缩可以同时在不同的块压缩器实例上运行。

每当块压缩器池增加或减少时(例如扩容或缩容),租户将在可用的块压缩器实例之间进行重新分片,无需手动干预。

块压缩器的分片功能基于哈希环。在启动时,块压缩器生成随机令牌并将自身注册到环中。运行时,它定期扫描存储桶(每隔 -compactor.compaction-interval)以发现存储中的租户列表,并压缩与其自身在环中分配的令牌范围匹配的每个租户的块。

此功能可以通过设置 -compactor.sharding-enabled=true 启用,并通过 -compactor.ring. 标志(或它们各自的 YAML 配置选项)配置后端哈希环。

数据块删除

当块压缩器成功将一些源块压缩成一个较大的块时,源块将从存储中删除。块的删除不是立即进行的,而是遵循两个步骤的过程:

首先,将块标记为删除(软删除)。 然后,一旦块被标记为删除时间超过 -compactor.deletion-delay,块将从存储中删除(硬删除)。 块压缩器负责标记块进行删除,并在删除延迟到期后进行硬删除。软删除是基于存储桶中块位置内的一个名为 deletion-mark.json 的小文件进行的,查询器和存储网关都会查找该文件。

软删除机制用于给查询器和存储网关足够的时间在旧的源块被删除之前发现新的压缩块。如果块压缩器立即对源块进行硬删除,那么涉及压缩块的一些查询可能会失败,直到查询器和存储网关重新扫描存储桶并找到被删除的源块和新的压缩块。

配置示例

compactor:
  block_ranges:
  - 2h0m0s
  - 12h0m0s
  - 24h0m0s
  block_sync_concurrency: 20
  meta_sync_concurrency: 20
  consistency_delay: 0s
  data_dir: /data/cortex/compactor
  compaction_interval: 1h0m0s
  compaction_retries: 3
  compaction_concurrency: 1
  cleanup_interval: 15m0s
  cleanup_concurrency: 20
  deletion_delay: 12h0m0s
  tenant_cleanup_delay: 6h0m0s
  skip_blocks_with_out_of_order_chunks_enabled: false
  block_files_concurrency: 10
  blocks_fetch_concurrency: 3
  block_deletion_marks_migration_enabled: false
  sharding_enabled: true
  sharding_strategy: default
  sharding_ring:
    kvstore:
      store: "etcd"
      prefix: "/cortex/collectors/"
      etcd:
        endpoints: ["192.168.31.201:2379","192.168.31.202:2379","192.168.31.203:2379"]
        dial_timeout: 10s
        max_retries: 10
        tls_enabled: true
        tls_cert_path: "/opt/cortex/pki/server.crt"
        tls_key_path: "/opt/cortex/pki/server.key"
        tls_ca_path: "/opt/cortex/pki/ca.crt"
        tls_insecure_skip_verify: true
    heartbeat_period: 5s
    heartbeat_timeout: 1m0s
    instance_id: node1
    instance_port: 9005
    instance_addr: "192.168.31.201"

数据结构

Config

// Config holds the Compactor config.
type Config struct {
    BlockRanges                           cortex_tsdb.DurationList `yaml:"block_ranges"`
    BlockSyncConcurrency                  int                      `yaml:"block_sync_concurrency"`
    MetaSyncConcurrency                   int                      `yaml:"meta_sync_concurrency"`
    ConsistencyDelay                      time.Duration            `yaml:"consistency_delay"`
    DataDir                               string                   `yaml:"data_dir"`
    CompactionInterval                    time.Duration            `yaml:"compaction_interval"`
    CompactionRetries                     int                      `yaml:"compaction_retries"`
    CompactionConcurrency                 int                      `yaml:"compaction_concurrency"`
    CleanupInterval                       time.Duration            `yaml:"cleanup_interval"`
    CleanupConcurrency                    int                      `yaml:"cleanup_concurrency"`
    DeletionDelay                         time.Duration            `yaml:"deletion_delay"`
    TenantCleanupDelay                    time.Duration            `yaml:"tenant_cleanup_delay"`
    SkipBlocksWithOutOfOrderChunksEnabled bool                     `yaml:"skip_blocks_with_out_of_order_chunks_enabled"`
    BlockFilesConcurrency                 int                      `yaml:"block_files_concurrency"`
    BlocksFetchConcurrency                int                      `yaml:"blocks_fetch_concurrency"`

    // Whether the migration of block deletion marks to the global markers location is enabled.
    BlockDeletionMarksMigrationEnabled bool `yaml:"block_deletion_marks_migration_enabled"`

    EnabledTenants  flagext.StringSliceCSV `yaml:"enabled_tenants"`
    DisabledTenants flagext.StringSliceCSV `yaml:"disabled_tenants"`

    // Compactors sharding.
    ShardingEnabled  bool       `yaml:"sharding_enabled"`
    ShardingStrategy string     `yaml:"sharding_strategy"`
    ShardingRing     RingConfig `yaml:"sharding_ring"`

    // No need to add options to customize the retry backoff,
    // given the defaults should be fine, but allow to override
    // it in tests.
    retryMinBackoff time.Duration `yaml:"-"`
    retryMaxBackoff time.Duration `yaml:"-"`

    // Allow downstream projects to customise the blocks compactor.
    BlocksGrouperFactory   BlocksGrouperFactory   `yaml:"-"`
    BlocksCompactorFactory BlocksCompactorFactory `yaml:"-"`

    // Block visit marker file config
    BlockVisitMarkerTimeout            time.Duration `yaml:"block_visit_marker_timeout"`
    BlockVisitMarkerFileUpdateInterval time.Duration `yaml:"block_visit_marker_file_update_interval"`
}



最后修改 2023.07.06: refactor: update some (5fe4b38)