Elasticsearch Sizing Calculator
Disk per data tier, replicas, searchable snapshots and primary shard counts for Elasticsearch, with every assumption shown.
Show math
Headroom is applied by division, not multiplication: to keep data at or below the target, provisioned capacity is usable ÷ target utilization. At 85% that adds ~17.6%, not 15%.
This is an aggregate planning estimate, not a reproduction of the Elasticsearch allocator. ObservKit uses an 85% aggregate disk utilization target as a conservative planning assumption. Elasticsearch applies disk watermarks per node and the default low watermark also includes a 200 GB max-headroom cap. Frozen disk uses the 90% shared-cache default as a simplified aggregate; the per-node 100 GB max_headroom cannot be modeled without node sizing. The 10% frozen cache ratio is an ObservKit planning assumption.
Assumptions & sources
- Searchable snapshots: by default they have no replicas; the snapshot repository provides resilience and lost shards are restored from it. Cold uses fully mounted indices; frozen uses partially mounted indices backed by a shared cache. Source: Elastic docs — Searchable snapshots. Searchable snapshots require an Enterprise subscription for self-managed clusters.
- Data tiers: Elastic docs — Data tiers.
- Planning disk utilization target (85%): a conservative aggregate planning assumption inspired by, but not equal to, the Elasticsearch disk watermarks. Elasticsearch evaluates watermarks per node: the low watermark defaults to 85% with
low.max_headroom= 200 GB, high to 90%, flood stage to 95%. Because ObservKit does not size nodes yet, the result is a planning estimate, not allocator math. Source: Elastic docs — Cluster-level shard allocation and routing settings. - Frozen disk: dedicated frozen nodes default the shared cache to 90% of disk, with
shared_cache.size.max_headroom= 100 GB per node. ObservKit uses cache ÷ 0.9 as a simplified, conservative aggregate; the per-node headroom cap is not modeled. The 10% frozen cache ratio is an ObservKit planning assumption, not an official Elastic recommendation. Source: Elastic docs — Searchable snapshots. - Index / raw factor defaults to 1 because there is no universal ratio; see Elastic docs — Tune for disk usage.
- Shard sizing: Elastic docs — Size your shards.
- Not modeled: node counts and RAM:disk ratios, regular snapshot backups of hot/warm data, OS/filesystem overhead, merges and translog peaks.
Planning estimates only. Actual Elastic architecture depends on query load, mappings, shard strategy, data tier hardware, searchable snapshots and operational requirements.
Worked example: the reference scenario
Reference scenario the calculator's default inputs: 250 GB/day of raw data, 90 days retention split 7 hot / 23 warm / 60 cold (cold as regular indices), 1 replica, index/raw factor 1.0, 25% growth, and an 85% planning disk utilization target. Open this scenario.
| Step | Formula | Result |
|---|---|---|
| Indexed size per day | 250 GB/day × factor 1.0 | 250 GB/day |
| Primary data over retention | indexed/day × 90 days | 22.5 TB |
| Tier allocation (primaries) | 7 / 23 / 60 days | hot 1.8 TB · warm 5.8 TB · cold 15 TB |
| Replicas on regular tiers | × (1 primary + 1 replica) | 45 TB |
| Growth | × (1 + 25%) | 56.3 TB |
| Planning utilization | ÷ 85% (adds 9.9 TB of headroom) | 66.2 TB |
| Provisioned disk by tier | per tier usable ÷ 85% | hot 5.1 TB · warm 16.9 TB · cold 44.1 TB |
Headroom is applied by division: to keep usage at or below 85%, provisioned disk is usable ÷ 0.85, which adds about 17.6%, not 15%. With every tier regular, factor 1.0 and one replica, the result equals the generic log storage estimate divided by 0.85.
Data tier comparison
| Tier | Typical storage model | Replica behavior | Local disk | Snapshot repository |
|---|---|---|---|---|
| Hot | Regular indices; newest data, indexing and most searches | Primaries + configured replicas | Full dataset × (1 + replicas) | Not required by the tier (backups not modeled) |
| Warm | Regular indices; read-mostly, fewer searches | Primaries + configured replicas | Full dataset × (1 + replicas) | Not required by the tier |
| Cold, regular | Regular indices on cheaper nodes | Primaries + configured replicas | Full dataset × (1 + replicas) | Not required by the tier |
| Cold, fully mounted searchable snapshot | Searchable snapshot, fully mounted | No replicas by default; lost shards are restored from the repository | One full copy | Full dataset (provides resilience) |
| Frozen | Searchable snapshot, partially mounted | No replicas | Shared cache only (ObservKit assumes 10% of the dataset) | Full dataset |
Cold regular is not cold searchable snapshot. A regular cold index keeps primaries and replicas on local disk like hot and warm. A fully mounted searchable snapshot keeps one local copy and relies on the snapshot repository for resilience. In the reference scenario, switching the 60 cold days to searchable snapshots lowers provisioned disk from 66.2 TB to 44.1 TB and adds 18.8 TB in the repository. Searchable snapshots require an Enterprise subscription on self-managed clusters.
Frozen is not a full local dataset. Partially mounted indices keep only a shared cache locally; every search that misses the cache reads from the repository. The 10% cache ratio ObservKit uses is a planning assumption, not an Elastic recommendation — size it from the share of frozen data you actually search. The data tier sizing guide covers when each tier is worth it.
Reference scenarios
Reference scenario Each row is computed by the engine above and opens with its inputs filled in; they are comparison points, not recommended layouts. One replica on regular tiers, factor 1.0, 25% growth, 85% planning utilization.
| Scenario | Tier days | Local data | Provisioned disk | Snapshot repository | Link |
|---|---|---|---|---|---|
| Hot only, 50 GB/day | 14 hot | 1.4 TB | 2.1 TB | 0 GB | Open this scenario |
| Hot + warm, 250 GB/day | 7 hot · 23 warm | 15 TB | 22.1 TB | 0 GB | Open this scenario |
| Hot + warm + cold regular, 250 GB/day | 7 hot · 23 warm · 60 cold | 45 TB | 66.2 TB | 0 GB | Open this scenario |
| Cold as searchable snapshot, 250 GB/day | 7 hot · 23 warm · 60 cold (fully mounted) | 30 TB | 44.1 TB | 18.8 TB | Open this scenario |
| Frozen, 250 GB/day for a year | 7 hot · 23 warm · 335 frozen | 23.4 TB | 33.7 TB | 104.7 TB | Open this scenario |
Keeping a year with 335 days frozen needs 33.7 TB of local disk and 104.7 TB in the repository. The same year on regular cold indices with one replica needs 268.4 TB of local disk.
Shard planning example
Elastic's shard sizing guidance is to aim for shards between 10 GB and 50 GB and to keep each shard below 200 million documents; for time-series data it suggests rollover with max_primary_shard_size at 50 GB. The planner divides the indexed primary data in each rollover window by a target shard size and rounds up.
| Step | Formula | Result |
|---|---|---|
| Indexed primary data per day | 250 GB/day × factor 1.0 | 250 GB |
| Primary data per rollover | indexed/day × 1 day | 250 GB |
| Primary shards per rollover, 30 GB target | ceil(250 ÷ 30) | 9 |
| Primary shards over 90 days | shards per rollover × 90 rollovers | 810 |
| Same, with a 50 GB target | ceil(250 ÷ 50) × 90 | 450 |
Each replica adds the same number of replica shards. Elasticsearch limits non-frozen shards to 1,000 per node by default, so shard count, not only disk, can set a minimum node count. Open the 30 GB target · Open the 50 GB target.
Common mistakes
- Adding replicas to searchable snapshots. Fully mounted cold indices have no replicas by default. Counting a replica for the 60 cold days gives 44.1 TB of cold disk instead of 22.1 TB.
- Adding replicas, or full copies, to frozen. Treating 335 frozen days as regular cold data with a replica asks for 246.3 TB of local disk; partially mounted frozen data needs a 11.6 TB local cache in this model.
- Planning to 100% disk. The reference scenario needs 56.3 TB of data with growth. Provisioning exactly that leaves every node above the 85% low watermark, where Elasticsearch stops allocating shards to it (primaries of newly created indices excepted); at 90% (high) it tries to move shards away, and at 95% (flood stage) indices with a shard on that node are made read-only. Planning at 85% gives 66.2 TB.
- Reading the 85% target as allocator math. Watermarks are evaluated per node, not as a cluster average: one full node blocks allocation even when the cluster is at 70%. On large disks the default
low.max_headroomof 200 GB means the low watermark is reached when 200 GB remain free — about 98% used on a 10 TB disk. - Assuming index/raw factor = 1. Mappings, multi-fields,
_source, codecs and LogsDB change on-disk size. Hypothetical example With a factor of 1.3 the reference scenario needs 86 TB; with 0.7, 46.3 TB. Measure it aspri.store.sizeof rolled-over indices divided by the raw bytes shipped for them. - Too many small shards. Illustrative example At 2 GB/day with daily rollover and 90 days retention, each data stream accumulates 90 primary shards of about 2 GB. Rolling over every 15 days gives 6 shards of about 30 GB for the same data. Open the 15-day rollover scenario.
- Budgeting the snapshot repository as local disk. In the frozen scenario 104.7 TB lives in object storage and 33.7 TB on nodes. Buying node disk for the repository total overbuys; forgetting the repository underbuys object storage.
How Elastic sizing is calculated
indexed/day = raw GB/day × index/raw factor
tier dataset = indexed/day × tier days
regular tier local = dataset × (1 + replicas)
cold snapshot local = dataset × 1 repository = dataset
frozen local = dataset × cache % repository = dataset
usable = local × (1 + growth)
provisioned = usable ÷ planning utilization (85%) hot, warm, cold
= usable ÷ 0.90 shared-cache share frozen
shards/rollover = ceil(indexed/day × rollover days ÷ target shard size)
- Planning utilization (85%): an aggregate planning assumption inspired by, not equal to, the per-node disk watermarks.
- Index/raw factor: defaults to 1.0 because there is no universal ratio; set it from measurement.
- Replicas: applied to regular indices only.
- Searchable snapshots: no replicas; the repository holds the full dataset.
- Frozen cache: 10% of the frozen dataset by default (ObservKit assumption); frozen nodes dedicate 90% of disk to the shared cache by default.
- Shards: a count derived from size and rollover, an orientation rather than a production recommendation.
- Not modeled: node counts and RAM:disk ratios, regular snapshot backups of hot/warm data, OS and filesystem overhead, merge and translog peaks.
The common model behind all calculators is described in the methodology.
Sources
- Data tiers — Elastic documentation. Hot, warm, cold and frozen roles.
- Searchable snapshots — Elastic documentation. Fully vs partially mounted indices, no replicas, shared cache defaults, Enterprise subscription.
- Cluster-level shard allocation and routing settings — Elasticsearch reference. Disk watermarks 85% / 90% / 95% and
low.max_headroom. - Tune for disk usage — Elastic documentation. Why on-disk size differs from raw size.
- Size your shards — Elastic documentation. 10–50 GB shards, 200 million documents, rollover at 50 GB, 1,000 non-frozen shards per node.
Last reviewed: · Related: Elasticsearch data tier sizing guide · Capacity Planning · generic log storage