Total number of shards per node has been reached
Elasticsearch takes advantage of all available resources by distributing data (index shards) among the cluster nodes.
You can influence the data distribution by configuring the cluster.routing.allocation.total_shards_per_node dynamic cluster setting to restrict the number of shards that can be hosted on a single node in the cluster.
In earlier Elasticsearch versions, cluster.routing.allocation.total_shards_per_node is set to 1000. Reaching that limit causes the following error: Total number of shards per node has been reached and requires adjusting this setting or reducing the number of shards. In Elasticsearch 9.x, this setting is not configured by default, which means there is no upper bound on the number of shards per node unless the setting is explicitly defined.
Various configurations limiting how many shards can be hosted on a single node can lead to shards being unassigned, because the cluster does not have enough nodes to satisfy the configuration. To ensure that each node carries a reasonable shard load, you might need to resize your deployment.
Follow these steps to resolve this issue:
- Check and adjust the cluster shard limit to determine the current value and increase it if needed.
- Determine which data tier needs more capacity to identify the tier where shards need to be allocated.
- Resize your deployment to add capacity and accommodate additional shards.
The cluster.routing.allocation.total_shards_per_node setting controls the maximum number of shards that can be allocated to each node in a cluster. When this limit is reached, Elasticsearch cannot assign new shards to that node, leading to unassigned shards in your cluster.
By checking the current value and increasing it, you allow more shards to be collocated on each node, which might resolve the allocation issue without adding more capacity to your cluster.
You can run the following steps using either API console or direct Elasticsearch API calls.
Use the get cluster-wide settings API to inspect the current value of cluster.routing.allocation.total_shards_per_node:
GET /_cluster/settings?flat_settings
The response looks like this:
{
"persistent": {
"cluster.routing.allocation.total_shards_per_node": "300"
},
"transient": {}
}
- Represents the current configured value for the total number of shards that can reside on one node in the cluster. If the value is null or absent, no explicit limit is configured.
Use the update the cluster settings API to increase the value to a higher number that accommodates your workload:
PUT _cluster/settings
{
"persistent" : {
"cluster.routing.allocation.total_shards_per_node" : 400
}
}
- The new value for the system-wide
total_shards_per_nodeconfiguration is increased from the previous value of300to400. Thetotal_shards_per_nodeconfiguration can also be set tonull, which represents no upper bound with regards to how many shards can be collocated on one node in the system.
If increasing the cluster shard limit alone doesn't resolve the issue, or if you want to distribute shards more evenly, you need to identify which data tier requires additional capacity.
Use the get index settings API to retrieve the configured value for the index.routing.allocation.include._tier_preference setting:
GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings
The response looks like this:
{
"my-index-000001": {
"settings": {
"index.routing.allocation.include._tier_preference": "data_warm,data_hot"
}
}
}
- Represents a comma-separated list of data tier node roles this index is allowed to be allocated on. The first tier in the list has the highest priority and is the tier the index is targeting. In this example, the tier preference is
data_warm,data_hot, so the index is targeting thewarmtier. If the warm tier lacks capacity, the index will fall back to thedata_hottier.
After you've identified the tier that needs more capacity, you can resize your deployment to distribute the shard load and allow previously unassigned shards to be allocated.
To enable a new tier in your Elastic Cloud Hosted deployment, you edit the deployment topology to add a new data tier.
- In Kibana, open your deployment’s navigation menu (placed under the Elastic logo in the upper left corner) and go to Manage this deployment.
- From the right hand side, click to expand the Manage dropdown button and select Edit deployment from the list of options.
- On the Edit page, click on + Add Capacity for the tier you identified you need to enable in your deployment. Choose the desired size and availability zones for the new tier.
- Navigate to the bottom of the page and click the Save button.
Add more nodes to your Elasticsearch cluster and assign the index’s target tier node role to the new nodes, by adjusting the configuration in elasticsearch.yml.
Add more nodes to your Elasticsearch cluster and assign the index’s target tier node role to the new nodes, by adjusting the node configuration in the spec section of your Elasticsearch resource manifest.
AutoOps is a monitoring tool that simplifies cluster management through performance recommendations, resource utilization visibility, and real-time issue detection with resolution paths. Learn more about AutoOps.