Skip to content

Configuration Reference

Both binaries take a single --config-file <path> argument pointing at a YAML file. All fields are required — there are no defaults, with one exception: a core node derives advertised_address from its grpc_listen_addr when the field is absent.

A node that reads its file and finds a value it cannot work with refuses to start and names the field, rather than starting and misbehaving later. See Refused values.

Coordinator

config/coordinator/config.yml
log_level: info
metadata_dir: data/coordinator
grpc_listen_addr: "0.0.0.0:50040"
pg_listen_addr: "0.0.0.0:5432"
heartbeat_timeout_secs: 15
default_replication_factor: 3
allow_cross_shard_transactions: false
tail_retry_initial_ms: 100
tail_retry_max_ms: 5000
ballista_scheduler_listen_addr: "0.0.0.0:50050"
Field Description
log_level Logging verbosity (e.g. info, debug).
metadata_dir Directory where the coordinator persists its metadata catalog.
grpc_listen_addr Address for the coordinator gRPC server (core node registration, heartbeats).
pg_listen_addr Address for the PostgreSQL wire protocol listener — clients connect here.
heartbeat_timeout_secs How long a core node may miss heartbeats before being declared dead. A node silent for a third of this is first marked suspect and stops receiving new shards; the scan runs on that same third, at least once a second. Below three seconds the two thresholds coincide and a node goes straight from alive to dead.
default_replication_factor Cluster-wide replica count (N) for shards, overridable per table at creation.
allow_cross_shard_transactions Whether a BEGIN … COMMIT block whose writes span several shard groups may commit. false (recommended) refuses such a COMMIT and writes nothing; true applies the groups one at a time, so a failure part-way through leaves the earlier groups applied. See Transactions & Consistency.
tail_retry_initial_ms Initial backoff before retrying a write to a lagging replica (tail replication).
tail_retry_max_ms Maximum backoff for tail-replication retries.
ballista_scheduler_listen_addr Address of the embedded Ballista scheduler; core node executors connect here.

Core node

config/core/config.yml
log_level: info
node_id: "core-1"
data_dir: data/core
grpc_listen_addr: "0.0.0.0:50041"
advertised_address: "core-1:50041"
coordinator_addr: "http://coordinator:50040"
heartbeat_interval_secs: 2
write_queue_capacity: 1024
ballista_scheduler_addr: "http://coordinator:50050"
ballista_concurrent_tasks: 4
Field Description
log_level Logging verbosity.
node_id Unique identifier for this core node. Must be unique across the cluster.
data_dir Directory where this node stores its DuckDB shard files.
grpc_listen_addr Address for this node's gRPC write service (receives DML from the coordinator).
advertised_address Address other components use to reach this node. Must be reachable on the network and unique per node. Optional: defaults to grpc_listen_addr, which is only right when that address is itself reachable from the other nodes.
coordinator_addr URL of the coordinator's gRPC endpoint (for registration and heartbeats).
heartbeat_interval_secs How often this node sends heartbeats to the coordinator.
write_queue_capacity Capacity of the per-node write queue that serializes writes to DuckDB.
ballista_scheduler_addr URL of the coordinator's Ballista scheduler, which this node's executor connects to.
ballista_concurrent_tasks Maximum number of query stages this node's executor runs concurrently.

Refused values

Each of these values is accepted by YAML and leaves the node unable to do its job, in a way that is hard to recognise as a configuration problem once it happens — two of them are a panic in a background task, and the rest are silent. The node refuses the file at startup instead, naming the field.

Field Must be What the refused value would do
heartbeat_timeout_secs >= 1 0 marks every core node dead on the first scan. Only alive nodes can hold a shard, so CREATE TABLE then fails for want of nodes on a cluster where every node is heartbeating.
default_replication_factor >= 1 A shard with no copies cannot be stored; 0 quietly behaves as 1.
tail_retry_initial_ms >= 1, and <= tail_retry_max_ms 0 makes every retry wait no time at all, so an unreachable replica is retried in a tight loop. A value above the maximum is clamped to it, so the number written is never used.
heartbeat_interval_secs >= 1 A zero interval panics the node's heartbeat task. The node keeps running but goes silent, and the coordinator declares it dead.
write_queue_capacity >= 1 The write queue is a bounded channel, which cannot hold zero entries; the node fails to start.
ballista_concurrent_tasks >= 1 The executor registers advertising no task slots, so the scheduler never gives it a share of a read. Nothing reports an error.

Default ports

Port Service
5432 PostgreSQL wire protocol (client connections)
50040 Coordinator gRPC (node registration, heartbeats)
50041 Core node gRPC (write dispatch)
50050 Ballista scheduler (distributed query execution)