Skip to content

Protocols

Two listeners front the same node service. Arrow Flight is the native protocol: typed Arrow batches, lookups and admin over gRPC. The Kafka listener maps the Kafka wire protocol onto log tables in one database. Flight SQL is served separately by mink-query.

Flight clientmink CLI, RustKafka clientanySQL clientFlight SQL, JDBCmink-queryFlight SQL :9130Arrow Flight :9123DoPut, DoGet, actionsKafka :9092produce, fetch, groups

Arrow Flight

Every message body is JSON in the Flight ticket, descriptor or action body. Every row payload is Arrow IPC. Bucket-addressed calls must land on the bucket's leader. The rest are served by any node.

Flight methodUsed for
DoPutWrites. Descriptor is Append, Put, AppendTable or PutTable. Each batch carries WriteBatch { batch_sequence, changes } and gets Written or Routed back
DoGetReads. Ticket is Scan, LimitScan, Snapshot, Union or Lake. Each batch carries ScanBatch or SnapshotBatch metadata
DoExchangeTail, the long poll
DoActionEverything else, listed below
ListFlights, GetFlightInfo, GetSchema, ListActionsDiscovery over the catalog
Handshake, PollFlightInfoNot served

Actions

GroupActions
Writers and offsetsinit_writer, list_offsets, register_producer_offsets, get_producer_offsets, delete_producer_offsets
Lookupslookup, prefix_lookup
Catalogcreate_database, drop_database, list_databases, database_exists, create_table, drop_table, list_tables, table_exists, get_table, alter_table, create_partition, drop_partition, list_partitions
Snapshotslatest_kv_snapshot, lake_snapshot
Clustermetadata, describe_cluster, get_config, node_stats, rebalance, health

Catalog and cluster actions are proposals to the metadata log and can be sent to any node. rebalance is forwarded to the lease holder. metadata returns the table, its buckets and their leaders, which is how a client builds its routing table.

Headers

HeaderDirectionMeaning
mink-applied-indexResponseThe metadata index the serving node had applied
mink-min-applied-indexRequestWait until this node has applied at least this index before serving. Read-your-writes across nodes

Errors

gRPC status codes carry the error. NotLeader adds a Redirect { bucket, to } body with the leader's advertised address. Unavailable means the bucket is being opened. Validation errors, unknown tables and schema mismatches are InvalidArgument or NotFound.

Kafka

Topics are log tables in the Kafka database (kafka by default). Partitions are buckets. Brokers are nodes with a Kafka listener. The group coordinator lives on the lease holder.

KafkaMink
Topic tTable kafka.t, columns key BYTES, value BYTES, headers BYTES, timestamp TIMESTAMP_LTZ(3) NOT NULL
Partition pBucket p
OffsetLog offset
Leader, replicas, ISRThe bucket leader, alone
retention.mslog_ttl
Producer idWriter id from the shared allocator
Group offsetsCommitGroupOffsets in the metadata log

Topics are created on first use when auto_create_topics is on, with default_partitions buckets, or through CreateTopics. Table names must be valid Mink names. A topic created through the Flight API with the fixed four-column schema is a topic too.

Requests

APIVersionsNotes
ApiVersions0-3
Metadata1-12Leaders from the metadata view
DescribeCluster0-1
Produce3-9One Append per topic partition. Every produce is durable on object storage before the response. acks=0 only suppresses the response
Fetch4-12Tail with max_wait_ms and min_bytes. Below log_start is OFFSET_OUT_OF_RANGE
ListOffsets1-7EARLIEST, LATEST, timestamp. MAX_TIMESTAMP and LATEST_TIERED rejected
InitProducerId0-4Idempotent producers. Transactional ids rejected
FindCoordinator0-4The lease holder
JoinGroup, SyncGroup, Heartbeat, LeaveGroupClassic consumer group protocol. States Empty, PreparingRebalance, CompletingRebalance, Stable
OffsetCommit2-8Group offsets with group_offsets_ttl or the requested retention
OffsetFetch1-8
DescribeGroups, ListGroups, DeleteGroups
CreateTopics2-7retention.ms becomes log_ttl
DeleteTopics1-6
DescribeConfigs0-4

Not implemented: transactions (AddPartitionsToTxn, EndTxn, transactional produce), the KIP-848 consumer protocol, SASL, ACLs, quotas, IncrementalAlterConfigs.

Limits

SettingDefault
max_request_bytes100 MiB
max_fetch_bytes50 MiB
max_in_flight per connection64
max_wait cap on fetch30 s
Session timeout range6 s to 30 min
group_offsets_ttl7 days

Group state is held in memory on the lease holder and rebuilt through rebalances when the lease moves. Committed offsets survive in the metadata log.

Flight SQL

Served by mink-query on :9130, not by the node. See SQL.

Authentication

Not implemented. Neither listener authenticates or authorizes clients. Both are expected on a private network. The Flight Handshake is not served.