Switching Me Softly: Zero-downtime Major PostrgreSQL Upgrades at Fresha
Upgrading PostgreSQL in production is rarely about tools, it’s about timing, trust, and everything that can break in between. At Fresha we had quute a few of Postgres 12 databases, streaming changes through Debezium into Kafka, serving live traffic around the clock. With end-of-life approaching, “just run pg_upgrade” wasn’t an option.
We built a blue-green upgrade process based on logical replication, sequence offsets, connector handover, and PgBouncer choreography: a way to move clusters forward without downtime or broken streams. This talk shares how we made it repeatable: YAML configs, dry-run rehearsals, reversible scripts, and a few hard lessons learned along the way.
When the switch finally happened, no one noticed. That’s how you know it worked.
This talk expands on Fresha’s Switching Me Softly framework: a production-tested zero-downtime upgrade path from PostgreSQL 12 → 17.
It covers:
-
Logical replication with WAL origin alignment
-
Coordinating Debezium CDC and outbox connectors
-
PgBouncer two-phase switchover (read-only → write)
-
YAML-driven orchestration and dry-run safety modes
We upgraded dozens of databases, including multi-terabyte clusters, without a second of downtime. The session focuses on real engineering trade-offs what worked, what didn’t, and how to make major PostgreSQL upgrades safe, reversible, and boring.