Building Multi-Region Disaster Recovery on OVHcloud: Architecture, RTO/RPO and Budget
Cloud

Building Multi-Region Disaster Recovery on OVHcloud: Architecture, RTO/RPO and Budget

October 23, 20268 min readOVHcloudPRATerraform

How to design, operate and budget a multi-region disaster recovery plan on OVHcloud: workload tiering, RTO/RPO targets, replication patterns and realistic cost drivers.

Disaster recovery is one of those projects that stays in the backlog until an auditor, a customer questionnaire or an actual outage forces the issue. For teams running on OVHcloud, the question is usually framed as "we need a second region" — but a second region is an outcome, not a design. What you actually need is a tiered recovery plan with explicit RTO/RPO targets per workload, an architecture that matches those targets, and a budget you can defend.

This article walks through how to design and cost a multi-region DR plan on OVHcloud Public Cloud and Hosted Private Cloud, with the trade-offs that matter in practice.

Start with tiers, not with regions

RTO (how long you can be down) and RPO (how much data you can lose) are business decisions, not engineering ones. The engineering job is to translate them into architecture and tell the business what each tier costs. Before touching Terraform, build an application inventory with four columns: criticality, RTO, RPO, and upstream/downstream dependencies.

A workable default classification looks like this:

TierExample workloadsTarget RTOTarget RPOPattern
0 — Critical revenue pathCheckout, payment API, authMinutesNear zeroActive/active or hot standby
1 — Core businessBack office, core APIs1–4 hoursMinutesWarm standby
2 — SupportingReporting, internal toolingWithin a dayHoursPilot light
3 — Non-criticalDev/test, sandboxesBest effortLast backupBackup & restore

The single most common mistake is declaring everything Tier 0. The second most common is forgetting that a Tier 0 application inheriting a Tier 2 dependency (an identity provider, a shared message broker, a licence server) is effectively Tier 2.

OVHcloud building blocks for a multi-region design

OVHcloud operates multiple independent regions in Europe and North America — Gravelines, Strasbourg, Roubaix, Frankfurt, London, Warsaw, Beauharnois and others — plus 3-AZ regions in some locations. Three properties shape DR architecture more than anything else:

  • vRack gives you a private L2 network that can span multiple datacentres and regions, so a standby site can talk to production without exposing replication traffic to the public internet.
  • Public Cloud outbound traffic is included in OVHcloud's model rather than metered per gigabyte. Continuous cross-region replication, which is often the budget killer on hyperscalers, becomes a predictable cost rather than a variable one. Verify the specifics for your services and regions, but the structural difference is real.
  • Object Storage is S3-compatible, with storage classes ranging from high-performance to Cold Archive, which lets you tier your backup retention instead of paying standard rates for seven years of data.

What you do not get for free: managed services are region-scoped. A Managed Kubernetes cluster, a Managed Database instance, a Load Balancer or a Private Network lives in one region. Multi-region means you build and operate two of everything, and you own the data replication path between them. Plan for that explicitly.

Four patterns, four price points

PatternWhat runs in the second regionRealistic RTORealistic RPORelative cost
Backup & restoreNothing (objects in a second-region bucket)Hours to a dayBackup interval (1–24h)Lowest — storage only
Pilot lightData replicated continuously, compute scaled to zero/minimal30 min – 2hMinutesLow — storage + small control plane
Warm standbyFull stack running at reduced capacity5–30 minSeconds to minutesSignificant — roughly 30–50% of prod
Active/activeFull capacity, both regions serving trafficNear zero (failover is traffic shift)Near zero if the datastore allows itHighest — 2x prod plus complexity

Pilot light is the sweet spot for most mid-sized platforms. The data is already there, the infrastructure is described in code, and recovery is "apply the Terraform, scale the node pool, flip DNS". Going from pilot light to warm standby typically multiplies DR compute cost several-fold for a gain measured in tens of minutes — worth it for Tier 0, hard to justify elsewhere.

Data replication is where the RPO is actually decided

Everything else is replaceable; data is not. Three layers to handle:

Object storage

Use a bucket in a second region and keep it in sync. If your OVHcloud Object Storage offer exposes bucket replication, use it. Otherwise a scheduled rclone or aws s3 sync job driven from a small VM or a Kubernetes CronJob is perfectly adequate for RPOs measured in minutes:

rclone sync \
  ovh-gra:prod-assets ovh-sbg:prod-assets-dr \
  --transfers 16 --checkers 32 \
  --s3-no-check-bucket \
  --log-level INFO --stats 1m

Enable versioning and object lock on the DR bucket. A replication job faithfully replicates ransomware encryption too — immutability is what turns a copy into a backup.

Databases

Managed database services give you automated backups and point-in-time recovery within their region. For cross-region, you have two honest options:

  • Backup shipping + PITR: export backups to a second-region bucket and restore on demand. RPO equals your backup/WAL shipping interval; RTO includes restore time, which for a multi-hundred-gigabyte database is measured in hours. Measure it — do not guess.
  • Logical or physical replication to an instance you operate in the standby region, over vRack. This gets you an RPO of seconds, at the cost of running and monitoring that replica yourself. For PostgreSQL, logical replication is the usual route when the managed source allows it:
-- on the standby instance
CREATE SUBSCRIPTION dr_sub
  CONNECTION 'host=10.10.0.20 dbname=app user=repl password=... sslmode=require'
  PUBLICATION app_pub
  WITH (copy_data = true, streaming = true);

-- monitor the lag, alert on it
SELECT subname, latest_end_lsn, latest_end_time FROM pg_stat_subscription;

Whatever you choose, export replication lag as a metric and alert on it. An unmonitored replica silently drifting for three weeks is worse than no replica, because you will plan your failover around a number that is false.

Kubernetes state

Velero to an OVHcloud Object Storage bucket covers cluster objects and, with CSI snapshots, persistent volumes:

velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.10.0 \
  --bucket velero-dr \
  --secret-file ./credentials-ovh \
  --backup-location-config \
    region=gra,s3ForcePathStyle=true,s3Url=https://s3.gra.io.cloud.ovh.net \
  --use-volume-snapshots=false

Note that block storage snapshots are region-local: a snapshot in Gravelines does not help you if Gravelines is unreachable. For cross-region volume recovery you need the data in object storage, either via Velero's filesystem backup (restic/kopia) or an application-level dump.

Making the failover actually happen

The technical switch is usually DNS. Keep TTLs on failover records low — 60 seconds is a reasonable compromise — and know that some resolvers and HTTP clients ignore TTLs anyway. Combine DNS with a health-checked entry point, and make sure your client applications have sane connection timeouts and retry logic; a 300-second socket timeout will hold your RTO hostage regardless of how fast DNS converges.

Two operational rules matter more than the tooling choice:

  1. Automate the decision inputs, keep the decision human for Tier 1 and below. Automatic failover on a flapping health check causes more outages than it prevents. Make the runbook one command, not one judgement call.
  2. Write the failback plan at the same time as the failover plan. Returning to the primary region after the standby has accumulated writes is the genuinely hard part, and it is always discovered during the drill rather than during the design.

Infrastructure as code is the DR plan

If your standby region is built by hand, it is not a DR plan, it is a snapshot of someone's afternoon. Parameterise the region and instantiate the same module twice:

module "platform_primary" {
  source       = "./modules/platform"
  service_name = var.project_id
  region       = "GRA11"
  node_count   = 6
}

module "platform_dr" {
  source       = "./modules/platform"
  service_name = var.project_id
  region       = "SBG7"
  node_count   = 1   # pilot light: scale up on failover
}

Keep the DR module continuously applied in CI. Infrastructure code that has not run in four months will fail on an unavailable flavour, a renamed image or a provider upgrade — on the worst possible day.

Budgeting without fantasy numbers

Rather than quoting prices that change, model the drivers. A multi-region DR budget on OVHcloud is roughly:

Cost driverScales withLever to reduce it
Standby computePattern chosen (0% → 100% of prod)Pilot light; scale node pools on failover
Replicated block storageVolume size, not usageThin volumes, move cold data to object storage
Backup object storageRetention × change rateLifecycle rules to Cold Archive beyond 30–90 days
Cross-region trafficWrite volumeStructurally favourable on OVHcloud (included egress)
Licences (VMware, Veeam, Zerto…)Hosts/VMs protectedProtect only tiered workloads
Operational effortNumber of patterns in useStandardise on two patterns maximum

Present the budget as a menu: here is Tier 2 for X, here is Tier 0 for 5X, choose per application. Engineering teams that present a single all-or-nothing figure usually get "later".

The compliance angle: DR as evidence

For regulated sectors, a DR plan is a document before it is an architecture. DORA requires financial entities to test their resilience and document the results; NIS2 pushes business continuity obligations onto a much broader set of organisations; HDS and SecNumCloud frameworks come with their own continuity expectations. Sovereignty-driven customers choosing OVHcloud for jurisdictional reasons will also expect the DR site to stay within the same legal perimeter — a detail worth checking when you pick the standby region.

Practically, that means keeping: a dated inventory with tiers and RTO/RPO targets, the architecture diagram per tier, the runbooks, and — most importantly — the drill reports with measured recovery times. Measured, not targeted. An untested DR plan is a hypothesis, and the Strasbourg fire of 2021 was a very public reminder that customers who had treated backups and a second region as optional discovered it at the worst possible moment.

Test it, or do not claim it

Schedule drills quarterly for Tier 0/1, annually for the rest. Each drill produces three numbers: measured RTO, measured RPO, and the number of manual steps. Drive the third one down over time — it is the best predictor of whether the plan survives contact with a real incident at 3 a.m., executed by someone who did not design it.

Start small: one Tier 2 application, a second-region bucket, a restore runbook, one timed drill. The gap between your assumed recovery time and the measured one will tell you more about your real resilience posture than any architecture diagram.

← Back to blog