Armada KVArmada KV
/vmain

Tables

Armada organises all key-value data into tables. Each table is an independent keyspace with its own Raft consensus group, its own storage, and its own replication stream. All API consistency guarantees (e.g. compare-and-swap, linearisable reads) are scoped to a single table — there is no cross-table atomicity.

Managing Tables

Tables are managed through the regatta.v1.Tables gRPC API. The easiest way to manage them is with the arctl control-plane CLI, which talks to that API for you. You can also call the API directly with grpcurl or the official client libraries.

Creating and deleting tables is only possible on a leader cluster; followers replicate table changes automatically. Listing tables works on both leader and follower clusters.

Using arctl

The Tables API (and the Maintenance API) is served by the API server on the API address (--api.address, default port 8443). Point arctl at that address; the scheme selects the transport (http/unix for plaintext, https/unixs for TLS):

# Create a table
arctl --address=http://127.0.0.1:8443 tables create my-table

# List all tables
arctl --address=http://127.0.0.1:8443 tables list

# Delete a table
arctl --address=http://127.0.0.1:8443 tables delete my-table

arctl also honours the global --ca, --cert, --key, and --token flags (see the CLI reference). Use an https/unixs address when the Tables API is protected by a token — tokens are only sent over secure connections — or when the API port requires mutual TLS (pass --cert/--key). Pass --format=json to arctl tables list for machine-readable output.

Using grpcurl

Create a Table

grpcurl -plaintext \
  -d '{"name": "my-table"}' \
  127.0.0.1:8443 regatta.v1.Tables/Create

List Tables

grpcurl -plaintext 127.0.0.1:8443 regatta.v1.Tables/List

Delete a Table

grpcurl -plaintext \
  -d '{"name": "my-table"}' \
  127.0.0.1:8443 regatta.v1.Tables/Delete

Warning: Deleting a table is permanent. All data stored in the table will be lost. In a leader–follower deployment, deleting a table on the leader will also cause followers to gracefully delete their local copy.

Securing the Tables API

The Tables API can be protected with a static token. Set --tables.token when starting Armada:

armada leader --tables.token=my-secret-token ...

Clients must then include the token as a gRPC metadata header:

grpcurl -plaintext \
  -H 'authorization: Bearer my-secret-token' \
  -d '{"name": "my-table"}' \
  127.0.0.1:8443 regatta.v1.Tables/Create

With arctl, pass the token via the --token flag over a TLS (https) address:

arctl --address=https://127.0.0.1:8443 --token=my-secret-token tables create my-table

If --tables.token is not set, no authentication is required for the Tables API.

The Tables API can be disabled entirely with --tables.enabled=false.

How Tables Map to Raft Groups

Each table is backed by its own Raft consensus group. This means:

  • Writes to one table do not block writes to another table.
  • A Raft leader election in one table does not affect other tables.
  • Snapshots and log compaction happen independently per table.
  • In a multi-node cluster, different tables may have different Raft leaders.

The metadata table (cluster ID 1000) is a special internal Raft group that tracks the set of known tables and is not directly accessible through the KV API.

Consistency Guarantees

  • Within a single table: reads and writes are linearisable. Compare-and-swap (Txn) and multi-key atomic operations are supported within a single table.
  • Across tables: there are no cross-table consistency guarantees. Two writes to different tables may be observed in any order.

Read-Only Tables on Followers

In a follower cluster, tables are read-only. Write requests (Put, DeleteRange, Txn) received by a follower are forwarded to the leader and the follower waits until its local replica has applied the returned revision before replying to the client. This provides a read-after-write guarantee even when the client sends requests to a follower.

Static Cluster Membership

Armada currently requires a static set of cluster members. The number of nodes in a cluster must be specified at cluster creation time and cannot be changed while the cluster is running. See the Helm Chart for how to set the replica count before deploying.