Persistence and Production Topology
Everything in Lessons 3–6 ran against one Polaris process on one machine. That's the right way to learn the API; it's the wrong way to run it. This lesson is the "next capability" that turns this course into an actual deployment decision instead of a demo.
metaStoreManager.type and other persistence-backend settings.
Two separate failure domains
- Polaris's own state — every catalog, namespace pointer, principal, role, and grant from Lessons 2–6 — lives in a metastore/persistence backend that is itself pluggable (
metaStoreManager.typein the server config), separate from wherever the actual Iceberg table data (Parquet files, manifests) lives. - A default or in-memory/embedded persistence backend, useful for a quickstart, does not survive a container restart or scale past one process — every entity created in this course would be gone. Production deployments swap this for a real relational store (e.g. the EclipseLink-backed JDBC option) instead.
- Because catalog metadata and table data are separate concerns, scaling Polaris horizontally (multiple Polaris instances behind a load balancer, all sharing one persistence backend) is a realistic topology — any instance can serve any request, because none of them hold state locally.
- Multi-realm support (Lesson 3) is what lets one production Polaris deployment serve multiple isolated tenants (e.g., separate business units or environments) without standing up a separate fleet per tenant.
Exercise: inspect what your quickstart is actually persisting to
docker inspect polaris --format '{{json .Mounts}}' | python3 -m json.tool
docker exec polaris grep -A2 -i "metaStoreManager" polaris-server.yml
[{"Type":"bind","Source":".../icebergdata","Destination":"/data","Mode":"rw","RW":true,...}]
metaStoreManager:
type: in-memory
# type: eclipse-link # uncomment to use eclipse-link as metastore
/data (table data) is a mounted, durable volume here. There is no volume backing catalog metadata at all — it's in-memory, with eclipse-link (a real JDBC-backed option) sitting right there, commented out.
Then answer: if you ran docker compose down -v right now (removing volumes) or just restarted this container, which of Lessons 2–6's objects would survive, and which would you have to recreate?
Evidence of competence
Paste your own inspection output and your answer. A correct answer recognizes that with metaStoreManager.type: in-memory, every catalog/principal/role/grant from Lessons 2–6 lives only in the running process's heap — a plain container restart loses all of it and forces a fresh bootstrap (Lesson 3), even though the actual table files under /data would survive because that's a separate, mounted volume.
Retrieval check
Your quickstart's metaStoreManager.type is in-memory and you restart the container. What happens to the course_engineer principal from Lesson 6?
Correct. Catalog metadata (principals, roles, grants) and table data are separate failure domains — an in-memory metastore loses everything on restart regardless of whether the table-data volume is mounted.
Not quite. With metaStoreManager.type: in-memory, nothing about principals or grants is written to disk — a restart forces a fresh bootstrap.
Why can multiple Polaris instances safely sit behind one load balancer, each serving any request?
Correct. Horizontal scaling works specifically because catalog state lives in a shared external persistence backend, not because instances talk to each other or diverge independently.
No. Independent per-instance state (or direct instance-to-instance sync) is not how this works — a shared persistence backend is what makes any instance interchangeable.
Practice
- Run the inspection commands against your own quickstart and note whether table data, catalog metadata, both, or neither are on durable storage.
- Restart your container and confirm which Lesson 2–6 objects actually survived.
- Read the EclipseLink JDBC option in the configuration reference and note what you'd need (a running database) to switch to it.
New terms — persistence backend, metaStoreManager, realm — are in the glossary.