Error asking ring for who should run the compactor, will check again

  • Loki - 2.9.14, MacOS
  • single-node setup, no HA, all components on same host.
  • MinIO as object store & kvstore = memberlist
  • using Fluent-bit as a log scraper and sending to Loki
  • max log velocity- for testing = 10 MB/sec & for production = 500 MB/sec
  • gets the following warn/error after 15-20 minutes after starting
  • We get the same type of error even for kvstore = in-memory
  • /ring runs fine.
  • Is this a default behaviour?
  • Do we need to run the read, write & backend components as separate entities?
  • I don’t want to run separate components; all should be on the same host (No microservices, Docker, or Kubernetes)
  • Can I get such a Loki configuration?
level=error ts=2025-05-10T03:06:29.242323Z caller=compactor.go:462 msg="error asking ring for who should run the compactor, will check again" err="at least 1 healthy replica required, could only find 0 - unhealthy instances: 127.0.0.1:9095"

level=warn ts=2025-05-10T03:06:29.803726Z caller=server.go:2220 traceID=1ff7b37df06a6002 orgID=fake msg="POST /loki/api/v1/push (500) 471.282µs Response: \"at least 1 live replicas required, could only find 0 - unhealthy instances: 127.0.0.1:9095\\n\" ws: false; Connection: keep-alive; Content-Length: 16055; Content-Type: application/json; User-Agent: Fluent-Bit; "
  • loki configuration:
# Loki 2.9.14
# MinIO + memberlist

# target:

auth_enabled: false
ballast_bytes: 10000
server:
 http_listen_address: 127.0.0.1
 http_listen_port: 3100
 grpc_listen_address: 127.0.0.1
 grpc_listen_port: 9095
 http_server_read_timeout: 10m
 http_server_write_timeout: 10m
 http_server_idle_timeout: 5m
 grpc_server_max_recv_msg_size: 41943040
 grpc_server_max_send_msg_size: 41943040
 grpc_server_max_concurrent_streams: 0
 grpc_server_max_connection_age: 5m
 log_level: warn

distributor:
  ring:
    kvstore:
      store: memberlist
    heartbeat_period: 5s # default = 5s
    heartbeat_timeout: 5m # default = 1m

querier:
  tail_max_duration: 12h  # default = 1h
  query_ingesters_within: 0h # default = 3h
  engine:
    timeout: 5m # default = 5m
    max_look_back_period: 168h  # 7 days, default = 30s
  max_concurrent: 4  # default = 4, 2-core CPU → 4, 4-core CPU → 8

query_scheduler:
  max_outstanding_requests_per_tenant: 64000 # default = 32000
  grpc_client_config:
    max_recv_msg_size: 209715200 # default = 104857600 (bytes)
    max_send_msg_size: 209715200 # default = 104857600 (bytes)
    grpc_compression: 'snappy'  # default = ""
    rate_limit: 0 # default = 0
    rate_limit_burst: 0 # default = 0
    backoff_on_ratelimits: true # default = false
    backoff_config:
      min_period: 100ms # default = 100ms
      max_period: 10s # default = 10s
      max_retries: 10  # default = 10
    tls_enabled: false # default = false
    connect_timeout: 0s # default = 5s
  use_scheduler_ring: false  # default = false
  scheduler_ring:
    kvstore:
      store: memberlist  # default = "consul"
      prefix: "collectors/"  # default = "collectors/"

frontend:
  log_queries_longer_than: 60s  # default = 0s
  query_stats_enabled: true # default = false
  max_outstanding_per_tenant: 8192  # default = 2048
  grpc_client_config:
    max_recv_msg_size: 209715200 # default = 104857600 (bytes)
    max_send_msg_size: 209715200 # default = 104857600 (bytes)
    grpc_compression: 'snappy'  # default = ""
    rate_limit: 0 # default = 0
    rate_limit_burst: 0 # default = 0
    backoff_on_ratelimits: true # default = false
    backoff_config:
      min_period: 100ms # default = 100ms
      max_period: 10s # default = 10s
      max_retries: 10  # default = 10
    tls_enabled: false # default = false
    connect_timeout: 0s # default = 5s
  compress_responses: true

query_range:
  align_queries_with_step: true # default = false
  results_cache:
    cache:
      embedded_cache:
        enabled: true # default = false
        max_size_mb: 300 # default = 100
        ttl: 1h # default = 1h
    compression: 'snappy'  # default = ""
  cache_results: true # default = false
  max_retries: 15  # default = 5
  parallelise_shardable_queries: true # default = true
  cache_index_stats_results: true # default = true
  index_stats_results_cache:
    cache:
      embedded_cache:
        enabled: true # default = false
        max_size_mb: 300 # default = 100
        ttl: 1h # default = 1h
    compression: 'snappy'  # default = ""

ruler:
  storage:
    type: local
    local:
      directory: /Users/sagar/data/loki/rules
  rule_path: /Users/sagar/data/loki/rules
  alertmanager_url: http://127.0.0.1:9093
  ring:
    kvstore:
      store: memberlist
  enable_api: true

ingester_client:
  pool_config:
    client_cleanup_period: 20s  # default = 15s
    health_check_ingesters: false # default = true
    remote_timeout: 5s  # default = 1s
  remote_timeout: 10s # default = 5s
  grpc_client_config:
    max_recv_msg_size: 209715200 # default = 104857600 (bytes)
    max_send_msg_size: 209715200 # default = 104857600 (bytes)
    grpc_compression: 'snappy'  # default = ""
    rate_limit: 0 # default = 0
    rate_limit_burst: 0 # default = 0
    backoff_on_ratelimits: true # default = false
    backoff_config:
      min_period: 100ms # default = 100ms
      max_period: 10s # default = 10s
      max_retries: 10  # default = 10
    tls_enabled: false # default = false
    connect_timeout: 0s # default = 5s

ingester:
  lifecycler:
    ring:
      kvstore:
        store: memberlist
        prefix: "collectors/" # default = "collectors/"
      heartbeat_timeout: 5m # default = 1m
      replication_factor: 1 # default = 3
    heartbeat_period: 5s  # default = 5s
    heartbeat_timeout: 5m # default = 1m
    min_ready_duration: 15s # default = 15s
    final_sleep: 0s # default = 0s
    address: 127.0.0.1  # default = ""
    port: 9095  # default = 0
  concurrent_flushes: 64  # default = 32
  flush_check_period: 30s # default = 30s
  flush_op_timeout: 10m # default = 10m
  chunk_retain_period: 5s  # To ease recovery, default = 0s
  chunk_idle_period: 5m  # Close chunks after no more writes, default = 30m
  chunk_block_size: 262144  # 256KB, default = 262144
  chunk_target_size: 1000000  # ~1.5MB target chunk size, default = 1572864
  chunk_encoding: "snappy"  # default = "gzip"
  max_chunk_age: 1h # default = 2h
  autoforget_unhealthy: false # default = false
  query_store_max_look_back_period: 0s  # default = 0s
  wal:
    enabled: true # default = true
    dir: /Users/sagar/data/loki/wal

index_gateway:
  mode: "ring"  # default = "simple"
  ring:
    kvstore:
      store: memberlist  # default = "consul"
      prefix: "collectors/" # default = "collectors/"
    heartbeat_period: 15s # default = 15s
    heartbeat_timeout: 5m # default = 1m

storage_config:
  tsdb_shipper:
    active_index_directory: /Users/sagar/data/loki/index
    shared_store: s3
    shared_store_key_prefix: "index/" # default = "index/"
    cache_location: /Users/sagar/data/loki/index_cache
    cache_ttl: 24h  # Can be increased for faster performance over longer query periods, uses more disk space
    resync_interval: 10m  # default = 5m
    query_ready_num_days: 1 # default = 0
    index_gateway_client:
      grpc_client_config:
        max_recv_msg_size: 209715200 # default = 104857600 (bytes)
        max_send_msg_size: 209715200 # default = 104857600 (bytes)
        grpc_compression: 'snappy'  # default = ""
        rate_limit: 0 # default = 0
        rate_limit_burst: 0 # default = 0
        backoff_on_ratelimits: true # default = false
        backoff_config:
          min_period: 100ms # default = 100ms
          max_period: 10s # default = 10s
          max_retries: 10  # default = 10
        tls_enabled: false # default = false
        connect_timeout: 0s # default = 5s
      server_address: 127.0.0.1 # default = ""
  filesystem:
    directory: /Users/sagar/data/loki/chunks
  aws:
    s3: http://127.0.0.1:9000
    bucketnames: loki-data
    access_key_id: minioadmin
    secret_access_key: minioadmin
    s3forcepathstyle: true
    insecure: true
  index_queries_cache_config:
  max_parallel_get_chunk: 150 # default = 150
  max_chunk_batch_size: 100 # default = 50

chunk_store_config:
  chunk_cache_config:
    embedded_cache:
      enabled: true # default = false
      max_size_mb: 300 # default = 100
      ttl: 1h # default = 1h

schema_config:
  configs:
  - from: 2022-01-01
    store: tsdb
    object_store: s3
    schema: v12
    index:
      prefix: index_
      period: 24h
    chunks:
      prefix: chunks_
      period: 24h

compactor:
  working_directory: /Users/sagar/data/loki/compactor
  compaction_interval: 5m # default = 10m
  retention_enabled: true # default = false
  retention_delete_delay: 1h  # default = 2h
  retention_delete_worker_count: 150  # default = 150
  delete_request_store: s3  # default = ""
  delete_batch_size: 100  # default = 70
  max_compaction_parallelism: 2 # default = 1
  compactor_ring:
    kvstore:
      store: memberlist
      prefix: "collectors/" # default = "collectors/"
    heartbeat_period: 15s # default = 15s
    heartbeat_timeout: 5m # default = 1m
  tables_to_compact: 2  # default = 0

limits_config:
  ingestion_rate_mb: 500  # 500MB/s, default = 4
  ingestion_burst_size_mb: 1000  # Burst capability for spikes, default = 6
  max_label_name_length: 1024 # default = 1024
  max_label_value_length: 5120  # default = 2048
  reject_old_samples: true
  reject_old_samples_max_age: 2w  # default = 1w (window) = max_chunk_age/2
  max_line_size: 16777212  # 10MB to handle long log lines, default = 256KB
  max_global_streams_per_user: 100000 # default = 5000
  per_stream_rate_limit: 20MB # default = 3MB
  per_stream_rate_limit_burst: 40MB # default = 15MB
  max_query_parallelism: 64 # default = 32
  tsdb_max_query_parallelism: 32  # default = 128
  max_entries_limit_per_query: 10000  # default = 5000
  split_queries_by_interval: 6h # default = 1h
  volume_enabled: true
  retention_period: 168h  # 7 days retention

frontend_worker:
  frontend_address: 127.0.0.1:9095 # default = ""
  grpc_client_config:
    max_recv_msg_size: 209715200 # default = 104857600 (bytes)
    max_send_msg_size: 209715200 # default = 104857600 (bytes)
    grpc_compression: 'snappy'  # default = ""
    rate_limit: 0 # default = 0
    rate_limit_burst: 0 # default = 0
    backoff_on_ratelimits: true # default = false
    backoff_config:
      min_period: 100ms # default = 100ms
      max_period: 10s # default = 10s
      max_retries: 10  # default = 10
    tls_enabled: false # default = false
    connect_timeout: 0s # default = 5s

table_manager:
  retention_deletes_enabled: true # default = false
  retention_period: 168h  # 7 days retention

memberlist:
 join_members:
   - 127.0.0.1:7946
 bind_addr: ['127.0.0.1']
 bind_port: 7946
 gossip_interval: 1s
 gossip_to_dead_nodes_time: 15s
 left_ingesters_timeout: 30s

# runtime_config:

# tracing:

analytics:
  reporting_enabled: false

common:
  path_prefix: /loki
  storage:
    s3:
      endpoint: http://127.0.0.1:9000
      insecure: true
      bucketnames: loki-data
      access_key_id: loki
      secret_access_key: supersecret
      s3forcepathstyle: true
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory
    heartbeat_period: 15s # default = 15s
    heartbeat_timeout: 5m  # default = 1m
    instance_addr: 127.0.0.1
  instance_addr: 127.0.0.1
  compactor_address: 127.0.0.1:3100  # default = ""
  compactor_grpc_address: 127.0.0.1:9095  # default = ""

shutdown_delay: 3s  # # default = 0s

If you are running multiple instances then your listen address needs to not be localhost or 127.0.0.1, because each Loki instance needs to be uniquely identifiable from each other for ring membership to work (/ring should show the actual IP for all your Loki instances). You also need to change things like your compactor_address to a DNS record that can resolve to all your Loki instances.

Also I am not sure prefix should be set to the same value for components, but I don’t set prefix so I could be wrong.