Uber recently described how it made OpenSearch resilient to the loss of an entire availability zone. Its design combines three isolation groups, at least three copies of every shard, forced shard-allocation awareness, and five cluster-manager nodes.
It is a thoughtful solution to a difficult problem: how do you keep a stateful, shard-owning search cluster available after losing a zone—and then another node?
At Mach5, we started with the same failure requirement but asked a different question:
What if query nodes did not own the durable data at all?
That changes how the system recovers, how it operates, and how its cost grows with retained data and query demand.
The guarantee
We use the same failure sequence described by Uber:
- One complete availability zone becomes unavailable.
- One additional node fails in a surviving zone.
- Querying and ingestion continue.
- Acknowledged data is not lost.
- Recovery requires no emergency operator intervention.
The surviving deployment also retains enough compute to satisfy its declared latency and ingestion SLOs.
Uber's OpenSearch approach
Uber's OpenSearch design uses three isolation groups mapped onto physical failure domains. Every index has at least two replicas, creating three total copies of every shard. Shard-allocation awareness places those copies across the three isolation groups.
When a zone fails, forced allocation awareness prevents OpenSearch from recreating the missing replicas in the two surviving zones. That avoids a sudden wave of disk, network, and CPU activity that could destabilize the remaining cluster.
Uber also uses five cluster-manager nodes. After losing two managers with a zone, the voting configuration contracts to the three survivors. The cluster can then tolerate one additional manager failure.
This is strong engineering for a system in which data nodes own shards. That ownership also determines the system's scaling and recovery behavior:
- Durable data is replicated at the application layer.
- Retaining more data requires more block storage and data nodes.
- Changing node types can require shard relocation.
- Recovery is coupled to replica placement.
- Workload isolation means sharing a heterogeneous cluster or creating additional clusters.
Mach5 moves the state boundary
Mach5 separates durable data from query compute.
Authoritative segments live in S3 Standard, which stores objects across at least three availability zones and is designed to sustain the loss of one zone. Durable metadata is also replicated across three failure domains.
Query nodes hold replaceable execution state and local caches. Their NVMe contents improve performance, but losing them does not lose authoritative data.
For an important query path, Mach5 provisions six replicas—two per availability zone:
| Failure state | Available replicas |
|---|---|
| Healthy | 6 |
| After one AZ fails | 4 |
| After one more node fails | 3 |
The deployment is sized so those three survivors can continue satisfying the failure-state workload.
Mach5 fails over by rerouting requests and warming replaceable caches, not by repairing or relocating durable shards.
No recovery storm
In a conventional OpenSearch cluster, the disappearance of shard replicas creates missing durable state. Uber uses forced awareness specifically to prevent OpenSearch from immediately recreating that state in the surviving zones.
In Mach5, losing a query node does not create missing durable state. S3 remains authoritative. The failure sequence is therefore:
- Kubernetes and the load balancer remove failed pods.
- In-flight idempotent queries retry against surviving replicas.
- Surviving nodes continue reading the same segment objects.
- The degraded-mode scheduler launches replacement nodes across the two live availability zones.
- New query replicas enter service immediately by reading from S3, initially with empty local caches.
- Warm-cache performance returns progressively as the caches repopulate under explicit I/O and memory limits.
There is no shard-relocation decision and no cluster-wide replica-repair traffic.
The compute loss is temporary
The surviving replicas carry the workload only until replacement capacity starts in the two live zones. Because the new nodes do not need to receive shards, they can serve directly from S3 as soon as they are ready. Full warm-cache performance returns as their local caches fill.
This produces predictable failure behavior. The durable data remains available, replacement capacity can be added without copying it, and recovery does not compete with production queries for the resources required to rebuild shards.
A different data-cost curve
Let D be the compressed size of one indexed copy.
OpenSearch
At least three application-managed copies.
durable footprint ≈ 3D + disk headroomMach5
One logical dataset in S3.
durable footprint ≈ D in S3S3 performs its own internal replication, but the customer pays for one logical object copy rather than three separately provisioned application replicas.
Using an AWS configuration with gp3 storage, 70% maximum OpenSearch disk utilization, and storage-driven data-node compute, the marginal retention costs are approximately:
| Platform | Additional one-copy TB/month |
|---|---|
| OpenSearch | Approximately $561 |
| Mach5 | Approximately $22 |
As the data under management increases, the difference compounds:
| One-copy indexed data | OpenSearch storage-driven cost | Mach5 object-storage cost |
|---|---|---|
| 10 TB | Approximately $5.6k/month | Approximately $236/month |
| 100 TB | Approximately $56k/month | Approximately $2.3k/month |
| 500 TB | Approximately $281k/month | Approximately $11.3k/month |
| 1 PB | Approximately $561k/month | Approximately $22.1k/month |
Query compute is additional in both cases. The distinction is that Mach5 does not add query nodes merely because the retained dataset grew.
Warehouses make compute specialization practical
Separating data from compute also allows Mach5 to create multiple warehouses over the same durable dataset. Each warehouse has its own instance families, processor architecture, replica count, failure-state capacity, memory limits, concurrency, cache policy, scaling behavior, query admission, priority, and availability SLO.
| Warehouse | Workload | Compute |
|---|---|---|
| Interactive | Dashboards, alerts, Top-N | Compute-optimized Graviton with local NVMe |
| Investigation | Joins and large aggregations | Memory-optimized nodes |
| Batch | Reports and broad scans | Elastic compute, suspended after completion |
| API | High-concurrency filters | Small compute- and network-optimized nodes |
| Development | Intermittent exploration | Scale-to-zero or Spot |
All these warehouses read the same S3 segments. Creating another warehouse does not create another durable copy of the dataset.
This removes two expensive compromises:
- Provisioning every node for the most memory-intensive query.
- Allowing scans and investigations to evict the cache or consume the concurrency budget of latency-sensitive dashboards.
Warehouse compute cost
Σ warehouse(active time × failure-tolerant capacity × best instance price per work unit)A batch warehouse can use a different node family and run for only part of the day. The interactive warehouse remains warm and continuously available. Neither needs to be provisioned for the other's peak.
Compute arbitrage without data movement
Because query nodes do not own durable shards, Mach5 can continuously evaluate different EC2 options:
- x86 versus Arm.
- Compute-, general-, or memory-optimized families.
- Local NVMe versus EBS cache.
- New versus older instance generations.
- On-Demand guaranteed capacity versus diversified Spot capacity.
- Different instance families for different warehouses.
The selection metric is not dollars per vCPU. Different processors deliver different throughput for the same nominal vCPU count.
Mach5 selects on dollars per successful query at the target p99.
That calculation includes:
- Measured throughput per node.
- Local-cache hit rate.
- S3 requests and bytes read.
- Memory pressure and spilling.
- Cache-warming cost.
- Interruption and replacement behavior.
Changing the winning instance family does not require migrating the authoritative dataset. New nodes start, warm their caches, and enter service.
Workload isolation without data duplication
OpenSearch can isolate workloads by creating separate clusters, but each cluster brings its own managers, data nodes, shard replicas, and operational lifecycle. Mach5 warehouses isolate compute while sharing durable storage and metadata.
Interactive
Compute optimized, always warm, strict p99.
Investigation
Memory optimized for large joins and aggregations.
Batch
Elastic fleet, throughput first, suspended when idle.
This gives each workload an independent performance envelope:
- Batch scans cannot consume interactive concurrency.
- Large aggregations cannot exhaust dashboard memory.
- One tenant cannot evict another tenant's hot cache.
- Low-priority work can queue without increasing critical-path capacity.
- Warehouses can scale and upgrade independently.
- Cost attribution is available per workload or tenant.
Engineering the complete failure boundary
The Mach5 configuration combines separated data and compute with disciplined multi-zone deployment:
- Hard three-zone spreading in steady state, with an automated two-zone degraded mode.
- Host-level anti-affinity.
- Pod disruption budgets.
- Readiness, liveness, and startup probes.
- Durable metadata replicated across three failure domains.
- HA metadata and control services.
- Per-warehouse post-failure compute headroom.
- Diversified replacement capacity in each live availability zone.
- Protected S3 data with versioning and recovery controls.
- Controlled cache warming and query admission.
Critical warehouses use at least six replicas, distributed two per zone. Compatible warehouse pods share family-specific node pools, allowing Kubernetes to bin-pack them efficiently without weakening failure-domain placement.
Warehouses select capacity profiles rather than owning dedicated Auto Scaling Groups. This preserves workload-level guarantees without requiring six dedicated EC2 instances for every warehouse.
The larger lesson
Uber's article demonstrates how to make a shard-owning system resilient by carefully controlling replica placement and recovery. Mach5's answer is to remove durable shard ownership from the query fleet.
OpenSearch
How do we preserve and place enough shard copies?
Mach5
How do we preserve enough replaceable compute capacity?
Once durability is separated from compute:
- Zone failure does not initiate shard recovery.
- Retention grows object storage instead of a fleet of data nodes.
- Query compute scales independently from retained data.
- Warehouses isolate workloads without duplicating the dataset.
- Each workload can use the most economical instance family.
- Compute fleets can change without migrating authoritative data.
The result is a search and analytics architecture designed to remain available through zone failure while becoming progressively more cost-efficient as data, workloads, and infrastructure options grow.
Build search around your workload—not your shards
See how Mach5 separates durable data, query compute, and workload-specific warehouses.
Talk to the Mach5 team