Searchable Snapshots in Elasticsearch
How Elasticsearch turns cheap object storage into data you can still search: what a searchable snapshot is, how it works inside the engine, how to size and operate it, and where it can hurt you.
Imagine a huge public library. The books people ask for every day sit on the shelves right next to the front desk. The books people ask for once a year are in a big warehouse across town. When someone finally wants one, a librarian drives over, fetches it, and keeps it on the front desk for a while in case somebody else wants it too. The library never throws the warehouse books away, and it never pays for front-desk shelf space to hold them. Elasticsearch does almost exactly this with old data, and the feature that makes it possible is called a searchable snapshot.
1The Problem: Data That Never Stops Growing
To understand why searchable snapshots exist, first look at what happens to a busy Elasticsearch cluster over time.
Logs, metrics, and events pile up
Elasticsearch is very often used to store time-based data: application logs, security events, website clicks, sensor readings, payment traces. Every second, more of it arrives. A modest company can create hundreds of gigabytes a day, and a large one can create tens of terabytes a day. Nobody deletes this data on a whim, because it has value long after the day it was created.
Auditors may require you to keep records for one, three, or seven years. Security teams need to look back months to find out when an attacker first entered the network. Engineers want to compare this month’s traffic with the same month last year. So the data stays, and the cluster grows.
Why keeping it in the normal way is so expensive
A normal Elasticsearch index lives on the local disks of data nodes. To keep it safe, you usually keep at least one replica, which is a full second copy on a different node. That means every gigabyte of data costs you two gigabytes of fast disk. On top of the disk, each node needs memory and CPU to keep the shards healthy, even if nobody ever searches them.
Fast local disks are also the most expensive kind of storage in most environments. You are paying premium prices to store data that is, in practice, almost never read. That is the mismatch searchable snapshots are designed to remove.
Think of your phone’s photo gallery. The photos from this week are stored on the phone itself because you look at them all the time. The photos from ten years ago sit in cloud storage, and the gallery only downloads a small preview when you scroll to them. The old photos are still “in your gallery”, but they no longer take up room on the phone.
Data gets colder as it gets older
The most important observation behind the whole feature is that data has a temperature. Fresh data is hot: it is written constantly, searched constantly, and shown on dashboards that refresh every few seconds. A month later it is warm, because people only look at it when they investigate something. A year later it is cold, and searches against it are rare and usually planned.
| Age of data | How often it is searched | Speed people expect | Sensible storage |
|---|---|---|---|
| Hours to days | Constantly, by dashboards and alerts | Milliseconds | Fast local SSD or NVMe with replicas |
| Weeks | Regularly, during investigations | Well under a few seconds | Cheaper local disks |
| Months | Occasionally | A few seconds is fine | Local disk holding one copy, backed by a snapshot |
| A year or more | Rarely, for audits or deep hunts | Seconds to minutes is acceptable | Object storage, with a small local cache |
Nothing about old data being “cold” means it is worthless. It means the price you should pay per gigabyte, and the speed you should expect per query, are different from those of fresh data.
2Foundations You Need First
Searchable snapshots combine four older ideas. If you are comfortable with each one, the rest of this guide becomes much easier.
Indices, shards, and Lucene segments
An Elasticsearch index is a named collection of documents. To spread work across machines, an index is cut into shards. Each shard is really a small, complete search engine built on a library called Lucene. Lucene stores its data in files called segments.
Here is the detail that makes everything else possible: a Lucene segment is immutable. Once it is written, it is never changed. New documents go into new segments. Deleted documents are only marked as deleted, and a background merge later builds a fresh, bigger segment and discards the old ones. Immutable files are easy to copy, easy to check, and safe to store somewhere else.
A segment is like a printed and bound book. You cannot change a word inside it. If something needs correcting, you print a new edition and retire the old one. Because a printed book never changes, you can photocopy it, store the copy in another building, and trust that the copy matches.
Snapshots and repositories
A snapshot is a backup of one or more indices, taken from a running cluster without stopping it. It is stored in a snapshot repository, which is usually an object store such as Amazon S3, Google Cloud Storage, or Azure Blob Storage. It can also be a shared file system.
Snapshots are incremental. Because segments never change, the second snapshot only needs to upload segments that did not exist in the first one. Segments that already exist in the repository are simply referenced again. This makes regular snapshots cheap in both time and storage.
Object storage
Object storage is a service that stores files (“objects”) in flat containers (“buckets”). It is extremely cheap per gigabyte, very durable, and effectively unlimited in size. The trade-off is that every read is a network call with noticeably higher delay than reading a local disk, and most providers charge a small fee per request and per gigabyte transferred out.
Data tiers
Elasticsearch lets you assign nodes to roles that describe the temperature of the data they hold. These are called data tiers, and index lifecycle management can move an index from one tier to the next automatically.
Hot
Receives new data and serves the most frequent searches. Fast disks, plenty of CPU and memory, and usually replicas.
Warm
Holds data that is no longer written to but is still searched regularly. Cheaper hardware than hot.
Cold
Holds data that is searched only occasionally. This is where fully mounted searchable snapshots normally live.
Frozen
Holds data that is rarely searched, using a large local cache and object storage as the real home. This is where partially mounted searchable snapshots live.
flowchart LR
A[Hot tier] --> B[Warm tier]
B --> C[Cold tier]
C --> D[Frozen tier]
D --> E[Delete]
Older versions also offered a separate “freeze index” feature that made indices cheaper by limiting their memory use. That approach was replaced by the frozen tier built on searchable snapshots, which handles the same goal far better.
3So, What Is a Searchable Snapshot?
A searchable snapshot is a snapshot that you can search directly, without first restoring it in the ordinary way.
The short definition
Normally, a snapshot is a sleeping backup. To read the data inside, you must restore the snapshot into a regular index, which means copying every file back onto local disks. A searchable snapshot changes the relationship. You mount the snapshot as an index, and Elasticsearch reads the data from the snapshot itself, treating the repository as the real storage layer. The index looks and behaves like any other index when you search it.
The crucial shift in thinking is this: the snapshot stops being a spare copy and becomes the primary copy of record. Local disks hold either a full working copy (in the cold tier) or only a cache of the parts that were recently used (in the frozen tier). That is why the data is so much cheaper to keep.
Mounting: the action that makes it searchable
Mounting is done through a mount operation on a snapshot, or automatically by an index lifecycle policy. The result is a new index whose settings say “my data lives in this snapshot in that repository”. Elasticsearch then allocates the shards of that index to suitable nodes, and those nodes are set up to read data from the repository as needed.
The two ways to mount
Fully mounted
Every file of the shard is downloaded to local disk. Searches are served entirely from local storage. Used in the cold tier. Storage saving comes mainly from needing fewer replicas.
Partially mounted
Only small pieces are kept locally, in a shared cache, and the rest is fetched from the repository on demand. Used in the frozen tier. Storage saving is very large, at the cost of slower first reads.
In the API, these two options are known as the full copy and the shared cache storage types. Indices mounted fully get a name starting with restored- when created by lifecycle management, and indices mounted partially get a name starting with partial-. Seeing those prefixes in your index list is the quickest way to spot what is what.
flowchart TD
S[Snapshot in object storage] --> M{How is it mounted}
M -->|Full copy| F[Fully mounted index on cold nodes]
M -->|Shared cache| P[Partially mounted index on frozen nodes]
F --> L1[All files on local disk]
P --> L2[Only recently used pieces cached locally]
What you can and cannot do with a mounted index
A searchable snapshot index is read-only. You can search it, aggregate over it, filter it, and visualize it. You cannot index new documents into it, update or delete individual documents, or force-merge it. This restriction is natural, because the data files belong to an immutable snapshot and cannot be edited in place.
A searchable snapshot is not a magic way to make cheap storage as fast as SSDs. Searches over cached data can be quick, but the first read of data that is not in the cache must travel over the network, so it will be slower. Plan for that difference rather than being surprised by it.
Licensing and history
Searchable snapshots arrived in the 7.x series as a preview and matured into a supported feature, with the frozen tier and partial mounting following soon after. They require an Enterprise-level subscription (or an active trial). Because features and defaults evolve between releases, always confirm the details against the documentation of the exact version you run.
4Architecture and Components
A searchable snapshot setup is a small team of cooperating parts. Knowing each one makes troubleshooting far easier.
Snapshot repository
The object store bucket (or shared file system) that holds the segment files and the metadata describing each snapshot. It is the long-term home of the data.
Snapshot
A consistent, point-in-time record of an index, made of references to files in the repository. One snapshot per index is the common lifecycle-managed pattern.
Mounted index
The searchable face of the snapshot. It has normal shards, mappings, and settings, but its store type tells Elasticsearch to read from the repository.
Cold and frozen nodes
Data nodes with tier roles. Cold nodes hold full local copies. Frozen nodes hold only a cache and are sized around that cache.
Shared snapshot cache
One large on-disk cache per frozen node, divided into equal regions. All partially mounted shards on that node share it.
Blob cache index
A hidden system index that keeps small, frequently needed pieces of files such as headers, so that a shard can start quickly without hitting the repository for every tiny read.
Index lifecycle management
The policy engine that takes the snapshot, mounts it, moves it between tiers, and deletes it when its retention ends.
Snapshot lifecycle management
A separate scheduler for regular backups. It is not required for searchable snapshots, but it is often used alongside them for the rest of your data.
flowchart TD
C[Client search request] --> CO[Coordinating node]
CO --> CN[Cold node: full local copy]
CO --> FN[Frozen node: shared cache]
FN -->|Cache miss| R[Snapshot repository in object storage]
CN -.->|Initial download only| R
FN --> BC[Blob cache system index]
The store type is the secret switch
Inside Elasticsearch, every shard reads and writes files through a layer called a directory. A normal shard uses a directory that maps to files on local disk. A mounted shard uses a special directory whose settings say “the data lives in snapshot X of repository Y”. Everything above that layer, including query execution, scoring, filtering, and aggregation, is unchanged. That is why a searchable snapshot supports the same query language and the same features as a regular index.
Picture a restaurant kitchen where the chefs always ask the same person for ingredients. For fresh food, that person walks to the fridge next door. For old, rarely used ingredients, the same person now phones a supplier and waits for a delivery. The chefs (the query engine) do not change how they cook. Only the person fetching ingredients (the directory) changes how he gets them.
Why the repository must be treated as production storage
Because the snapshot is now the real home of the data, the repository stops being an afterthought. Its availability, durability, permissions, and even its network path matter to your searches. A repository that was fine for nightly backups may not be fine as a live storage layer. You should think about it in the same way you think about the disks of your data nodes.
Place the repository bucket in the same cloud region as the cluster. Cross-region reads add delay to every cache miss and can add data transfer charges that quietly dominate your bill.
Protection against accidental deletion
Elasticsearch refuses to delete a snapshot that is still mounted by a searchable snapshot index. This is an important guard rail. It means an operator running a cleanup on old snapshots cannot silently destroy the storage of live indices. The lifecycle delete phase has a setting, on by default, that removes the underlying snapshot when the mounted index is deleted, as long as no other index still depends on it.
5Fully Mounted vs Partially Mounted
The choice between the two modes is the most important design decision you will make. Here is each in depth.
Fully mounted: the cold tier
When an index is mounted with a full copy, Elasticsearch downloads every file of every shard from the repository onto the local disks of the assigned nodes. Once this recovery finishes, searches read from local disks and behave much like searches on a normal index. Speed is close to that of a regular index on similar hardware.
So where does the saving come from? Since the repository already holds a durable copy of the data, you do not need replicas to protect against disk failure. If a node is lost, its shards simply recover again from the snapshot. Many teams therefore run the cold tier with no replicas at all. That alone removes half the local storage compared with a hot index with one replica.
Partially mounted: the frozen tier
Partial mounting goes much further. The shard starts almost immediately, because only a tiny amount of information is loaded up front. When a search needs some bytes from a file, Elasticsearch checks the local shared cache. If those bytes are there, it uses them. If not, it fetches just the needed range from the repository, stores it in the cache, and continues.
Because only the parts of files that searches actually touch are downloaded, a frozen node can be responsible for far more data than its local disk could ever hold. The disk is no longer a place to store data. It is a place to remember what was recently read.
Fully mounted is like borrowing an entire encyclopedia set and keeping it on your desk. Partially mounted is like keeping the whole set in the library, photocopying only the pages you look at, and pinning the photocopies to your desk until the pin board fills up.
| Aspect | Fully mounted | Partially mounted |
|---|---|---|
| Typical tier | Cold | Frozen |
| Local disk holds | A complete copy of the shard files | A shared cache of recently used pieces |
| Time until shard is ready | Longer, because everything is downloaded first | Very short, because almost nothing is downloaded first |
| First search speed | Fast, already local | Slower, cache misses go to object storage |
| Repeat search speed | Fast | Fast if the data is still cached |
| Dependence on repository during searches | Low once recovered | High, whenever the cache misses |
| Local storage needed | Roughly the size of the data | A small fraction of the data |
| Best for | Data searched occasionally but expected to feel responsive | Data searched rarely where cost matters most |
| Index name prefix from lifecycle | restored- | partial- |
What the frozen shared cache really is
The shared cache on a frozen node is a single large file on local disk, divided into equal-sized regions. Each region can hold a slice of some file from some shard. When a region is needed and the cache is full, Elasticsearch evicts a region that has been used less, favoring pieces that are used often. The size of the cache is a node setting, and on a dedicated frozen node it defaults to most of the node’s disk, leaving some headroom for the operating system.
Cache regions have a default size measured in megabytes, and reads on a miss are made in ranges rather than one tiny byte at a time. This is deliberate. Object stores respond best to fewer, larger reads, so the design trades a little extra downloaded data for far fewer network calls.
Why not always use frozen?
Frozen is cheaper, so it is tempting. The problem is that every search over uncached data pays a network price. A dashboard that runs twenty aggregations over last month’s data every minute would constantly miss the cache, overload the object store with requests, and feel sluggish. Fully mounted keeps that experience acceptable. The decision is therefore about how often, and how urgently, people query the data.
flowchart TD
Q[Search needs bytes of a segment file] --> H{Bytes in shared cache?}
H -->|Yes| A[Serve from local disk]
H -->|No| B[Fetch a range from repository]
B --> W[Write it into a cache region]
W --> A
W --> E{Cache full?}
E -->|Yes| V[Evict a less used region]
E -->|No| A
When cold (fully mounted) is the right answer
A support team searches ticket-related logs from the last three months several times a day. Response time matters, but the data is no longer written to. A fully mounted index with no replicas halves the disk cost while keeping searches quick.
When frozen (partially mounted) is the right answer
A security team keeps two years of network events for occasional investigations. Analysts run a few big searches per week and are happy to wait for results. A frozen tier stores this at a tiny fraction of the hot-tier cost.
6Internal Working: What Happens Under the Hood
Now let us follow the data from the moment you mount a snapshot to the moment a search result comes back.
Step one: the mount request becomes cluster state
When a snapshot is mounted, the master node reads the snapshot’s metadata from the repository. That metadata lists the shards of the index and the files that make up each shard. The master then creates a new index in the cluster state. Its settings record the repository name, the snapshot name, the original index identity, and whether the mount is partial. The shard allocation logic is told which tier the shards must go to.
Step two: allocation and recovery from the snapshot
A shard of a normal index recovers from another copy of itself, usually the primary. A shard of a searchable snapshot index recovers from the snapshot. This is true for every copy, including any replicas. Each copy builds its own view of the data straight from the repository. No node has to stream data to another during recovery, which reduces load on the rest of the cluster.
What “recovery” means depends on the mode. For a full copy, the node downloads all files and verifies them. For a partial mount, the node only prepares the directory structure and reads a few small pieces of metadata. The shard can then be marked as started, and searches can begin immediately.
Mount request arrives
You or a lifecycle policy asks Elasticsearch to mount a snapshot as an index, choosing a full copy or a shared cache.
Metadata is read and cluster state updated
The master reads what the snapshot contains and creates the new index entry, pinned to the right tier.
Shards are allocated
Cold or frozen nodes are chosen. Disk watermarks and tier rules decide where each shard can go.
Shards recover from the snapshot
A full mount downloads every file. A partial mount reads only small starting pieces and is ready almost at once.
Searches begin
Queries run through the normal engine, with file reads redirected to local disk, cache, or repository.
Step three: how a single read is served
When Lucene wants to read some bytes from a segment file, it asks the directory. On a fully mounted shard, the directory reads from the local copy, the same as always. On a partially mounted shard, the directory works out which cache region or regions cover the requested bytes.
If the region is already in the cache, the bytes are copied out of the local file. If not, the directory issues a ranged read against the repository, downloads that region, writes it to the cache, and returns the bytes. If several searches want the same missing region at the same moment, they share one download instead of each making their own. This coalescing is essential, because otherwise a burst of concurrent queries could flood the object store.
Small reads and the blob cache
Lucene files begin with headers and end with footers containing checksums and structure information. Opening a shard touches these small parts of many files. Fetching each one from the repository would be very slow, because each network call has a fixed delay no matter how small it is. To avoid this, Elasticsearch stores these small, hot pieces in a system index so that starting a shard does not require dozens of calls to object storage.
When you open a large physical book, you first read the cover, the table of contents, and the index at the back. The library keeps photocopies of just those few pages at the front desk, so the librarian can tell you what is in the book without walking to the warehouse.
Why access patterns matter so much
Different Lucene structures are read in different ways, and this explains why some queries are gentle on the cache and others are brutal.
Term dictionary and postings
Searching for specific words reads small, targeted ranges. The cache handles these well, especially on repeated searches.
Doc values
Sorting and aggregations read column-style data, often across huge stretches of a file. These reads are larger and fill the cache quickly.
Stored fields
Fetching the full original document reads scattered small pieces, one per hit. Asking for thousands of hits multiplies network calls.
Points and numeric ranges
Range filters on numbers and dates walk a tree structure, reading a modest number of small nodes. Usually efficient.
The cheapest query on a frozen index is one that filters tightly on time, matches few documents, and returns few hits. The most expensive is one that aggregates over every document across many shards with no filter.
Read-ahead and eviction
Because the cost of a network call is mostly fixed, reading a slightly larger region than strictly needed is often cheaper than making two small calls. This is why the cache works in regions. On eviction, the cache prefers to keep regions that have been used repeatedly. A one-time large scan should not push out the pieces that many other queries rely on, and the frequency-based approach helps limit that damage, although a very large scan can still cause churn.
7Data Flow and Lifecycle
In real life you rarely mount snapshots by hand. Index lifecycle management does it for you, following the age of the data.
The lifecycle phases
An index lifecycle policy is made of phases, each with actions. The searchable snapshot action can be placed in the cold phase (producing a fully mounted index) or in the frozen phase (producing a partially mounted one). A policy usually looks like this in words: keep the index hot while it receives writes, move it to warm after rollover, then take a snapshot and mount it in cold or frozen when it is old enough, and delete it when the retention period ends.
flowchart LR
H[Hot: writes and rollover] --> W[Warm: read mostly]
W --> C[Cold: snapshot then full mount]
C --> F[Frozen: partial mount]
F --> D[Delete index and snapshot]
What the action does behind the scenes
Optional force merge
For the searchable snapshot action, the index is normally merged down to fewer segments before the snapshot is taken. Fewer, larger segments mean fewer files, fewer network calls later, and a smaller snapshot to store. This can be turned off if it is not wanted.
Snapshot is taken
The policy takes a snapshot of that one index into the configured repository. Using one snapshot per index keeps each index’s life independent.
Snapshot is mounted
The snapshot is mounted as a new index, fully or partially depending on the phase, with the restored or partial prefix on its name.
Original index is removed
Once the mounted index is healthy, the original regular index is deleted. The mounted index takes its place, and if the original was in a data stream, the mounted one replaces it as a backing index.
Retention and cleanup
In the delete phase, the mounted index is removed and, by default, so is the snapshot behind it, provided nothing else still uses it.
Skipping tiers
There is no rule that data must pass through every tier. Many deployments go directly from hot to frozen, because a warm tier that only delays the move adds cost without adding much value. Others use hot, then cold with full mounts for a couple of months, then frozen for long-term retention. The right shape depends on how quickly your query frequency drops.
Data streams and rollover
Time-based data is best managed as a data stream, which is a set of hidden backing indices that Elasticsearch rolls over automatically by size or age. Lifecycle policies apply to each backing index separately. Only closed-out backing indices, those no longer written to, are ever converted to searchable snapshots. The write index always stays on the hot tier.
| Example plan | Hot | Cold (full mount) | Frozen (partial mount) | Delete |
|---|---|---|---|---|
| Simple logging | 0 to 7 days | Not used | 7 days to 1 year | After 1 year |
| Observability with active lookback | 0 to 3 days | 3 to 60 days | 60 days to 13 months | After 13 months |
| Regulated records | 0 to 14 days | 14 to 90 days | 90 days to 7 years | After 7 years |
These are illustrative plans only. Choose real durations from the actual questions your users ask of the data and from any legal retention duty you have.
Once data moves into a mounted index, you can no longer update or delete individual documents in it. If a legal request requires removing one person’s records, you must plan for that before the data becomes read-only. Options include removing the data earlier, reindexing to a new index without the records, or keeping sensitive fields out of long-lived indices in the first place.
8Resilience, Replicas, and Failure Modes
Changing where the master copy of the data lives changes how failures behave. This chapter walks through what breaks, what heals, and what you must protect.
Replicas mean something different here
On a regular index, a replica protects you from losing data if a node fails. On a searchable snapshot index, the data is already protected by the snapshot, so replicas are no longer about durability. They are about availability and search capacity. If you have zero replicas and a node holding a shard goes down, that shard is unavailable until it is reassigned and recovered from the snapshot. If you have one replica, another node can answer searches while the lost copy rebuilds.
A cluster with zero replicas for mounted indices can still report a healthy status, because there is nothing missing from the cluster’s point of view. Do not read that green light as a promise of zero downtime. It only means every shard has an active copy right now.
If a library keeps the master copy of every book in a fireproof vault, the copies on public shelves do not need to be duplicated for safety. But if the only shelf holding a popular book falls over, readers must wait until a new copy is brought from the vault. Extra copies on the shelves would let them keep reading during that wait.
Node failures
Node lost, no replica
Its shards are reassigned to other cold nodes and must download all their files again from the repository before they can serve searches. Recovery time depends on shard size and repository throughput.
Node lost
Its shards start elsewhere in moments, but the new node’s cache is empty. Searches will be slow at first while the cache warms.
Planned restart
Cache contents on frozen nodes may not be preserved as you expect. Plan for a warm-up period after rolling restarts.
New nodes added
Shards can move onto new nodes cheaply on the frozen tier, because moving a shard mostly means starting an empty cache elsewhere, not copying data.
Repository failures
The repository becomes a dependency of your searches, and the impact depends on the mode.
- Temporary outage, cold tier: searches on already recovered shards continue to work from local copies, but any shard that needs to recover cannot do so until the repository returns.
- Temporary outage, frozen tier: searches that hit the cache continue to work. Searches that need uncached data fail or time out for the affected shards.
- Throttling by the provider: a burst of requests may cause slow responses or errors, which shows up as partial search failures and long tail latencies.
- Permission change: an expired credential or a changed bucket policy looks exactly like an outage from Elasticsearch’s point of view.
- Data deleted or corrupted in the bucket: this is the worst case. If the snapshot’s files are removed from the repository by anything outside Elasticsearch’s control, the data is gone, because there may be no other copy.
flowchart TD
X[Something fails] --> N{What failed?}
N -->|Data node| R1[Shard reassigned and recovered from snapshot]
N -->|Repository unavailable| R2[Cached reads work, uncached reads fail]
N -->|Snapshot files lost| R3[Data lost unless a second copy exists]
R1 --> OK[Service resumes after recovery]
R2 --> OK2[Service resumes when repository returns]
Protecting the single most important copy
The lesson of this chapter is that you have moved your durability from many replicas on many disks into one logical copy in one repository. That repository deserves serious protection.
- Turn on versioning or object lock features of your object store so that accidental or malicious deletions can be reversed or blocked for a set period.
- Restrict who can write to or delete from the bucket. Only the Elasticsearch service identity and a very small group of administrators should have these rights.
- Consider replicating the bucket to a second region or account for disaster recovery, remembering that a second cluster can mount the replicated snapshots.
- Do not point unrelated tools at the same bucket path, because cleanup jobs written for other purposes may delete files they think are orphaned.
Do not delete objects from a snapshot repository by hand, and never let a storage lifecycle rule expire objects in that bucket by age. Repository contents are managed as a whole. Removing individual files corrupts snapshots even if the deletion looks harmless.
9Search Performance and Tuning
Searching a frozen index is not the same as searching a hot one. The good news is that a handful of habits make the difference between a tolerable experience and a painful one.
Set the right expectations
On a fully mounted index, a well-tuned search should feel similar to a regular index on comparable hardware, because the files are local. On a partially mounted index, the first search over a stretch of data may take seconds or even minutes for very large ranges, while later searches over the same data can be many times faster. Communicate this to the people who use the data, because surprise is the biggest source of complaints.
Narrow the time range
The single most valuable tuning is a tight time filter. Elasticsearch has a preliminary step called the can-match phase, where it asks each shard whether it could possibly contain matching documents before doing real work. For time-based indices, recent versions store the earliest and latest timestamps of each index as metadata in the cluster, so many shards outside the requested time range can be skipped without touching the repository at all.
If you want a letter you received last March, you do not ask the warehouse to bring you every box of mail from the past ten years. You tell them the month, and they fetch only that box. A time filter is the month on the label.
Use asynchronous search for slow queries
Asynchronous search lets a request be submitted and then checked later, instead of holding an open connection until it finishes. This is the right tool for long-running searches on frozen data. The person who asked can leave a browser tab open, and results appear as shards report back. Many user interfaces do this automatically for large date ranges.
Practical tuning habits
Filter before you aggregate
Add specific conditions, such as a service name or a host, so fewer documents need to be read from cold storage.
Request only the fields you need
Fetching whole documents reads stored fields for every hit. Limiting fields and hit counts reduces network calls.
Avoid large result windows
Asking for thousands of hits per shard forces many scattered reads. Page through results in smaller sets.
Use time-sorted indices wisely
When data is written in time order, and searches are for the most recent events, less data needs to be read to answer them.
Do not schedule heavy dashboards on frozen data
Auto-refreshing panels that scan the frozen tier every few seconds waste cache and repository capacity.
Force merge before snapshotting
Fewer segments create fewer files and fewer reads later. Lifecycle management does this by default for the searchable snapshot action.
Concurrency and the object store
Searches over many shards fan out across many nodes, and each node may read from the repository at once. Object stores handle high concurrency very well, but they can still throttle a single client that sends too many requests too fast. If searches on the frozen tier behave normally most of the time but suddenly stall in bursts, throttling by the storage provider is a prime suspect. Provider-side metrics, such as request counts and error rates, tell you quickly.
Warm-up and pre-population
On the frozen tier, the cache warms naturally as data is used. There is no simple switch to preload an entire index into it, and doing so would defeat the point of the tier, since the cache is much smaller than the data. If a known investigation window is coming, such as an audit period, you can run a representative search ahead of time so that later searches are faster. For data that must always respond quickly, the right answer is to keep it on the cold tier with a full mount.
If people complain that frozen searches are slow every day, either the data is not really frozen data, or the cache is too small for the working set. Both problems are solved by moving the affected data one tier warmer, not by fighting the frozen tier.
10Capacity Planning and Sizing
Sizing a searchable snapshot deployment is different from sizing a hot tier. You are planning three things at once: the repository, the local storage, and the network path between them.
Sizing the repository
Estimate how much data you will keep in each snapshot, then multiply by the number of days of retention. Remember that the size of an index on disk includes its indexing overhead, but a snapshot only stores the shard files of primaries, not replicas. This means the repository usually needs less space than your hot tier uses for the same data, which is a pleasant surprise. Compression in snapshots can reduce this further, and merging segments before the snapshot helps as well.
Object stores rarely have a size limit you will hit, but they do have request rates and cost models. Estimate the number of files, because each shard contributes many files. Millions of tiny files increase request counts and slow snapshot operations. Merging to fewer segments before snapshotting reduces file counts.
Sizing cold nodes
For a fully mounted tier, local disk must be large enough to hold a full copy of every shard assigned to it, plus room for the disk watermarks that keep the node healthy. Add replicas if you need availability, and count them as extra copies. Memory and CPU needs are modest compared with hot nodes, because these nodes do not index. But keep enough memory for the operating system’s file cache, since it is what keeps repeated searches quick.
Sizing frozen nodes
For a frozen tier, the shared cache size is what matters most. A useful way to think about it is as a “working set” question: how much of your frozen data do people actually touch during a typical week? If the cache is close to that size, most searches will hit it. If it is far smaller, the cache will churn and searches will keep going to the repository.
The amount of data one frozen node can be responsible for is much larger than what its disk could hold, because the disk is only a cache. Elastic’s own guidance uses far higher ratios of data to memory for frozen nodes than for hot nodes, but the exact figures change between versions and depend on your search patterns. Use the published sizing guidance for your version as a starting point, then measure cache hit rates and search latency in your own environment and adjust.
Shard size and count
Each shard uses some memory on the node that holds it, even when idle, for keeping structures like field information and file lists ready. A frozen node holding thousands of small shards spends much of its memory on bookkeeping and leaves less for useful work. Larger shards, in the tens of gigabytes, are usually a better fit. When you roll over hot indices, choose sizes that produce sensible shards for the long life the data will have on the cold and frozen tiers, not just for hot performance.
Network throughput
The link between your nodes and the object store is often the actual bottleneck. Recovering a full copy of a large shard is limited by how quickly the node can read from the store. On cloud platforms, the network bandwidth of a virtual machine depends on its size. A small instance may cap out well below what the object store can provide. When choosing instance types for frozen and cold tiers, look at network performance as well as disk and memory.
| Question | What to measure | What it tells you |
|---|---|---|
| Is the cache big enough? | Cache hit and miss counts, evictions | Whether the working set fits |
| Is the network fast enough? | Bytes read from the repository per second | Whether node bandwidth is a limit |
| Are there too many shards? | Shards per node, heap use | Whether memory is wasted on overhead |
| Is the object store throttling? | Provider request errors and latency | Whether request rate is too high |
| Are searches slow? | Search latency by tier and time range | Whether queries or capacity are to blame |
Frozen capacity is easy to add, because shards move cheaply. It is therefore reasonable to begin with a modest frozen tier, watch the cache statistics for a few weeks of real usage, and then scale in the direction the numbers suggest.
11Advantages, Disadvantages, and Trade-offs
Every design choice costs something. Here is an honest ledger for searchable snapshots.
Advantages
- Much lower storage cost for old data, because object storage is far cheaper than fast local disks.
- Fewer or no replicas needed for durability, which cuts local storage by half or more.
- Frozen nodes can be responsible for very large amounts of data relative to their hardware.
- Old data stays searchable with the same query language, tools, and dashboards as new data.
- Shard movement and recovery on the frozen tier are quick because little data needs to be copied.
- Long retention periods for compliance become affordable.
Disadvantages / Trade-offs
- Searches on uncached frozen data are much slower than on hot data.
- Indices are read-only, so document-level updates and deletions are not possible.
- The repository becomes a critical dependency and needs production-grade protection.
- Requires an Enterprise-level subscription, which has its own cost.
- Object storage request and data transfer fees can appear if searches are heavy or cross regions.
- More moving parts to understand and monitor than a single-tier cluster.
The economics in plain words
Imagine you keep one year of logs at about one terabyte per day, with one replica on the hot tier. That is roughly 730 terabytes of premium local disk. Now imagine you keep the first week hot, and the remaining fifty-one weeks as searchable snapshots on the frozen tier with no replicas. Most of that data now sits in object storage at a small fraction of the price per gigabyte, and a modest set of frozen nodes provides the search capability. The exact saving depends on your provider and instance choices, but the direction and rough scale of the saving is what usually convinces teams to adopt the feature.
The hidden costs are worth counting too. Request charges on the object store rise with search activity on the frozen tier. Data transfer between zones or regions can add up if the repository is not close to the nodes. The Enterprise-level subscription adds licensing cost. The savings are usually large enough to outweigh these, but a proper estimate includes them.
Comparing your options for old data
| Approach | Cost | Search speed on old data | Effort | Main risk |
|---|---|---|---|---|
| Keep everything on hot nodes | Highest | Fastest | Lowest | Cost growth without limit |
| Move to warm nodes with replicas | High | Fast | Low | Still pays for two copies |
| Cold tier, fully mounted, no replicas | Medium | Fast | Medium | Repository is now the only durable copy |
| Frozen tier, partially mounted | Lowest of the searchable options | Slower on cache misses | Medium | Poor experience if used like hot data |
| Plain snapshot only, restore on demand | Very low | Not searchable until restored | High during incidents | Delay when you urgently need old data |
| Delete after short retention | Lowest | Not available | Lowest | Lost history and compliance problems |
Where the trade-offs bite hardest
Teams are usually happy with searchable snapshots for investigations and audits. They are least happy when they try to use the frozen tier for anything interactive that runs all day, or when they forget to protect the repository. The features are well suited to data whose value comes from the possibility of asking a question, not from the certainty of asking one every hour.
12Security and Compliance
Old data is often the most sensitive data you own, because it is complete, historical, and rarely reviewed. Its protection deserves attention on two fronts: inside Elasticsearch and inside the object store.
Access inside Elasticsearch
Mounted indices are ordinary indices as far as security is concerned. Role-based access control applies in the same way: a user can only search the index names their role allows, and document-level and field-level security rules continue to work. Because lifecycle policies rename indices with a prefix, check that your role patterns cover the renamed indices, or better, give roles access to data streams and let the backing indices follow.
Actions that manage snapshots and mounting are a separate set of privileges. Only administrators and the lifecycle service should be able to create repositories, take snapshots, mount them, or delete them. Ordinary analysts should have no need for these rights.
Access to the repository
Elasticsearch reaches the object store using credentials. These are held in the secure settings store of each node, not in normal configuration files, so they are not visible in ordinary settings output. Give the identity used by Elasticsearch the minimum rights it needs on the bucket path, and no more. Where the cloud platform supports it, prefer short-lived, automatically rotated credentials or role-based identities over long-lived static keys.
Encryption
Encrypted connections
Traffic between nodes and the object store should always use encrypted connections, and this is normally the default for cloud providers.
Storage-level encryption
Use the object store’s server-side encryption, ideally with keys you control. Elasticsearch relies on the store for encryption of snapshot files.
Local disk encryption
Cold and frozen nodes hold data or cached pieces on local disks. Encrypt those volumes at the platform level.
Key lifecycle
If a key is deleted or a key policy changes, encrypted snapshot data can become unreadable. Treat key management as part of data retention planning.
Retention, immutability, and legal duties
Many regulations require that records be kept for a fixed time and cannot be altered. A searchable snapshot repository with object lock in a compliance mode can help meet this, because even administrators cannot delete or overwrite the files until the period ends. Be careful to test that this works together with Elasticsearch, since some snapshot operations legitimately write new files and update metadata inside the repository. Work with your storage and compliance teams to choose settings that protect the data without blocking normal snapshot maintenance.
On the other side, privacy laws may require you to delete a person’s data on request. This is in tension with read-only, long-lived storage. The practical answers are to keep personal information out of long-retained indices, to shorten retention for indices that contain it, or to keep a process ready to reindex affected data into a new index without the records and then remove the old snapshot.
Do not assume that a locked bucket automatically satisfies retention rules and also automatically satisfies deletion rules. They pull in opposite directions. Decide, per data type, which duty wins, and document the decision.
Shared repositories between clusters
A snapshot repository can be registered as read-only on a second cluster, which lets that cluster mount snapshots written by the first. This is powerful for reading old data from a test or analysis cluster, and for disaster recovery. It is also risky if two clusters are allowed to write to the same repository, since they can corrupt each other’s metadata. Only one cluster should ever write to a given repository path. All others must use the read-only setting.
13Monitoring, Logging, and Metrics
A searchable snapshot setup that nobody watches will eventually surprise you. These are the signals worth tracking.
Cache health on frozen nodes
Elasticsearch exposes statistics about the shared cache through dedicated statistics endpoints, one for cache activity across nodes and one for activity by index. They report how many reads were served from the cache, how many needed a fetch from the repository, how many bytes were read, and how many regions were evicted. A healthy frozen tier shows a good ratio of hits to misses for the data people actually query. A cache that shows steady heavy eviction and a high miss rate is telling you it is too small for your working set.
Repository health
Check the result of snapshot operations and the state of the repository regularly. Snapshot creation failures, repository verification failures, and long snapshot durations are early warnings. On the storage side, watch request rate, error rate, throttling responses, and latency at the provider. If your object store publishes access logs, keep them for a short period so you can investigate slow-search episodes.
Lifecycle progress
Index lifecycle management has an explain feature that tells you, for each index, which phase and action it is in and whether it is stuck. The most common stuck points for the searchable snapshot action are a repository that is missing or misconfigured, a lack of space on target nodes, and a snapshot that fails partway. Alert on indices that stay in one step for far longer than expected.
Cache hit ratio
Share of reads served from the local cache. Low values on the frozen tier mean searches are paying network costs.
Bytes read from repository
How much data crosses the network to serve searches. Spikes match expensive queries or a cold cache.
Evictions
How often cached regions are thrown out to make room. Persistently high numbers indicate an undersized cache.
Search latency by tier
Compare hot, cold, and frozen separately. One average across tiers hides the story.
Shard recovery time
How long a fully mounted shard takes to become ready. Long times point to network or repository limits.
Lifecycle step age
Time an index has spent in its current lifecycle step. Stuck steps stop the cost savings from arriving.
Logs to read when something is wrong
Node logs record repository access failures, timeouts, throttling responses, and cache problems. Master node logs record snapshot and mounting failures. Slow log settings can capture searches that take longer than a chosen time on particular indices, and are useful for spotting the few expensive queries that cause most of the pain on the frozen tier.
A simple troubleshooting path
Is the slow search really on mounted data?
Look at the index names and the tier settings. A search that touches only hot indices is not a searchable snapshot problem.
Does the search cover a huge time range?
If so, tighten the range or use asynchronous search before blaming capacity.
What does the cache show?
High misses and evictions mean the cache is too small or the query pattern is too wide.
What does the object store show?
Check for throttling, elevated latency, or permission errors.
Is the network path the limit?
Check instance network limits and whether the repository is in the same region.
14Design Patterns That Work
Teams that succeed with searchable snapshots tend to arrive at a small set of repeatable designs.
Pattern 1: Hot to frozen, nothing in between
Keep a short hot period, then mount partially for the rest of the retention. This is the simplest and often the cheapest design. It works when people rarely query anything older than a few days, except for occasional investigations.
Pattern 2: Hot, cold, frozen ladder
Use a fully mounted cold tier for the weeks or months in which investigations are still common, then a frozen tier for long-term retention. It smooths the slowdown that users feel when data ages, at the cost of one more tier to operate.
Pattern 3: Separate repositories by data class
Use different repositories, and often different buckets, for data with different retention, encryption, or access needs. Security events may need an immutable bucket, while debug logs may not. Separation also limits the blast radius if something goes wrong.
Pattern 4: Disaster recovery through a replicated bucket
Replicate the repository to a second region or account. A standby cluster registers the copy as read-only and can mount any snapshot it needs after a regional failure. This turns searchable snapshots into part of your resilience plan instead of a single point of failure.
Pattern 5: Analysis cluster for historical questions
Run a small separate cluster that mounts old snapshots read-only for research or audits. Heavy historical work then never competes with production searches, and the production cluster does not need to hold or cache that data.
Pattern 6: Right-sizing shards before they age
Choose rollover conditions so that indices end up with a healthy number of reasonably large shards by the time they are mounted. Fewer, larger shards reduce memory overhead on frozen nodes and reduce the number of repository calls per search.
flowchart LR
P[Primary cluster] -->|writes snapshots| R1[Repository in region A]
R1 -->|bucket replication| R2[Repository copy in region B]
R2 -->|read-only mount| S[Standby or analysis cluster]
15Anti-Patterns and Common Mistakes
These are the mistakes that appear again and again when teams first adopt the feature. Each one is easy to avoid once you know about it.
Problem
A team moves data to the frozen tier and then points always-on dashboards and alert rules at it, expecting hot-tier speed.
Why It’s Harmful
Every refresh triggers reads that miss the cache, which loads the repository, adds cost, and makes dashboards slow and unreliable. Users lose trust in the whole platform.
Correct Approach
Point dashboards and alerts at hot and cold data only. Give users a separate, clearly labeled way to run deliberate, long searches over frozen data, ideally asynchronously.
Problem
An administrator cleans up old objects from the snapshot bucket by hand, or adds a storage rule that expires objects after a number of days.
Why It’s Harmful
Snapshot files are shared between snapshots. Removing files outside Elasticsearch corrupts snapshots, and mounted indices that rely on them can become unreadable, with no copy left to recover from.
Correct Approach
Let index lifecycle management or snapshot lifecycle management delete snapshots through Elasticsearch. Protect the bucket with versioning and strict permissions.
Problem
The frozen tier is provisioned with too little cache because the local disk seemed unimportant, since the data is “in object storage anyway”.
Why It’s Harmful
An undersized cache thrashes. The same pieces are downloaded and evicted over and over, searches stay slow, and request charges climb.
Correct Approach
Size the cache to the working set of real searches and watch hit rates. Treat local disk on frozen nodes as performance capacity, not as archive capacity.
Problem
Mounted indices have zero replicas, and the cluster is treated as fully highly available because its status is green.
Why It’s Harmful
When a node fails, its shards are unavailable until they recover. During a large incident, searches for that time range fail or return partial results.
Correct Approach
Decide consciously. Zero replicas is fine for data where short interruptions are acceptable. For data that must remain searchable through failures, add replicas on the cold tier.
Problem
The repository is placed in a distant region, or in another cloud, because storage was cheaper there.
Why It’s Harmful
Every cache miss pays long-distance delay and often data transfer fees. The per-gigabyte saving disappears and searches feel slow.
Correct Approach
Keep the primary repository close to the nodes. Use replication to a second location only for disaster recovery.
Problem
Thousands of tiny indices, each with several shards, are converted into searchable snapshots.
Why It’s Harmful
The number of shards, files, and repository calls grows enormously. Frozen nodes spend memory on bookkeeping, snapshots take long to create, and searches fan out to far too many small pieces.
Correct Approach
Consolidate before the data ages: use sensible rollover sizes, fewer shards per index, and force merge before snapshotting.
Smaller mistakes worth avoiding
- Forgetting the license: confirm your subscription level allows the feature before you design around it.
- Mixing writers on one repository: only one cluster may write to a path. Others must be read-only.
- Ignoring version compatibility: a snapshot can only be mounted by versions that can read the indices inside it. Plan upgrades with old snapshots in mind.
- No test of the full path: run a real mount and a real search on a copy of production data before trusting the design.
- Leaving sensitive data in long-lived indices: removal requests become painful once data is read-only.
16Real-World and Industry Examples
These are common, representative ways organizations use the feature. They are patterns, not accounts of any specific company.
Security operations and threat hunting
Attackers often sit inside a network for weeks or months before being noticed. When a new threat is discovered, analysts want to search for its traces across the last year or more. Keeping that much security data on hot nodes is unaffordable, but frozen searchable snapshots make it possible to look back quickly enough to be useful. Elastic’s own security products commonly use the frozen tier for this reason.
Observability and incident review
Site reliability teams compare current behavior with historical behavior: how did latency look during last year’s peak season? Metrics and logs older than a few weeks are rarely viewed day to day, but they are invaluable in post-incident reviews and capacity planning. A cold tier for the recent past and a frozen tier for the long past matches these habits.
Financial and regulated records
Banks, insurers, and payment companies must keep transaction traces and audit logs for many years. Searchable snapshots allow them to answer regulator or dispute questions without maintaining a giant hot cluster, and object lock features on the repository help with immutability requirements.
Telecommunications and network data
Network operators produce huge volumes of event and flow records. Most of it is never read, but some must be available for lawful requests or fault analysis. Frozen storage makes the long tail affordable.
E-commerce and product analytics
Online retailers analyze clickstream and order events. Seasonal comparisons, such as this holiday season against last year’s, need older data only for short bursts of analysis. Frozen storage holds it cheaply between those bursts.
Managed platforms
On Elastic’s hosted cloud service, the frozen tier is offered as a ready-made building block. Teams that do not want to operate the repository and nodes themselves can enable it and let the platform handle much of the setup, while the same lifecycle concepts described here still apply.
flowchart TD
A[New threat announced] --> B[Analyst writes a search]
B --> C[Search targets 12 months of data]
C --> D[Hot and cold shards answer quickly]
C --> E[Frozen shards fetch from repository]
D --> F[Combined results]
E --> F
F --> G[Analyst finds first sign of attack]
17Limitations, Versions, and Best Practices
Before committing to a design, gather the fine print in one place.
Known limitations
- Mounted indices are read-only. No indexing, updates, deletions, or force merging on the mounted index itself.
- Behavior depends on the repository type and its client settings. Support and performance vary across object stores and shared file systems.
- Snapshots must be readable by the version of Elasticsearch that mounts them. Very old snapshots may need special handling when you upgrade across major versions.
- Some features that rely on changing index structure in place, such as shrinking or splitting, do not apply to mounted indices.
- Index settings that describe the mount, such as the repository and snapshot names, are not meant to be changed by hand.
- Searchable snapshots need an appropriate license level, and details can change between releases.
A best-practices checklist
| Area | Practice |
|---|---|
| Design | Decide tiers from real query patterns, not from guesses. Start with a simple hot to frozen plan and add cold only if users need it. |
| Repository | Same region as nodes, versioned, permission-restricted, and never touched by unrelated cleanup jobs. |
| Shards | Fewer and larger, merged before snapshotting, sized with the long life of the data in mind. |
| Frozen cache | Sized to the working set. Monitor hit ratio and evictions continuously. |
| Queries | Tight time ranges, selective filters, few returned hits, asynchronous search for long jobs. |
| Availability | Choose replica counts on purpose. Do not equate green status with uninterrupted service. |
| Security | Least-privilege bucket access, encryption at every layer, protected keys, documented retention and deletion rules. |
| Operations | Alert on stuck lifecycle steps, snapshot failures, repository errors, and cache health. |
| Disaster recovery | Replicate the repository and rehearse mounting from the copy. |
| Change management | Test on a copy of production data first. Recheck documentation for your exact version before upgrades. |
The most valuable single practice is to schedule a regular drill in which you mount snapshots from your backup location on a clean cluster and search them. A recovery path that has never been tested is only a hope.
18A Worked Example: Designing for 500 GB a Day
Numbers make ideas stick. Let us walk through a simple, made-up design to see how the pieces fit together. All figures are illustrative assumptions, not measurements.
The situation
A company collects about 500 gigabytes of log data per day. Assume the data takes roughly the same amount of space inside Elasticsearch as it did when it arrived. The business wants to keep one year of logs. Engineers search the last week constantly, and they investigate older data only a few times a week. Auditors sometimes ask about anything in the past twelve months.
Option A: everything hot, with one replica
One year is about 182 terabytes of primary data. With one replica, that becomes about 365 terabytes of fast local disk, plus the memory and processors to keep thousands of shards ready. This design works and is simple, but its cost grows every single day, and most of the disk is holding data that nobody reads.
Option B: hot for a week, frozen for the rest
The first seven days are about 3.5 terabytes of primary data, or about 7 terabytes with a replica, on hot nodes. The remaining 358 days of primary data, close to 179 terabytes, lives in the object store as snapshots. The frozen nodes hold a cache that is a small fraction of that total, sized to the amount of old data that investigations touch in a typical week. The local fast disk needed falls from hundreds of terabytes to a small number of terabytes plus a cache, and the bulk of the data sits at object storage prices.
Option C: hot, cold, then frozen
If engineers actually search the past month often and dislike waiting, add a cold tier for weeks two to five. Those 28 days are about 14 terabytes as a full local copy with no replicas. It costs more than Option B but keeps a comfortable experience for the most likely investigation window. The remaining eleven months stay frozen.
| Design | Fast local disk (approx.) | Object storage (approx.) | Experience on data older than a week |
|---|---|---|---|
| A: all hot, one replica | 365 TB | Only regular backups | Fast |
| B: hot then frozen | 7 TB plus frozen cache | About 179 TB | Slower on cache misses |
| C: hot, cold, frozen | 7 TB plus 14 TB plus frozen cache | About 179 TB | Fast for a month, then slower |
The point is not the exact numbers. The point is the shape: local fast disk stays small and roughly constant, while the object store grows with retention. Growth in retention is now a cheap kind of growth.
Choosing between B and C
The deciding fact is user behavior. Look at your search history and find out what share of searches touch data older than seven days, and how far back they go. If very few do, choose Option B. If a lot of searches reach back a month, Option C avoids frustrating people. If searches almost never go past a month, but the audit demand exists, Option C’s cold period might be shortened to a couple of weeks.
flowchart TD
Q1{Do many searches reach back beyond a week?} -->|No| B[Choose hot then frozen]
Q1 -->|Yes| Q2{Do they stay within about a month?}
Q2 -->|Yes| C[Add a cold tier for that window]
Q2 -->|No| D[Extend cold or add cache and replicas]
19Searchable Snapshots Compared With Other Approaches
Searchable snapshots are one of several ways to deal with aging data. Knowing the alternatives helps you choose honestly.
Restore on demand
You can keep plain snapshots and restore an index only when someone asks for it. This is the cheapest option in storage, but restoring large indices takes time, needs free disk space at the moment of need, and turns every investigation into a small project. Searchable snapshots remove that delay. The data is always searchable, and you pay only for what you use of it.
Downsampling and rollups
For metrics, another way to reduce cost is to shrink old data by keeping fewer data points, for example one per hour instead of one per minute. This removes detail permanently, but it can be combined with searchable snapshots, because the smaller data is then also cheaper to store and read. Logs and security events, which cannot be summarized without losing the very detail investigators need, are better served by keeping all the data on cheap storage.
Keeping data in an external data lake
Some teams export old data to files in a data lake and query it with other engines. This can be very cheap, but it splits your data across two systems, with different query languages, security models, and dashboards. Searchable snapshots keep a single place to ask questions. The trade-off is that a data lake may be better for very large batch analytics, while Elasticsearch is better for fast, flexible, text-heavy search.
Cross-cluster search
Cross-cluster search lets one cluster query others. It solves a different problem: spreading data across clusters. It can be combined with searchable snapshots, for instance by placing the frozen tier in a dedicated cluster and searching it remotely, which isolates heavy historical searches from production.
| Approach | Best at | Weak at |
|---|---|---|
| Searchable snapshots | Long retention with the same search experience and tools | Speed on uncached data, read-only data |
| Restore on demand | Lowest storage cost for data almost never needed | Delay and effort when it is needed |
| Downsampling | Metrics where lower resolution is acceptable | Detail is lost for good |
| Data lake export | Large batch analytics at low cost | Split tooling and slower text search |
| Bigger hot cluster | Simplicity and speed | Cost that grows with every retained day |
20An Adoption Roadmap
If you decide to introduce searchable snapshots into an existing cluster, a staged approach lowers risk and builds confidence.
Study your data and usage
Measure daily volume, index and shard counts, and how far back searches reach. Decide what you will keep, for how long, and who uses it.
Confirm licensing and versions
Check that your subscription includes the feature and that your version supports the tiers you intend to use.
Prepare the repository
Create the bucket in the right region, set permissions, encryption, and versioning, store credentials securely on the nodes, and register and verify the repository.
Add tier nodes
Bring in cold and frozen nodes with the right roles, disk, and network capacity. Start small, since frozen capacity is easy to expand.
Pilot on one data stream
Apply a lifecycle policy to a single, less critical data stream. Watch snapshot creation, mounting, searches, and cache behavior for a few weeks.
Tune and document
Adjust cache sizes, shard sizes, and phase timings. Write down what users should expect from each tier so surprises are avoided.
Roll out gradually and rehearse recovery
Extend the policy to more data streams. Run a recovery drill from the replicated repository and add monitoring and alerts before declaring the rollout complete.
Real data has surprises: unusual shard counts, unexpected query shapes, and permissions nobody thought about. A small pilot finds these when they are cheap to fix.
Communicating with users
The best technical design can still fail socially if people are not told what to expect. Explain in simple terms that recent data is instant, older data is a little slower, and the oldest data may take a moment on the first search. Provide a place to run long searches asynchronously. When people understand the reason for the difference, they adapt quickly, and they stop treating every slow search as a fault.
21Troubleshooting Scenarios
Real problems rarely announce their cause. These scenarios link common symptoms to the most likely explanations and sensible responses.
Scenario 1: Searches on old data suddenly became slower than last week
Likely causes are a cache that has filled up with a large recent scan, new nodes with empty caches after a scaling event or restart, or a change in user behavior that widened the time ranges being queried. Check cache statistics, recent node changes, and the slow log for new query shapes. Give the cache time to warm before drawing conclusions, and consider enlarging it if the pattern persists.
Scenario 2: An index stays stuck in the lifecycle step that takes the snapshot
Usual suspects are a repository that is misconfigured or unreachable, missing permissions, or an existing snapshot with a clashing name. Use the lifecycle explain feature to read the error, verify the repository from the cluster, and confirm credentials. Once the cause is fixed, the step can be retried.
Scenario 3: Mounted shards are unassigned
The nodes with the right tier role may lack enough disk space, may be over their disk watermarks, or may not exist at all. Confirm that nodes with the required role are present and have space. For fully mounted indices, remember that the node needs room for the whole shard.
Scenario 4: Storage bills are higher than expected
Look beyond the per-gigabyte price. Request charges may be high because of many small files or heavy searching of frozen data. Data transfer may be high because the repository is in a different region or zone from the nodes. Merging segments before snapshotting, moving the repository, and tightening queries usually bring the bill down.
Scenario 5: Partial results and timeouts on wide searches
Searches spanning many frozen shards may hit time limits. Shorten the time range, add filters, or run the search asynchronously. If the object store shows throttling, reduce concurrency or spread load over a longer period.
Scenario 6: Deleting old data does not free repository space
Snapshots share files, so space is released only when no remaining snapshot needs a file. Confirm that the snapshot behind the deleted index was actually removed, and that no other mounted index still depends on it. Give the repository cleanup a chance to finish before measuring.
22Upgrades, Evolution, and Where This Is Heading
Searchable snapshots did not appear fully formed. They have grown across releases, and the direction of travel is worth understanding.
Planning upgrades
Each Elasticsearch version can read indices created by its own version and by the previous major version. Mounted indices follow the same rule, because they are made of the same kind of files. In practice, this means you should upgrade in the recommended order, verify that old snapshots can still be mounted after an upgrade, and check the release notes for changes to defaults such as cache sizes and lifecycle behavior. Rehearse an upgrade on a non-production cluster that includes mounted indices.
A steady move toward object storage
The wider trend in search and analytics systems is to treat cheap, durable object storage as the foundation and local disks as a performance layer. Searchable snapshots were an early and practical step in that direction for Elasticsearch. Later architectures push the idea further, but the core concepts you have learned here, a durable copy in object storage, a cache close to compute, and read paths that fetch ranges on demand, carry over directly.
Keep documentation close
Defaults, setting names, and sizing guidance evolve. Use this guide to understand why the system behaves as it does, and use the official documentation for your exact version to confirm the specifics before making production changes.
23Glossary of Terms
A quick reference for the vocabulary used throughout this guide.
Mount
The action of making a snapshot searchable as an index without restoring it in the ordinary way.
Fully mounted
A mount that downloads every shard file to local disk. Common in the cold tier.
Partially mounted
A mount that keeps only a cache of used pieces locally. Common in the frozen tier.
Repository
The place where snapshots are stored, usually an object store bucket.
Shared cache
The large local file on a frozen node that holds recently used pieces of many shards.
Region
One equal-sized slice of the shared cache, used as the unit of downloading and eviction.
Eviction
Removing a cached region to make room for a new one when the cache is full.
Working set
The portion of the data that searches actually touch over a typical period.
Segment
An immutable file set inside a shard. The reason snapshots can be shared and reused.
Data tier
A group of nodes for data of a certain temperature: hot, warm, cold, or frozen.
Index lifecycle management
The automatic manager that moves indices through phases and applies actions such as mounting and deletion.
Asynchronous search
A search that is submitted and checked later, ideal for slow queries on frozen data.
24Frequently Asked Questions
They start the same, since both are point-in-time copies of an index stored in a repository. The difference is what you do with them. A normal snapshot is restored before it can be searched. A searchable snapshot is mounted and searched in place, with the repository acting as the real storage layer.
Yes, for anything that is not stored as a searchable snapshot, such as hot data and cluster configuration. And for the mounted data itself, you should protect the repository with bucket versioning, restricted permissions, and ideally a replicated copy, because it is now the only durable copy.
The cold tier normally holds fully mounted indices with a complete local copy of the data, so searches are fast. The frozen tier holds partially mounted indices, with only a cache of recently used pieces on local disk, so it is much cheaper but slower on data that is not cached.
Because they do not download the shard files up front. They only load a small amount of starting information and then fetch further data when a search asks for it.
No. Mounted indices are read-only, because their data belongs to an immutable snapshot. To change data, you need to work with a regular index, for example by reindexing the affected documents.
Not for durability, because the snapshot already protects the data. Replicas are useful for availability and for extra search capacity. Choose the number based on how much interruption is acceptable for that data.
The first search had to fetch data from the repository over the network and stored it in the cache. The second search found much of that data already in the cache and read it from local disk.
It helps until the cache is larger than the working set of your real searches. Beyond that point, extra cache just sits mostly unused. Measure hit rates before buying more capacity.
On the frozen tier, searches that can be answered from the cache continue, while searches that need uncached data fail or time out for the affected shards. On the cold tier, already recovered shards keep working from local disk, but shards that must recover cannot do so until the store returns.
No. Elasticsearch refuses to delete a snapshot that a mounted index still depends on. This guard protects you from removing live data by accident.
They can, but only one of them should be allowed to write to it. Every other cluster should register the repository as read-only. This arrangement is useful for analysis clusters and disaster recovery.
The older feature reduced memory use for rarely searched indices but still kept the full data on local disks. The frozen tier with searchable snapshots replaced it, since it addresses the storage cost problem as well as the memory problem.
Not in every case. Savings are largest for large volumes of rarely searched data. Heavy, frequent searching of frozen data can bring request charges, slow experiences, and the need for a larger cache, which reduce the benefit. A licensing cost also applies.
Look at your actual usage. Find the age after which most searches stop asking for the data, and move it to a cheaper tier just after that point. Review the numbers periodically, because habits change.
25Summary and Key Takeaways
A searchable snapshot lets Elasticsearch treat a snapshot in object storage as the real home of an index. Because Lucene segments never change, they can be copied to cheap storage once and then read back in pieces whenever a search needs them. Fully mounted indices bring a whole copy to local disk for fast, dependable searches on the cold tier. Partially mounted indices keep only a cache locally and fetch the rest on demand, making the frozen tier dramatically cheaper for data that is rarely searched. Index lifecycle management ties the story together by moving data through the tiers automatically. The price of these savings is slower searches on uncached data, read-only indices, and a repository that must now be protected like production storage. Used with clear expectations, careful sizing, and good monitoring, searchable snapshots let you keep years of history searchable without paying hot-tier prices for it.
Key Takeaways
- The snapshot becomes the primary copy — a mounted index reads from the repository, so local disks hold either a full working copy or just a cache.
- Two modes, two tiers — fully mounted indices suit the cold tier with fast local reads, and partially mounted indices suit the frozen tier with the lowest cost and slower cache misses.
- Immutability makes it possible — Lucene segments never change, so they can be shared, copied, and fetched in ranges safely.
- Query habits decide success — tight time filters, selective queries, few returned hits, and asynchronous search keep the frozen tier pleasant to use.
- Size the cache to the working set — frozen node disks are performance capacity, and cache hit ratio is the metric to watch.
- Protect the repository like production storage — versioning, least-privilege access, encryption, and a replicated copy guard the only durable copy of your data.
- Plan for read-only data — decide in advance how updates, corrections, and deletion requests will be handled before data becomes immutable.