For the latest stable version, please use Korvet 0.19!

Configuration Reference

Complete configuration reference for Korvet.

All korvet properties have sensible defaults. You can override them via application.yml, environment variables (e.g. KORVET_BROKER_PORT), or command-line arguments (e.g. --korvet.broker.port=9092). Unknown korvet properties fail startup (strict binding) — a typo is caught immediately rather than silently ignored.

General

Prefix: korvet. · Env prefix: KORVET_

Top-level Korvet runtime settings: namespace, runtime service selection, and the entry points into each sub-system.

namespace

Env var: KORVET_NAMESPACE · Type: string · Default: korvet

Logical namespace applied to all storage and registry state this Korvet instance owns. Must not contain whitespace or the : delimiter — colons are appended internally to compose sub-namespaces.

Broker

Prefix: korvet.broker. · Env prefix: KORVET_BROKER_

Kafka-wire broker listener and group coordinator: bind address, TLS, request limits, backpressure, and rebalance tuning.

advertised-host

Env var: KORVET_BROKER_ADVERTISED_HOST · Type: string

Hostname advertised to clients via the Kafka metadata response. Leave unset (null) to fall back to host; blank/whitespace values are rejected.

advertised-port

Env var: KORVET_BROKER_ADVERTISED_PORT · Type: integer

Port advertised to clients via the Kafka metadata response. Defaults to port when unset.

boss-threads

Env var: KORVET_BROKER_BOSS_THREADS · Type: integer · Default: 1

Netty boss (accept) thread count.

cert-file

Env var: KORVET_BROKER_CERT_FILE · Type: file path

PEM-encoded server certificate (or chain). Required when tls=true.

client-auth-required

Env var: KORVET_BROKER_CLIENT_AUTH_REQUIRED · Type: boolean · Default: false

Require clients to present a certificate (mTLS).

enabled

Env var: KORVET_BROKER_ENABLED · Type: boolean · Default: false

Enable the broker listener.

fetch-max-wait

Env var: KORVET_BROKER_FETCH_MAX_WAIT · Type: duration · Default: 500ms

Maximum time a fetch request will block waiting for fetch.min.bytes to be satisfied.

fetch-partition-max-bytes

Env var: KORVET_BROKER_FETCH_PARTITION_MAX_BYTES · Type: data size · Default: 1MB

Default upper bound on per-partition bytes returned by a fetch.

host

Env var: KORVET_BROKER_HOST · Type: string · Default: 0.0.0.0

Listener host (interface to bind to).

id

Env var: KORVET_BROKER_ID · Type: integer · Default: 0

Numeric broker id advertised to Kafka clients. Must be unique across a multi-node deployment.

key-file

Env var: KORVET_BROKER_KEY_FILE · Type: file path

PEM-encoded server private key. Required when tls=true.

key-password

Env var: KORVET_BROKER_KEY_PASSWORD · Type: secret

Passphrase protecting keyFile, if encrypted.

max-pending-bytes

Env var: KORVET_BROKER_MAX_PENDING_BYTES · Type: data size · Default: 100MB

Backpressure threshold: pause reads from the wire once this many bytes are pending outbound.

max-request-bytes

Env var: KORVET_BROKER_MAX_REQUEST_BYTES · Type: data size · Default: 100MB

Maximum size of a single inbound Kafka request. Requests larger than this are rejected.

port

Env var: KORVET_BROKER_PORT · Type: integer · Default: 9092

Listener TCP port.

rebalance-delay

Env var: KORVET_BROKER_REBALANCE_DELAY · Type: duration · Default: 3s

Grace period before triggering a consumer-group rebalance after a member joins or leaves.

rebalance-threads

Env var: KORVET_BROKER_REBALANCE_THREADS · Type: integer · Default: max(2, available CPU cores)

Scheduler thread-pool size for the group coordinator.

resume-pending-bytes

Env var: KORVET_BROKER_RESUME_PENDING_BYTES · Type: data size · Default: 50MB

Backpressure release threshold: resume reads once pending bytes drop below this. Must be < maxPendingBytes.

tls

Env var: KORVET_BROKER_TLS · Type: boolean · Default: false

Enable TLS on the listener. When true, certFile and keyFile are required.

trust-cert-file

Env var: KORVET_BROKER_TRUST_CERT_FILE · Type: file path

PEM-encoded CA trust store for verifying client certificates (mTLS). Required when clientAuthRequired=true.

worker-threads

Env var: KORVET_BROKER_WORKER_THREADS · Type: integer · Default: 0

Netty worker (IO) thread count. 0 lets Netty pick a default based on CPU count.

Metrics

Prefix: korvet.broker.metrics. · Env prefix: KORVET_BROKER_METRICS_

offset-cardinality-cap

Env var: KORVET_BROKER_METRICS_OFFSET_CARDINALITY_CAP · Type: integer · Default: 10000

Maximum number of (topic, partition) pairs published as offset gauges. When the live topic-partition count exceeds this cap, the publisher skips the refresh and logs a warning to prevent unbounded time-series cardinality.

offset-refresh-interval

Env var: KORVET_BROKER_METRICS_OFFSET_REFRESH_INTERVAL · Type: duration · Default: 15s

Interval between refreshes of per-topic-partition offset gauges (korvet.broker.max_offset, korvet.broker.log_start_offset).

Sasl

Prefix: korvet.broker.sasl. · Env prefix: KORVET_BROKER_SASL_

enabled

Env var: KORVET_BROKER_SASL_ENABLED · Type: boolean · Default: false

Enable SASL authentication on the listener.

mechanisms

Env var: KORVET_BROKER_SASL_MECHANISMS · Type: list of string · Default: SCRAM-SHA-256

SASL mechanisms advertised to clients. Must be a non-empty subset of SUPPORTED. Defaults to SCRAM-SHA-256 only — PLAIN must be opted in explicitly and requires TLS.

Maintenance

Prefix: korvet.maintenance. · Env prefix: KORVET_MAINTENANCE_

Consolidated background maintenance worker (replaces the archiver+trimmer pair) — leader-locked periodic task that catches up on missed archives, enforces retention, and runs cold-tier housekeeping (snapshot expiry, orphan-file sweep, manifest compaction).

catchup-archive-after

Env var: KORVET_MAINTENANCE_CATCHUP_ARCHIVE_AFTER · Type: duration · Default: 5m

Sealed-LOCAL segments older than this are picked up by the catch-up archive sweep. The inline-archive happy path handles writers' own rolls; this only mops up crashes.

enabled

Env var: KORVET_MAINTENANCE_ENABLED · Type: boolean · Default: false

Enable the maintenance worker. The Redis leader lock ensures at most one enabled instance runs at a time across the cluster.

expire-snapshots-interval

Env var: KORVET_MAINTENANCE_EXPIRE_SNAPSHOTS_INTERVAL · Type: duration · Default: 1d

Cadence for Iceberg ExpireSnapshots on the cold-tier table.

lease-duration

Env var: KORVET_MAINTENANCE_LEASE_DURATION · Type: duration · Default: 2m

Redis leader-lock lease duration. Must exceed tickInterval so a slow tick does not let the lease expire mid-flight.

remove-orphan-files-interval

Env var: KORVET_MAINTENANCE_REMOVE_ORPHAN_FILES_INTERVAL · Type: duration · Default: 1h

Cadence for Iceberg RemoveOrphanFiles on the cold-tier table.

rewrite-manifests-interval

Env var: KORVET_MAINTENANCE_REWRITE_MANIFESTS_INTERVAL · Type: duration · Default: 1d

Cadence for Iceberg RewriteManifests on the cold-tier table.

scan-page-size

Env var: KORVET_MAINTENANCE_SCAN_PAGE_SIZE · Type: integer · Default: 10000

Page size for XREAD when streaming a sealed segment into cold storage.

tick-interval

Env var: KORVET_MAINTENANCE_TICK_INTERVAL · Type: duration · Default: 1m

Tick cadence for the maintenance loop.

Redis

Prefix: korvet.redis. · Env prefix: KORVET_REDIS_

Primary Redis client used by the broker, registries, and (unless overridden) storage.

cluster

Env var: KORVET_REDIS_CLUSTER · Type: boolean · Default: false

host

Env var: KORVET_REDIS_HOST · Type: string · Default: localhost

io-threads

Env var: KORVET_REDIS_IO_THREADS · Type: integer · Default: available CPU cores

password

Env var: KORVET_REDIS_PASSWORD · Type: secret

port

Env var: KORVET_REDIS_PORT · Type: integer · Default: 6379

timeout

Env var: KORVET_REDIS_TIMEOUT · Type: duration · Default: 1m

uri

Env var: KORVET_REDIS_URI · Type: string

username

Env var: KORVET_REDIS_USERNAME · Type: string

Circuit Breaker

Prefix: korvet.redis.circuit-breaker. · Env prefix: KORVET_REDIS_CIRCUIT_BREAKER_

Fail-fast circuit breaker around Redis stream operations on the primary client.

enabled

Env var: KORVET_REDIS_CIRCUIT_BREAKER_ENABLED · Type: boolean · Default: true

log-interval

Env var: KORVET_REDIS_CIRCUIT_BREAKER_LOG_INTERVAL · Type: duration · Default: 30s

open-duration

Env var: KORVET_REDIS_CIRCUIT_BREAKER_OPEN_DURATION · Type: duration · Default: 30s

Metrics

Prefix: korvet.redis.metrics. · Env prefix: KORVET_REDIS_METRICS_

Client-side latency metrics published by Lettuce for the primary Redis client.

enabled

Env var: KORVET_REDIS_METRICS_ENABLED · Type: boolean · Default: false

histogram

Env var: KORVET_REDIS_METRICS_HISTOGRAM · Type: boolean · Default: false

local-distinction

Env var: KORVET_REDIS_METRICS_LOCAL_DISTINCTION · Type: boolean · Default: false

max-latency

Env var: KORVET_REDIS_METRICS_MAX_LATENCY · Type: duration · Default: 5m

min-latency

Env var: KORVET_REDIS_METRICS_MIN_LATENCY · Type: duration · Default: 1ms

Pool

Prefix: korvet.redis.pool. · Env prefix: KORVET_REDIS_POOL_

Connection-pool sizing for the primary Redis client.

max-wait

Env var: KORVET_REDIS_POOL_MAX_WAIT · Type: duration · Default: 10s

size

Env var: KORVET_REDIS_POOL_SIZE · Type: integer · Default: 8

Schema Registry

Prefix: korvet.schema-registry. · Env prefix: KORVET_SCHEMA_REGISTRY_

Embedded Confluent-compatible schema-registry HTTP endpoint.

default-compatibility

Env var: KORVET_SCHEMA_REGISTRY_DEFAULT_COMPATIBILITY · Type: none, backward, backward_transitive, forward, forward_transitive, full, full_transitive · Default: backward

Default compatibility level applied to newly-created subjects.

enabled

Env var: KORVET_SCHEMA_REGISTRY_ENABLED · Type: boolean · Default: true

Enable the embedded schema-registry HTTP endpoint.

validate-produce

Env var: KORVET_SCHEMA_REGISTRY_VALIDATE_PRODUCE · Type: boolean · Default: true

Reject produce requests whose payload doesn’t validate against the subject’s latest schema.

Storage

Prefix: korvet.storage. · Env prefix: KORVET_STORAGE_

Storage settings: Redis-backed local tier and optional object-store cold tier (opt-in via remote-path).

remote-path

Env var: KORVET_STORAGE_REMOTE_PATH · Type: string

Object-store path for the cold-tier Iceberg table (e.g. s3://bucket/korvet/cold). Absent/blank disables the cold tier — Korvet runs local-only on Redis Streams. The URI scheme picks the Iceberg FileIO: s3:// → S3FileIO. (Future: gs:// → GCSFileIO, abfs:///abfss:// → ADLSFileIO.)

Redis

Prefix: korvet.storage.redis. · Env prefix: KORVET_STORAGE_REDIS_

Sparse overrides for the storage-tier Redis client. Each unset field inherits the corresponding value from korvet.redis.

cluster

Env var: KORVET_STORAGE_REDIS_CLUSTER · Type: boolean

host

Env var: KORVET_STORAGE_REDIS_HOST · Type: string

io-threads

Env var: KORVET_STORAGE_REDIS_IO_THREADS · Type: integer

password

Env var: KORVET_STORAGE_REDIS_PASSWORD · Type: secret

port

Env var: KORVET_STORAGE_REDIS_PORT · Type: integer

timeout

Env var: KORVET_STORAGE_REDIS_TIMEOUT · Type: duration

uri

Env var: KORVET_STORAGE_REDIS_URI · Type: string

username

Env var: KORVET_STORAGE_REDIS_USERNAME · Type: string

Circuit Breaker

Prefix: korvet.storage.redis.circuit-breaker. · Env prefix: KORVET_STORAGE_REDIS_CIRCUIT_BREAKER_

Sparse circuit-breaker overrides for the storage-tier Redis client.

enabled

Env var: KORVET_STORAGE_REDIS_CIRCUIT_BREAKER_ENABLED · Type: boolean

log-interval

Env var: KORVET_STORAGE_REDIS_CIRCUIT_BREAKER_LOG_INTERVAL · Type: duration

open-duration

Env var: KORVET_STORAGE_REDIS_CIRCUIT_BREAKER_OPEN_DURATION · Type: duration

Metrics

Prefix: korvet.storage.redis.metrics. · Env prefix: KORVET_STORAGE_REDIS_METRICS_

Sparse metrics overrides for the storage-tier Redis client.

enabled

Env var: KORVET_STORAGE_REDIS_METRICS_ENABLED · Type: boolean

histogram

Env var: KORVET_STORAGE_REDIS_METRICS_HISTOGRAM · Type: boolean

local-distinction

Env var: KORVET_STORAGE_REDIS_METRICS_LOCAL_DISTINCTION · Type: boolean

max-latency

Env var: KORVET_STORAGE_REDIS_METRICS_MAX_LATENCY · Type: duration

min-latency

Env var: KORVET_STORAGE_REDIS_METRICS_MIN_LATENCY · Type: duration

Pool

Prefix: korvet.storage.redis.pool. · Env prefix: KORVET_STORAGE_REDIS_POOL_

Sparse pool overrides for the storage-tier Redis client.

max-wait

Env var: KORVET_STORAGE_REDIS_POOL_MAX_WAIT · Type: duration

size

Env var: KORVET_STORAGE_REDIS_POOL_SIZE · Type: integer

S3

Prefix: korvet.storage.s3. · Env prefix: KORVET_STORAGE_S3_

S3 connection settings for the cold-tier object store. Only consulted when korvet.storage.remote-path starts with s3://.

access-key-id

Env var: KORVET_STORAGE_S3_ACCESS_KEY_ID · Type: string

Access-key id. Maps to s3.access-key-id.

endpoint

Env var: KORVET_STORAGE_S3_ENDPOINT · Type: string

Optional endpoint URL for non-AWS S3-compatible stores (e.g. MinIO). Maps to s3.endpoint.

path-style-access

Env var: KORVET_STORAGE_S3_PATH_STYLE_ACCESS · Type: boolean

Use path-style addressing instead of the default virtual-hosted-style. Maps to s3.path-style-access. Required for most non-AWS S3 stores.

region

Env var: KORVET_STORAGE_S3_REGION · Type: string

AWS region (e.g. us-east-1). Maps to Iceberg s3.region.

secret-access-key

Env var: KORVET_STORAGE_S3_SECRET_ACCESS_KEY · Type: secret

Secret access key. Maps to s3.secret-access-key.

Topic configuration patterns

The korvet.topics list is order-sensitive: each entry is a glob pattern plus optional field overrides, evaluated top-to-bottom with first-non-null-wins semantics. Fields not set by any matching pattern fall back to the built-in defaults defined in TopicConfig. Per-topic admin-set overrides beat patterns.

The per-element fields (korvet.topics[n].partitions, retention-time, compression, etc.) live on TopicConfig in a separate module and are not enumerated in the tables above. The full list:

  • name (required) — glob pattern matched against topic names.

  • auto-create — whether unknown topics matching this pattern may be auto-created.

  • partitions, offset-sequence-bits, average-message-bytes

  • retention-time, retention-bytes

  • local-retention-time, local-retention-bytes

  • compression, storage-compression, value-type

  • remote-storage-enabled, bucket-duration

See the configuration guide for examples.

Environment variables

Every property can be set via an environment variable using Spring Boot’s relaxed binding: uppercase the property name, replace . and - with _. For example:

Property Environment variable

korvet.broker.max-request-bytes

KORVET_BROKER_MAX_REQUEST_BYTES

korvet.storage.remote.path

KORVET_STORAGE_REMOTE_PATH

korvet.archiver.enabled

KORVET_ARCHIVER_ENABLED

The exact env-var name for every property is listed in the tables above.

Migration

The property layout was reorganized in the KorvetProperties refactor. There are no compatibility aliases — old names are rejected by strict binding and must be updated at the same time as the upgrade.

Old property New property Notes

korvet.services

korvet.<component>.enabled (per component)
or SPRING_PROFILES_ACTIVE

The service-selection set is gone. Enable each component (broker, archiver, trimmer) explicitly, or activate one of the bundled Spring profiles. See Deployment shapes.

korvet.broker.sasl (boolean)

korvet.broker.sasl.enabled (nested type)

sasl is now a nested group; it also carries mechanisms.

korvet.broker.partition-max-bytes

korvet.broker.fetch-partition-max-bytes

Renamed to group with fetch-max-wait and match the Kafka mental model.

korvet.storage.remote.archiver.*

korvet.archiver.*

Archiver hoisted to top-level. All sub-properties moved verbatim.

korvet.storage.remote.trimmer.*

korvet.trimmer.*

Trimmer hoisted to top-level.

korvet.storage.remote.trimmer.op-timeout

korvet.trimmer.timeout

Renamed; bounds a single per-stream trim future, not a Redis command.

korvet.storage.remote.compactor.
korvet.storage.remote.messages-per-file
korvet.storage.remote.files-per-commit
korvet.storage.remote.target-file-size
korvet.storage.remote.writer-

removed

The compactor and the multi-file commit writer were removed when the cold tier moved to one Parquet file per sealed segment with the manifest as the commit point. Tune Parquet writes via korvet.storage.remote.row-group-size and page-size; tune segment size via korvet.storage.local.max-messages-per-segment and max-open-segment-age.

korvet.archiver.consumer-group
korvet.archiver.consumer-name-prefix

korvet.archiver.consumer.group
korvet.archiver.consumer.prefix

Consumer-group settings grouped under consumer.