Troubleshooting: Checking and Interpreting Elasticsearch Cluster Health Status
Elasticsearch is a robust, distributed search and analytics engine, but its distributed nature requires constant monitoring to ensure data integrity and high availability. The first, and most crucial, step in administration is checking the cluster health status. A healthy status ensures that all primary and replica data segments (shards) are correctly assigned to nodes and operational.
This guide provides a practical approach to checking cluster health using the essential _cat/health API. We will detail how to interpret the color-coded statuses (Green, Yellow, Red) and provide actionable steps to diagnose and resolve common instability issues, helping administrators quickly restore optimal cluster performance.
Understanding the Elasticsearch Health Status
Elasticsearch uses a simple, color-coded traffic light system to communicate the operational status of the cluster's indices and shards. This status reflects the assignment state of both primary and replica shards.
The Three Core Health States
| Status | Meaning | Data Availability | Redundancy | Action Required |
|---|---|---|---|---|
| Green | All primary and replica shards are assigned and operational. | 100% Available | Full | Monitoring Only |
| Yellow | All primary shards are assigned, but one or more replica shards are unassigned. | 100% Available | Compromised | Investigate/Resolve Replica Assignment |
| Red | One or more primary shards are unassigned. | Partial or Total Data Loss/Unavailability | Severely Compromised | Immediate Intervention |
Checking Cluster Health with _cat/health
The _cat APIs are designed for quick, human-readable diagnostics. The _cat/health endpoint is the fastest way to get an overview of the cluster’s current state.
Basic Command
You can execute this command using cURL, the Kibana Dev Tools console, or any HTTP client.
# Using cURL (Human readable format)
curl -X GET "localhost:9200/_cat/health?v&pretty"
Interpreting the _cat/health Output
A successful query returns a table with key metrics:
| Column | Description |
|---|---|
epoch |
The time (Unix timestamp) the request was executed. |
timestamp |
The time in HH:MM:SS format. |
cluster |
The name of the cluster. |
status |
The crucial color indicator (Green, Yellow, or Red). |
node.total |
Total number of nodes currently joined to the cluster. |
node.data |
Number of data nodes in the cluster. |
shards |
Total number of shards (primary + replica) that should be active. |
pri |
Total number of primary shards. |
relo |
Number of shards currently relocating between nodes. |
init |
Number of shards currently initializing. |
unassign |
Number of shards that are currently unassigned. |
Example of a Healthy (Green) Cluster:
epoch timestamp cluster status node.total node.data shards pri relo init unassign
1678886400 10:30:00 my-cluster-dev green 3 3 30 15 0 0 0
Diagnosing Status: Yellow
When a cluster reports a Yellow status, it means that while all your data is technically available (all primary shards are assigned), the defined redundancy level is not being met. One or more replica shards could not be allocated.
Common Causes of Yellow Status
- Node Loss (Temporary): A data node hosting replica shards went offline. Elasticsearch is waiting for that node to return or for a new node to join before it attempts re-allocation.
- Insufficient Nodes: If you require 2 replicas (3 copies of the data total) but only have 2 data nodes, the third copy cannot be placed, leading to a permanent Yellow status until another node is added.
- Delayed Allocation: The cluster is configured to delay replica allocation after a node failure to prevent immediate, costly rebalancing if the node returns quickly.
- Disk Space Constraints: Nodes may have insufficient disk space to host the replica shards.
Actionable Steps for Yellow Status
-
Check for Unassigned Shards: Use the
_cat/shardsAPI to identify exactly which shards are unassigned (u) and why they are waiting.bash curl -X GET "localhost:9200/_cat/shards?v" -
Use Allocation Explain API: For detailed diagnostics on why a specific shard is unassigned, use the Allocation Explain API. Replace
index_nameandshard_idbelow with the actual values found via_cat/shards.bash curl -X GET "localhost:9200/_cluster/allocation/explain?pretty" -H 'Content-Type: application/json' -d' { "index": "index_name", "shard": 0, "primary": false } 'Look specifically at the
unassigned_infoanddecisionsfields for reasons likeCLUSTER_REBALANCE_ALLOCATION_DELAYorNO_VALID_TARGET_NODE. -
Verify Node Count and Configuration: Ensure the number of data nodes meets or exceeds the required number of replicas plus one (N replicas + 1 primary).
Tip: If the cluster is Yellow due to a known, short-term maintenance on a node, you can often ignore it temporarily, but be aware that you are running without redundancy.
Diagnosing Status: Red
A Red status is critical and signifies that one or more primary shards are unassigned. This means the data stored in that shard is completely unavailable for indexing or searching.
Common Causes of Red Status
- Massive Node Failure: A primary node failed, and no other nodes could successfully take over the primary role because the data was corrupted or entirely unavailable across the remaining cluster.
- Disk Corruption/Failure: The storage device containing the primary shard failed, and no replica exists to promote.
- Index Settings Issues: Misconfiguration or incorrect deletion of index files at the file system level.
Immediate Intervention for Red Status
Always back up your cluster (via snapshots) before attempting manual recovery actions when the cluster is Red.
-
Check Logs Immediately: Review the logs of the master node and the node(s) hosting the failed primary shard to identify the exact exception or crash reason (often related to disk failure or out-of-memory errors).
-
Identify the Failed Index: Use
_cat/shardsto find the index associated with the unassigned primary (p).```bash
Look for rows where state is 'UNASSIGNED' and primary is 'p'
curl -X GET "localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason"
``` -
Attempt Force Reroute (Dangerous - Use as Last Resort): If you are certain that the data exists on one of the nodes (e.g., a node came back up but the routing hasn't corrected), you might try a manual reroute. This is often used when a primary shard is permanently lost and you decide to discard the lost data and force a new, empty primary onto a healthy node.
```bash
CAUTION: This command can lead to data loss if used incorrectly.
It assigns an empty primary shard to a node, marking the index healthy.
curl -X POST "localhost:9200/_cluster/reroute?pretty" -H 'Content-Type: application/json' -d'
{
"commands" : [
{
"allocate_empty_primary" : {
"index" : "failed_index_name",
"shard" : 0,
"node" : "target_node_name",
"accept_data_loss" : true
}
}
]
}
'
``` -
Restore from Snapshot: If the failed primary shard cannot be recovered, the only safe way to restore data integrity is by restoring the affected index from the most recent successful snapshot.
Advanced Diagnostics: Cluster Settings
Sometimes, the cluster status is Red or Yellow due to administrative actions or pre-configured operational safeguards.
Checking Cluster Routing Allocation
The _cluster/settings API allows you to check if automatic allocation of shards has been explicitly disabled, which would prevent the cluster from healing itself.
# Retrieve current cluster settings
curl -X GET "localhost:9200/_cluster/settings?include_defaults=true&pretty"
Look specifically for the following setting:
{
"persistent": {
"cluster": {
"routing": {
"allocation": {
"enable": "none"
}
}
}
}
}
If cluster.routing.allocation.enable is set to none (or primaries), Elasticsearch will not allocate shards, locking the cluster in its current state (likely Yellow or Red).
Re-enabling Allocation
To restore normal shard allocation, update the setting to all:
curl -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}
'
Conclusion
Interpreting the Elasticsearch cluster health status is the fundamental skill for any administrator. The _cat/health API provides immediate insight into the operational integrity of your data. While a Green status is the goal, understanding that Yellow means reduced redundancy and Red means unavailable data allows for precise, immediate troubleshooting using secondary tools like _cat/shards and the Allocation Explain API. Regular monitoring and proactive snapshotting remain the best defenses against critical cluster failure.