Databases

Databases on OpenStack: DBaaS architecture, Trove and the alternatives

OpenStack hands you instances, volumes and networks. A database service is everything between those primitives and a developer typing "give me a PostgreSQL 16 with failover". This is what sits in that gap, why Trove rarely fills it, and the three routes teams actually take. There is a fourth: edgeContinuum delivers managed PostgreSQL on the infrastructure you already operate, with none of this to build.

1. What OpenStack gives you, and what it does not

Every ingredient for a database is already in an OpenStack deployment. Nova gives instances with predictable flavors, Cinder gives block volumes with volume types you can map to real storage tiers, Neutron gives isolated networks and security groups, Keystone gives per-project identity, and object storage gives somewhere to put write-ahead logs.

What is missing is everything that makes those ingredients a service: a catalog entry a developer can order, a topology decision made once and applied identically every time, replication configured and verified, failover that promotes a standby without a human, backups that run and get restored as a test, minor patches applied on a schedule, major upgrades planned, and per-tenant limits so one team cannot fill the array.

The distance between "PostgreSQL is easy to install" and "PostgreSQL is a product our teams order" is that list. It is also why the request "we need a database" is answered in weeks on most private clouds and in seconds on a public one.

The short answer, if you want one now:

edgeContinuum closes that gap as a product. A team requests PostgreSQL with a version and a size from a catalog, inside the quota its project carries, and provisioning, high-availability clustering, failover, backups and version lifecycle are handled by the platform on your own hardware. See managed PostgreSQL on-premises, or start a free trial and create one in minutes.

2. Trove: what it is and why teams hesitate

Trove is OpenStack's own database-as-a-service project, and it is still developed: it ships in current OpenStack releases and PostgreSQL is one of its supported datastores. The architecture is distinctive. A Trove instance is a Nova instance booted from a Trove guest image with a guest agent inside it, and since the Victoria release a single guest image serves every datastore, with the database itself running as a container inside that instance.

Three things make teams hesitate, and none of them is a criticism of the code:

  • You own the guest images. The project's own production guidance is to build and maintain your own images so they meet your security standards, which means an image pipeline per datastore version, rebuilt for every CVE, forever.
  • The guest agent is a second control path. Every database instance runs an agent that takes instructions over the message bus. That is one more component to secure, upgrade and debug inside every instance you run, and it does not exist in the other routes.
  • Vendor support thinned out. Trove was dropped from Red Hat's OpenStack distribution years ago, so on many enterprise deployments it is not a supported service at all, and the operator community around it is small compared with Nova or Neutron.

The result is that Trove is technically available and organizationally rare. edgeContinuum does not use Trove: managed PostgreSQL is delivered without a guest agent inside the database instance and without a datastore image pipeline for you to own.

The honest summary:

Trove asks you to operate a database platform in order to get databases. That trade is reasonable if you have a team that wants to own it. It is a poor trade if what you wanted was a catalog entry your developers can click.

3. The three routes to PostgreSQL as a service

Trove

Databases become first-class OpenStack resources with their own API, quotas and CLI, which is genuinely coherent when your operators want everything inside one cloud API. The cost is the guest image pipeline, the guest agent and a thin support ecosystem.

Virtual machines plus your own automation

Instances from Nova, volumes from Cinder, and Patroni with etcd or Consul for leader election, pgBackRest or WAL-G for backups, and Ansible to tie it together. This is the most common answer and it works well, because Patroni is excellent. What stays yours is the whole surface: templates, failover testing, backup verification, monitoring, minor patching, major upgrades, and the fact that every instance is slightly different from the last one somebody built.

An operator on Kubernetes, on top of OpenStack

If you already run Kubernetes on OpenStack, a PostgreSQL operator turns databases into custom resources reconciled by a controller, which is the cleanest declarative model of the three. It also stacks two platforms: the database's availability now depends on the cluster's, storage arrives through Cinder CSI rather than directly, and someone has to own both layers. For a team that already operates Kubernetes seriously, this is the strongest self-built route.

Route What you own Where it fits
Trove Guest images, the guest agent, a small support ecosystem Operators who want databases inside the OpenStack API surface
VMs plus Patroni Templates, failover tests, backups, patching, upgrades One or two important databases with a DBA behind them
Operator on Kubernetes Two platforms: the operator and the clusters under it Teams already operating Kubernetes as a product
Managed service on your OpenStack The infrastructure only; the service layer is delivered Databases requested from a catalog, inside a quota

4. Cinder, availability zones and the storage decisions

Database performance on OpenStack is mostly a storage question, and the defaults are rarely the right answer.

  • Volume type per tier, not one default. Map Cinder volume types to real backends and pick deliberately per database. A default class quietly sends a transactional workload onto the cheapest pool.
  • Size for IOPS, not only capacity. PostgreSQL under load is latency-sensitive, and write-ahead logging punishes high-latency storage far more than a capacity graph suggests.
  • One volume per instance, never shared. Each member of a cluster gets its own volume, so a storage failure cannot take the primary and its standby together.
  • Spread across availability zones, or at least across hosts with anti-affinity, so a single hypervisor failure cannot take a quorum with it.
  • Keep backup targets off the data path. Archive write-ahead logs to object storage rather than to the same volume, so a restore never competes with production I/O.

The high-availability topology itself, quorum, synchronous versus asynchronous standbys and split-brain avoidance, is worked through in the private cloud PostgreSQL DBaaS architecture guide.

5. Backups are not snapshots

A Cinder snapshot of a running database volume is a crash-consistent image, and PostgreSQL will usually recover from it. Usually is not a backup strategy. A database backup regime has three properties a snapshot does not: continuous write-ahead log archiving so you can recover to a point in time rather than to whenever the snapshot ran, retention that is independent of the volume's lifecycle so deleting an instance does not delete its history, and a restore that has actually been performed.

The last one is the one that fails in production. An untested restore path is an assumption, and the day it matters is a bad day to test it. Whichever route you take, schedule restores into a scratch project as a routine job, not as an incident.

6. Tenancy: whose database is it

On a single-team OpenStack, none of this matters. With several teams, or clients you serve, four questions arrive at once: which project owns the instance and its volumes, who can see the credentials, what limits stop one team from consuming the array, and how consumption gets reported per tenant.

OpenStack projects answer the first two adequately and the second two only partly. Project quotas bound instances, volumes and gigabytes, which is a proxy for database consumption rather than a measure of it, and nothing at that layer knows that six instances and their volumes together are "three PostgreSQL clusters belonging to the data team". That gap, and the organizations and roles that close it, is the subject of the users, projects and quotas guide.

7. Version lifecycle, the job nobody schedules

PostgreSQL ships a new major version every year and supports each one for five, with minor releases roughly quarterly. That produces two very different jobs. Minor patching is mechanical, restart-only, and easy to postpone until a CVE forces a rushed window across every instance at once. Major upgrades are a project each time: a choice between dump and restore, an in-place upgrade, or logical replication into a new cluster with a controlled cutover, plus extension compatibility and application testing.

On a self-built estate, both jobs scale with instance count and land on whoever built the templates. This is the work that quietly consumes a DBA's year, and it is the clearest argument for making the database a product rather than a build.

8. Skip the build: PostgreSQL as a catalog product

edgeContinuum delivers PostgreSQL as a catalog product on the OpenStack you already operate. A team asks for a database with a version and a size, inside the quota its project carries, and the platform provisions it, configures high-availability clustering, handles failover, runs backups and drives version lifecycle from declarative desired state. Instances are scoped to projects and organizations, so consumption is attributable per tenant, and the same platform behaves identically from SaaS control plane to a fully air-gapped deployment.

No guest agent inside your database instances, no datastore image pipeline, no Trove, and nothing forked in the OpenStack underneath: it keeps using standard Nova, Cinder and Neutron APIs, and your operators keep their existing tooling. See managed PostgreSQL on your own infrastructure for what the service does, or the OpenStack management platform page for the layer it belongs to.

Where to start: request a free trial and create a highly available PostgreSQL instance against a lab OpenStack in minutes. If you have databases running today, bring them to the call below and our engineers will work the migration path with you.

Stop babysitting the database

Start a free trial and put highly available PostgreSQL in your own catalog, provisioned on request with failover, backups and lifecycle handled. Or bring your storage backends and the databases you run today to a call, and we will work the topology and the migration path with you.

Frequently asked questions

How do you run databases on OpenStack?
There are three practical routes. Trove, OpenStack's own database service, makes databases first-class cloud resources but expects you to build and maintain guest images and to run a guest agent inside every database instance. Virtual machines plus your own automation, typically Patroni for leader election with pgBackRest or WAL-G for backups, is the most common answer and leaves you owning templates, failover testing, patching and upgrades. A PostgreSQL operator on Kubernetes running on OpenStack gives the cleanest declarative model but stacks two platforms. The fourth option is a managed platform on top of your OpenStack, where the database is a catalog product and the service layer is delivered rather than built.
Is OpenStack Trove still maintained, and should we use it?
Trove is still an active OpenStack project and ships in current releases, with PostgreSQL among its supported datastores, so "abandoned" is the wrong word. The reasons teams hesitate are operational rather than technical. Its own production guidance is that you build and maintain the guest images yourself, which is an image pipeline you own indefinitely. Every instance runs a guest agent that takes instructions over the message bus, which is an extra control path to secure and upgrade. And it was dropped from Red Hat's OpenStack distribution years ago, so on many enterprise deployments it is not a supported service. It suits operators who want databases inside the OpenStack API and have a team to run that platform. edgeContinuum does not use Trove.
What is the difference between a Cinder snapshot and a database backup?
A snapshot of a running database volume is crash-consistent: PostgreSQL will normally replay its write-ahead log and come up, but you can only return to the moment the snapshot was taken, the history usually dies with the volume, and correctness depends on recovery working. A backup regime adds continuous write-ahead log archiving to separate storage, so you can recover to any point in time, retention independent of the instance's lifecycle, and restores that have actually been run. Use snapshots for fast rollback of a known change, and a real backup path for everything you would be asked about after an incident.
Can we get a managed PostgreSQL service inside our own perimeter?
Yes, and it is the usual reason teams look for one. In the on-premises model the whole platform, control plane included, runs inside your perimeter on infrastructure you connected to it, down to fully air-gapped sites with no uplink. Managed PostgreSQL then behaves as it does anywhere else: a team requests a version and a size from the catalog inside its quota, and provisioning, high-availability clustering, failover, backups and version lifecycle run locally, against your OpenStack, your storage and your network.
How should database storage be laid out on OpenStack?
Map Cinder volume types to your real storage tiers and choose one deliberately per database rather than accepting a default class. Size for IOPS and latency rather than only capacity, because write-ahead logging is far more sensitive to latency than a capacity graph suggests. Give every cluster member its own volume so one storage failure cannot take a primary and its standby together, spread members across availability zones or at least across hosts with anti-affinity, and archive write-ahead logs to object storage so a restore never competes with production I/O.
How do you stop one team consuming the whole storage array?
OpenStack project quotas are the first line: they bound instances, volumes and gigabytes per project, which limits the blast radius. What they do not do is describe consumption in the terms people actually use, since a quota knows about volumes and instances rather than about clusters and databases belonging to a given team or client. Holding limits at the layer where databases are requested, and reporting usage per tenant per resource, needs an organization and quota model above OpenStack projects.
What does a PostgreSQL major upgrade involve on a private cloud?
PostgreSQL ships a major version every year and supports each for five, so an estate is always somewhere in that cycle. A major upgrade is a choice between dump and restore, which is simple but takes an outage proportional to data size, an in-place upgrade, which is fast but harder to roll back, and logical replication into a new cluster with a controlled cutover, which minimises downtime and takes the most preparation. Around whichever you pick sit extension compatibility, application testing and a rehearsed rollback. Minor releases are separate and mechanical: apply and restart, ideally on a schedule rather than when a CVE forces one.