- Industry: Post-acute care technology (home care)
- Organization: A leading U.S. post-acute-care technology company whose home-care platform coordinates daily care at national scale
- Environment: PostgreSQL 11 on GCP VMs migrating to AlloyDB (PostgreSQL 15 compatible); PgBouncer; native logical replication
- Engagement: Migration engineering and hands-on DBA support
- Services: Cloud database migration · Logical replication engineering · Incident response
| Metric | Before | After |
|---|---|---|
| Initial production data sync | 14+ days estimated on the stalled path | Nearly 6 TB in under 48 hours with native logical replication |
| First region initial sync | Expected around 12 hours | Under 7 hours using three parallel replication streams |
| Production cutover impact | Live platform, thousands of agencies | Monitoring showed no change in throughput or response time |
| Mid-migration slot backlog | 170 GB of WAL queued on one slot | Fixed and drained to kilobytes the same day |
The Client
The client's home-care coordination platform decides who knocks on whose door. Every morning, agencies across the country open it to schedule visits, match caregivers to clients, and bill for care delivered. All of that sat on PostgreSQL 11, self-managed on cloud VMs with an aging operating system. ]
The Challenge
The destination was clear: AlloyDB, Google's managed PostgreSQL-compatible service on a PostgreSQL 15 engine. The path was not. The vendor-recommended migration tooling had stalled. Replication slots grew during incremental sync without explanation, the procedure kept sprouting workarounds, and the estimate for the initial production sync stood at more than two weeks. Two weeks of retained WAL on a busy production primary is not a plan. It is a countdown.
And the platform could not stop. Agencies schedule real people into real homes every day. The migration had to happen underneath them, with a rollback path open at every step.
The Solution
- Proof of concept. We replicated the full application database from PostgreSQL 11 to AlloyDB, synchronized sequences, then flipped replication and streamed changes back. The client updated live records through the UI, routed through PgBouncer to AlloyDB, and watched the changes land. The rollback path was real before production was touched.
- Staged routing through PgBouncer. Application traffic already flowed through PgBouncer, so moving the platform meant changing where PgBouncer pointed, not redeploying the application. Each region cut over in three phases: establish replication, route reporting and worker reads to AlloyDB, then flip the primary.
- Rehearsal. We flipped replication back and forth in staging until the client's SRE could drive a flip solo from the runbook. We restored an AlloyDB backup to a fresh cluster and documented the disaster-recovery takeaways. A backup you have never restored is a hope, not a plan.
- Respect for production. The first sync attempt in the larger region delayed the streaming replicas, so we aborted, re-planned, ran a targeted vacuum freeze, and split the biggest tables into their own scheduled syncs. The second attempt moved nearly 6 TB in under 48 hours with replication delay held in milliseconds; a 3 TB table followed in 11 hours.
The Results
Both production regions cut over on schedule. The first region's final cutover went cleanly on a Friday night, and the client's monitoring showed no week-over-week change in throughput or response time.
The client kept more than a new database. They kept the runbooks, the replication scripts, the schema-check procedure that catches DDL drift before it breaks a slot, and an SRE team that had flipped replication themselves.
"This was a huge milestone. We could not have done this without you." (Client)
Why it Matters
Migration vendors sell certainty and ship complexity. PostgreSQL ships logical replication in the box. When the shiny tool stalls, the boring and reliable built-in is sitting right there, already documented, already understood by the engine on both ends. Ask what your database can do before you ask what you can buy.