Scaling a cluster correctly: horizontal scaling by adding nodes, shard allocation strategies, the ideal 10–50 GB shard size, the hot-warm-cold architecture, when to scale up vs scale out, and SSD vs HDD storage considerations.

Your data grows, search traffic rises, and one day a single node can't keep up. The question isn't whether to scale, but how to scale without downtime and without making performance worse. Scaling Elasticsearch isn't just adding machines — there's an art to managing shards, tiers, and allocation.
Episode 18 covers cluster scaling: horizontal scaling by adding nodes, shard allocation strategies, the ideal 10–50 GB shard size, the hot-warm-cold architecture (from episode 10), when to choose scale up vs scale out, and SSD vs HDD storage considerations.
Elasticsearch is designed for scale out: adding a node adds CPU, RAM, and disk in parallel, without changing the application. When a new node joins, Elasticsearch automatically balances existing shards onto the new node.
GET /_cat/nodes?vWatch the heap.percent, ram.percent, and cpu columns — after adding a node, make sure the load is spread evenly. If one node remains a hot spot, there's likely a shard distribution problem (or a routing hot spot).
Tip
Adding a node doesn't always make the cluster faster — and can make it slower if searches must reach more nodes for the same shard. Searches run the query against all shards; adding nodes speeds things up if the bottleneck is CPU/memory, but adds latency if there are too many shards for too little data.
Shard allocation is managed by the Elasticsearch allocator, with rules you can control. Some important settings:
| Setting | Function |
|---|---|
cluster.routing.allocation.enable | Enable/disable allocation (useful during maintenance) |
cluster.routing.allocation.total_shards_per_node | Shard limit per node to prevent overload |
cluster.routing.allocation.awareness.attributes | Zone-aware allocation (e.g. availability zones) |
cluster.routing.allocation.disk.watermark | Disk thresholds: low (85%), high (90%), flood (95%) |
PUT /_cluster/settings{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "80%",
"cluster.routing.allocation.disk.watermark.high": "85%",
"cluster.routing.allocation.disk.watermark.flood_stage": "90%"
}
}Disk watermark is very important: when a node's disk hits the flood_stage threshold, Elasticsearch rejects write operations on indexes in that node to prevent the disk from filling completely. This is a safety you should respect, not fight.
The rule of thumb you must remember: a single shard should be 10–50 GB, with a comfortable target of around 20–30 GB. Why:
A simple calculation: if total data is 200 GB at 50 GB per shard, you need 4 primary shards. For 10 million documents per day over 30 days, size the estimate with an initial snapshot — don't guess.
GET /_cat/shards?v&h=index,prirep,store,docs&s=store:descThe most common beginner mistake: creating 20 shards for 2 GB of data, or 2 shards for 500 GB. Both hurt later — remember, the number of primary shards can't be changed without a reindex.
From episode 10 we know tiers differentiate storage costs. In this episode we practice dividing nodes by tier:
# node hot (node1)
node.roles: [data_hot, data_content]
node.attr.data_tier: hot
# node warm (node2)
node.roles: [data_warm]
node.attr.data_tier: warm
# node cold (node3)
node.roles: [data_cold]
node.attr.data_tier: coldWith nodes segregated per tier and an ILM policy (episode 10) moving indexes between tiers, hardware can be bought per need: fast SSD for hot, cheap HDD for cold. This is a cost-efficient form of scaling without increasing total data.
Scale up (enlarging one node) and scale out (adding nodes) aren't competing — each has its place:
| Condition | Choose |
|---|---|
| Shard too large and can't be split (single shard) | Scale up the node owning the shard |
| CPU/memory bottleneck on many nodes | Scale out with new nodes |
| Data grows, shards still healthy in size | Scale out |
| Need more storage for one small index | Scale up |
The main hot node is a hot spot | Scale out hot nodes |
The practical ceiling of scale up: the 32 GB heap maximum (episode 14), so beyond that point the only path is scale out. The best strategy combines both: scale up for per-node needs, scale out for total capacity.
Storage is the decision that affects performance the most. Rules of thumb:
One important truth: a full disk is far more dangerous than a slow disk. A full disk makes shards read-only and stops writes. Monitor disk seriously (episode 21) before performance becomes a problem.
Warning
Watch the sizing before adding nodes: don't add a node with specs far below the others — a weak node becomes a bottleneck and makes rebalancing uneven. Homogenize specs within a tier, and add in multiples that make shard distribution even.
Too many shards for too little data. Communication overhead rises — calculate from 10–50 GB per shard.
Adding nodes just "to be faster". If the bottleneck isn't CPU/memory, a new node doesn't help — measure first (episode 21).
All nodes in one tier. No storage savings — apply hot-warm-cold based on data age.
Ignoring disk watermark. Writes silently stop at flood — monitor disk and set alerts.
Automatic rebalancing during critical operations. Temporarily disable allocation during big maintenance: cluster.routing.allocation.enable: none.
In episode 18 you mastered cluster scaling: horizontal scaling by adding nodes with automatic rebalancing, shard allocation strategies with disk watermark, the ideal 10–50 GB shard size, the hot-warm-cold architecture with per-tier nodes, scale up vs scale out decisions, and SSD vs HDD choices.
Key takeaways:
The cluster is big now — how do we make it fast and resource-efficient? In episode 19 we'll cover performance optimization and tuning: bulk indexing, refresh interval, translog, index sorting; search optimization with caching, filters, routing; and JVM G1GC tuning, disk I/O, and thread pools. See you there!