ObservKit / Capacity Planning / Elasticsearch Sizing Calculator
Observability utility

Elasticsearch Sizing Calculator

Disk per data tier, replicas, searchable snapshots and primary shard counts for Elasticsearch, with every assumption shown.

● Calculated locally in your browser
Presets
Capacity inputs
Data tier days
Cold tier storage
Regular cold indices keep replicas. Fully mounted searchable snapshots keep one local copy and no replicas; resilience comes from the snapshot repository. Frozen is always modeled as partially mounted snapshots with a local cache.
Capacity calculation
Provisioned local disk capacity · planning estimate
—
Usable data (incl. growth) —
Reserved headroom (utilization target) —
Raw ingest over retention —
Primary data (raw × index factor) —
Local replica storage —
Growth buffer —
Hot —
Warm —
Cold —
Frozen —
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.

Shard planning Planning estimate
Primary shards / rollover—
Active primary shards—
Estimated shard size—
Primary shards retained—
Total shards on data nodes—
Data nodes needed by the shard limit—
    Replicas are included in the total shards. Frozen-tier shards do not count toward the per-node limit. The default limit is 1,000 non-frozen shards per data node. Shard size guidance: 10–50 GB.
    Ingest→Hot · —→Warm · —→Cold · —→Frozen · —→Delete
    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.

    From daily ingest to provisioned disk
    StepFormulaResult
    Indexed size per day250 GB/day × factor 1.0250 GB/day
    Primary data over retentionindexed/day × 90 days22.5 TB
    Tier allocation (primaries)7 / 23 / 60 dayshot 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 tierper 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

    What each tier keeps, and where
    TierTypical storage modelReplica behaviorLocal diskSnapshot repository
    HotRegular indices; newest data, indexing and most searchesPrimaries + configured replicasFull dataset × (1 + replicas)Not required by the tier (backups not modeled)
    WarmRegular indices; read-mostly, fewer searchesPrimaries + configured replicasFull dataset × (1 + replicas)Not required by the tier
    Cold, regularRegular indices on cheaper nodesPrimaries + configured replicasFull dataset × (1 + replicas)Not required by the tier
    Cold, fully mounted searchable snapshotSearchable snapshot, fully mountedNo replicas by default; lost shards are restored from the repositoryOne full copyFull dataset (provides resilience)
    FrozenSearchable snapshot, partially mountedNo replicasShared 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.

    Elasticsearch storage by tier layout
    ScenarioTier daysLocal dataProvisioned diskSnapshot repositoryLink
    Hot only, 50 GB/day14 hot1.4 TB2.1 TB0 GBOpen this scenario
    Hot + warm, 250 GB/day7 hot · 23 warm15 TB22.1 TB0 GBOpen this scenario
    Hot + warm + cold regular, 250 GB/day7 hot · 23 warm · 60 cold45 TB66.2 TB0 GBOpen this scenario
    Cold as searchable snapshot, 250 GB/day7 hot · 23 warm · 60 cold (fully mounted)30 TB44.1 TB18.8 TBOpen this scenario
    Frozen, 250 GB/day for a year7 hot · 23 warm · 335 frozen23.4 TB33.7 TB104.7 TBOpen 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.

    Reference scenario, daily rollover
    StepFormulaResult
    Indexed primary data per day250 GB/day × factor 1.0250 GB
    Primary data per rolloverindexed/day × 1 day250 GB
    Primary shards per rollover, 30 GB targetceil(250 ÷ 30)9
    Primary shards over 90 daysshards per rollover × 90 rollovers810
    Same, with a 50 GB targetceil(250 ÷ 50) × 90450

    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

    1. 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.
    2. 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.
    3. 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.
    4. 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_headroom of 200 GB means the low watermark is reached when 200 GB remain free — about 98% used on a 10 TB disk.
    5. 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 as pri.store.size of rolled-over indices divided by the raw bytes shipped for them.
    6. 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.
    7. 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

    Last reviewed: · Related: Elasticsearch data tier sizing guide · Capacity Planning · generic log storage