multi_engine mode), the Engine does not host its own metadata.
Instead every node connects to a separate metadata service, the dedicated-pensieve process, which stores metadata in Postgres.
Because the metadata lives outside any single Engine, several Engines can point at the same metadata service and the same bucket, and each reads the latest snapshot written by the others.
This is the basis of workload isolation: two Engines operate on the same object-storage tablets without drawing compute from each other.
These instructions assume you have firebolt and dedicated-pensieve on your PATH, as described in Get the binaries.
Examples use Amazon S3; for other object stores, change the storage block as shown in engine configuration.
The start order is Postgres, then the metadata service, then the Engine nodes.
Teardown reverses it.
Set up Postgres and the metadata service
Install and run Postgres (for examplesudo apt-get install -y postgresql), then create a role and database for the metadata service.
The metadata service reaches Postgres over the network, so choose a strong, unique password for this role rather than a default; the commands read it from an environment variable so it never has to be written into the docs or the config file.
Run as a Postgres superuser:
One multi-node engine
A single Engine with two nodes, one node per machine, using the standalone metadata service. Setinstance.type to multi_engine and point metadata_endpoint at the metadata service.
Set each node’s host to the address its peer reaches it on and keep the default ports:
--detach: each node’s readiness check needs its peer, so starting them one at a time deadlocks.
aragog_port (5678), shufflepuff_port (16000), storage_agent_port (3434), and storage_manager_port (1717); the metadata port (7000) from both nodes to the metadata host; Postgres (5432) from the metadata host to its database; and --http-port (3473) from your clients.
Clean up:
Multiple engines
Two independent Engines, each with two nodes, sharing one metadata service and one bucket. Each Engine is configured exactly like one multi-node engine, with three values the same on both Engines so they share a catalog:- the same
metadata_endpoint, so both reach the same metadata service, - the same
bucket_name, so both read and write the same tablets, - the same account.
Both Engines get this by omitting
instance.id, which defaults to the same value. If you set it explicitly, use the identical ULID on every Engine and as the metadata service’sdefault_account_id: that value is the account key the service scopes all metadata by, so mismatched values hide each Engine’s tables from the others.
engine.id.
This identifier is informational only: metadata is scoped by account, not by Engine, so two Engines with the same account see each other’s tables regardless of engine.id.
Each Engine runs on its own machines, one node per machine:
id: engine-b and its two nodes[].host values (10.0.2.10 and 10.0.2.11); metadata_endpoint and bucket_name stay the same, which is what makes the two Engines share one catalog.
Bring up each Engine the same way as a single Engine: start its two nodes concurrently and wait for both to report ready.
Once both Engines are up, a table created on Engine A is immediately queryable on Engine B, and the reverse:
--http-port from your clients.
To run both Engines on one machine for local testing, see Colocate multiple nodes on one host.
That needs a distinct bind address per Engine and is not a production layout.