This page documents every configuration option in danube_broker.yml. For a ready-to-use secure configuration, see config/danube_broker_secure.yml in the repository.
cluster_name : " MY_CLUSTER "
Field Type Default Description cluster_nameString (required) Identifies the cluster in metrics, logs, and multi-cluster setups. Use a descriptive name like production-us-east.
# broker_url: "broker-0.danube-broker-headless:6650"
# connect_url: "danube-proxy.example.com:6650"
Field Default Description broker.host0.0.0.0Network interface to bind to. Use 127.0.0.1 for local-only. broker.ports.client6650Producer and consumer gRPC connections broker.ports.admin50051Admin API (gRPC) for danube-admin broker.ports.raft7650Raft inter-node gRPC transport broker.ports.prometheus9040Prometheus metrics scrape endpoint. Set to null to disable.
Optional. Required when the broker’s bind address differs from the address clients or peers should connect to (Kubernetes, proxies, NAT).
Field Default Description broker.advertised_listeners.broker_urlhost:client_portAddress reachable inside the cluster (inter-broker, Raft identity) broker.advertised_listeners.connect_urlSame as broker_url Address reachable by external clients (via load balancer or ingress)
Danube embeds Raft consensus directly. No external dependency (no etcd, no ZooKeeper). The node_id is auto-generated on first boot and persisted in {data_dir}/node_id.
data_dir : " ./danube-data/raft "
Field Type Default Description meta_store.data_dirPath ./danube-data/raftDirectory for Raft log, snapshots, and node identity. Use durable storage. Each broker must have its own directory. meta_store.seed_nodesString[] (empty) Raft transport addresses for initial cluster formation.
Cluster formation rules:
Single-node : omit seed_nodes entirely. The broker auto-initializes a single-node Raft cluster.
Multi-node : list ALL initial peers, including this broker’s own host:raft_port.
Field Type Default Description bootstrap_namespacesString[] ["default"]Namespaces created automatically on broker startup auto_create_topicsBoolean trueAllow producers to create topics automatically. Set to false in production for controlled topic creation via admin API. admin_tlsBoolean falseEnable TLS on the admin gRPC API. When true, reuses auth.tls certificates.
Controls TLS encryption, JWT authentication, and RBAC authorization. For a complete walkthrough, see Securing a Cluster .
cert_file : " ./cert/server-cert.pem "
key_file : " ./cert/server-key.pem "
ca_file : " ./cert/ca-cert.pem "
secret_key : " your-secret-key "
Mode Encryption Authentication Authorization Use Case noneOff Off Off Local development and testing tlsTLS everywhere JWT tokens RBAC (default-deny) Production
When mode: tls is set:
Client connections use server TLS
Inter-broker replication uses mutual TLS (mTLS)
Raft consensus uses mutual TLS (mTLS)
All requests require a valid JWT token
Every operation is checked against RBAC policies
Required when auth.mode: tls. A single certificate set is shared across all broker services.
Field Type Description auth.tls.cert_filePath Server certificate presented to clients and peers auth.tls.key_filePath Server private key auth.tls.ca_filePath Certificate authority for verifying peers (mTLS) and client certificates
Tip
Danube ships with a convenience script for development certificates:
cd cert/ && bash gen_certs.sh
This creates CA, server, and client certificates with SANs for localhost / 127.0.0.1.
Required when auth.mode: tls. JWT tokens authenticate clients and administrators.
Field Type Default Description auth.jwt.secret_keyString (required) HMAC-SHA256 shared secret for signing and validating tokens. Must match the --secret-key used with danube-admin security tokens create. auth.jwt.issuerString danube-authExpected iss claim. Tokens with a different issuer are rejected. auth.jwt.expiration_timeInteger (seconds) 3600Default token validity duration
Field Type Default Description auth.super_adminsString[] []JWT subjects that bypass RBAC entirely. Use for initial bootstrap and break-glass access. Remove once RBAC policies are in place.
Controls topic assignment to brokers and automated rebalancing. For architecture details, see Load Manager Architecture .
assignment_strategy : " fair "
load_report_interval_seconds : 30
aggressiveness : " balanced "
check_interval_seconds : 300
min_brokers_for_rebalance : 2
min_topic_age_seconds : 300
Controls how new topics are placed on brokers.
Strategy Algorithm Best For fairTopic count only Development, testing balanced(topic_load × 0.3) + (CPU × 0.35) + (Memory × 0.35)Production (recommended) weighted_loadAdaptive bottleneck detection Highly variable workloads
Field Type Default Description assignment_strategyString fairTopic placement algorithm load_report_interval_secondsInteger 30How often brokers publish load metrics. Lower = faster response, higher metadata traffic.
Automatically moves topics between brokers to maintain cluster balance.
Field Type Default Description rebalancing.enabledBoolean falseEnable automated rebalancing. Start disabled, enable after cluster is stable. rebalancing.aggressivenessString balancedPreset: conservative, balanced, or aggressive rebalancing.check_interval_secondsInteger Varies How often to evaluate balance rebalancing.max_moves_per_hourInteger Varies Rate limit for topic moves rebalancing.cooldown_secondsInteger Varies Minimum wait between consecutive moves rebalancing.min_brokers_for_rebalanceInteger 2Rebalancing skipped with fewer brokers rebalancing.min_topic_age_secondsInteger 300Topics younger than this are never moved rebalancing.blacklist_topicsString[] []Glob patterns for topics to never rebalance
Aggressiveness presets:
Level CV Threshold Check Interval Max Moves/Hour Cooldown conservative> 40% 600s 5 120s balanced> 30% 300s 10 60s aggressive> 20% 180s 20 30s
Controls how reliable topics persist messages. Non-reliable topics bypass storage entirely.
local_wal_root : " ./danube-data/wal "
metadata_prefix : " /danube "
check_interval_minutes : 5
Mode Durable History Use Case localLocal filesystem Single-node, development shared_fsShared filesystem (NFS, EFS) On-prem multi-broker object_storeRemote via OpenDAL (S3, GCS, Azure Blob) Cloud-native multi-broker
Field Type Default Description storage.modeString (required) local, shared_fs, or object_storestorage.local_wal_rootPath ./danube-data/walRoot directory for per-topic WAL files. Use fast SSD/NVMe. In shared_fs/object_store modes, auto-derived from meta_store.data_dir if omitted. storage.metadata_prefixString /danubePrefix for storage metadata keys in Raft. Change only when multiple independent clusters share the same Raft group.
Prunes local WAL files after durable segments safely cover them. Most useful in shared_fs and object_store modes.
Field Type Default Description local_retention.time_minutesInteger 2880 (48h)Delete local WAL files older than this local_retention.size_mbInteger 20480 (20 GB)Delete oldest files when total exceeds this local_retention.check_interval_minutesInteger 5How often to run the retention check
Rotation creates new WAL files. Sealed files become eligible for durable export and retention.
Field Type Default Description wal.rotation.max_bytesInteger (bytes) 536870912 (512 MB)Rotate WAL file at this size wal.rotation.max_hoursInteger (disabled) Rotate after this many hours. Useful for low-traffic topics.
Rarely needed. Placed under wal.advanced.
Field Type Default Description wal.advanced.cache_capacityInteger 1024In-memory replay cache (number of messages). Higher = better cache hit rate, more memory. wal.advanced.file_sync.interval_msInteger (ms) 5000Background flush interval. Not per-message sync. wal.advanced.file_sync.max_batch_bytesInteger (bytes) 10485760 (10 MB)Force flush when write buffer exceeds this
Optional. Enables double-writing messages to Valkey for crash recovery and warm caching. See Durability & Storage for the architectural overview and Configuration Guide for deployment examples.
- " redis://127.0.0.1:6379 "
max_cached_closed_segments : 5
Field Type Default Description write_buffer.backendString (required) Must be valkey write_buffer.endpointsString[] (required) Valkey/Redis endpoint URLs. Single endpoint = standalone mode. Multiple = cluster mode. write_buffer.wait_replicasInteger 0Replicas that must confirm each write via WAIT. Set 0 for standalone, 1+ for replicated setups. write_buffer.wait_timeout_msInteger 100Maximum wait for replica confirmation (ms) write_buffer.on_wait_timeoutString failTimeout policy: fail (reject write) or ack (proceed with warning) write_buffer.max_cached_closed_segmentsInteger 5Number of closed WAL segments to retain in Valkey. Older segments are trimmed via XTRIM MINID.
Required when mode: shared_fs.
root : " /mnt/danube-shared-segments "
Field Type Description durable.rootPath Shared directory visible to all brokers (e.g., NFS mount)
Required when mode: object_store. Danube uses OpenDAL for cloud storage access.
root : " s3://my-bucket/danube "
root : " gcs://my-bucket/danube "
credentials_path : " /path/to/service-account.json "
root : " my-container/danube "
endpoint : " https://myaccount.blob.core.windows.net "
account_name : " myaccount "
S3 options:
Field Required Description backendYes s3rootYes s3://bucket/prefixregionNo AWS region endpointNo Custom endpoint (MinIO, etc.) access_key / secret_keyNo Static credentials. Prefer IAM roles in production. profileNo AWS credentials profile name role_arnNo IAM role to assume session_tokenNo Temporary session credentials anonymousNo Anonymous access for public buckets virtual_host_styleNo Virtual-hosted-style bucket addressing
GCS options:
Field Required Description backendYes gcsrootYes gcs://bucket/prefixprojectNo GCP project identifier credentials_pathNo Path to service account JSON credentials_jsonNo Inline service account JSON
Azure Blob options:
Field Required Description backendYes azblobrootYes container/prefixendpointNo Azure Blob service endpoint account_nameNo Storage account name account_keyNo Storage account key
Caution
Avoid hardcoding credentials in version-controlled YAML. Use environment variables, secret mounts, or provider-native identity mechanisms (IAM roles, workload identity).
Controls pipelining behavior for reliable subscriptions. Non-reliable topics ignore this section.
Field Type Default Range Description dispatch.max_unacked_messagesInteger 101–10,000 Maximum number of unacknowledged messages per subscription. Controls how many messages the broker pipelines to a consumer before pausing. Higher values increase throughput; lower values reduce redelivery scope on failure.
The broker validates this value at startup and rejects configurations outside the allowed range.
Per-subscription overrides are available via the admin API (set-dispatch-config / get-dispatch-config). See CLI: Resources for commands.
Default resource limits applied at the broker level. These can be overridden at the namespace or topic level.
max_producers_per_topic : 0
max_subscriptions_per_topic : 0
max_consumers_per_topic : 0
max_consumers_per_subscription : 0
max_subscription_dispatch_rate : 0
max_message_size : 10485760
Field Default Description max_producers_per_topic0 (unlimited)Maximum concurrent producers per topic max_subscriptions_per_topic0 (unlimited)Maximum subscriptions per topic max_consumers_per_topic0 (unlimited)Maximum concurrent consumers across all subscriptions max_consumers_per_subscription0 (unlimited)Maximum consumers sharing a single subscription
Field Default Description max_publish_rate0 (unlimited)Maximum publish rate (messages/second) max_subscription_dispatch_rate0 (unlimited)Maximum dispatch rate per subscription (messages/second)
Field Default Description max_message_size10485760 (10 MB)Maximum single message size in bytes. Very large messages impact performance.