mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-07 21:48:39 +00:00
This adds a new `/_cluster/allocation/explain` API that explains why a shard can or cannot be allocated to nodes in the cluster. Additionally, it will show where the master *desires* to put the shard, according to the `ShardsAllocator`. It looks like this: ``` GET /_cluster/allocation/explain?pretty { "index": "only-foo", "shard": 0, "primary": false } ``` Though, you can optionally send an empty body, which means "explain the allocation for the first unassigned shard you find". The output when a shard is unassigned looks like this: ``` { "shard" : { "index" : "only-foo", "index_uuid" : "KnW0-zELRs6PK84l0r38ZA", "id" : 0, "primary" : false }, "assigned" : false, "unassigned_info" : { "reason" : "INDEX_CREATED", "at" : "2016-03-22T20:04:23.620Z" }, "nodes" : { "V-Spi0AyRZ6ZvKbaI3691w" : { "node_name" : "Susan Storm", "node_attributes" : { "bar" : "baz" }, "final_decision" : "NO", "weight" : 0.06666675, "decisions" : [ { "decider" : "filter", "decision" : "NO", "explanation" : "node does not match index include filters [foo:\"bar\"]" } ] }, "Qc6VL8c5RWaw1qXZ0Rg57g" : { "node_name" : "Slipstream", "node_attributes" : { "bar" : "baz", "foo" : "bar" }, "final_decision" : "NO", "weight" : -1.3833332, "decisions" : [ { "decider" : "same_shard", "decision" : "NO", "explanation" : "the shard cannot be allocated on the same node id [Qc6VL8c5RWaw1qXZ0Rg57g] on which it already exists" } ] }, "PzdyMZGXQdGhqTJHF_hGgA" : { "node_name" : "The Symbiote", "node_attributes" : { }, "final_decision" : "NO", "weight" : 2.3166666, "decisions" : [ { "decider" : "filter", "decision" : "NO", "explanation" : "node does not match index include filters [foo:\"bar\"]" } ] } } } ``` And when the shard *is* assigned, the output looks like: ``` { "shard" : { "index" : "only-foo", "index_uuid" : "KnW0-zELRs6PK84l0r38ZA", "id" : 0, "primary" : true }, "assigned" : true, "assigned_node_id" : "Qc6VL8c5RWaw1qXZ0Rg57g", "nodes" : { "V-Spi0AyRZ6ZvKbaI3691w" : { "node_name" : "Susan Storm", "node_attributes" : { "bar" : "baz" }, "final_decision" : "NO", "weight" : 1.4499999, "decisions" : [ { "decider" : "filter", "decision" : "NO", "explanation" : "node does not match index include filters [foo:\"bar\"]" } ] }, "Qc6VL8c5RWaw1qXZ0Rg57g" : { "node_name" : "Slipstream", "node_attributes" : { "bar" : "baz", "foo" : "bar" }, "final_decision" : "CURRENTLY_ASSIGNED", "weight" : 0.0, "decisions" : [ { "decider" : "same_shard", "decision" : "NO", "explanation" : "the shard cannot be allocated on the same node id [Qc6VL8c5RWaw1qXZ0Rg57g] on which it already exists" } ] }, "PzdyMZGXQdGhqTJHF_hGgA" : { "node_name" : "The Symbiote", "node_attributes" : { }, "final_decision" : "NO", "weight" : 3.6999998, "decisions" : [ { "decider" : "filter", "decision" : "NO", "explanation" : "node does not match index include filters [foo:\"bar\"]" } ] } } } ``` Only "NO" decisions are returned by default, but all decisions can be shown by specifying the `?include_yes_decisions=true` parameter in the request. Resolves #14593
160 lines
5.1 KiB
Plaintext
160 lines
5.1 KiB
Plaintext
[[cluster-allocation-explain]]
|
|
== Cluster Allocation Explain API
|
|
|
|
The cluster allocation explanation API is designed to assist in answering the
|
|
question "why is this shard unassigned?". To explain the allocation (on
|
|
unassigned state) of a shard, issue a request like:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
$ curl -XGET 'http://localhost:9200/_cluster/allocation/explain' -d'{
|
|
"index": "myindex",
|
|
"shard": 0,
|
|
"primary": false
|
|
}'
|
|
--------------------------------------------------
|
|
|
|
Specify the `index` and `shard` id of the shard you would like an explanation
|
|
for, as well as the `primary` flag to indicate whether to explain a primary or
|
|
replica shard.
|
|
|
|
The response looks like:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
{
|
|
"shard" : {
|
|
"index" : "myindex",
|
|
"index_uuid" : "KnW0-zELRs6PK84l0r38ZA",
|
|
"id" : 0,
|
|
"primary" : false
|
|
},
|
|
"assigned" : false, <1>
|
|
"unassigned_info" : {
|
|
"reason" : "INDEX_CREATED", <2>
|
|
"at" : "2016-03-22T20:04:23.620Z"
|
|
},
|
|
"nodes" : { <3>
|
|
"V-Spi0AyRZ6ZvKbaI3691w" : {
|
|
"node_name" : "node1",
|
|
"node_attributes" : { <4>
|
|
"bar" : "baz"
|
|
},
|
|
"final_decision" : "NO", <5>
|
|
"weight" : 0.06666675, <6>
|
|
"decisions" : [ { <7>
|
|
"decider" : "filter",
|
|
"decision" : "NO",
|
|
"explanation" : "node does not match index include filters [foo:\"bar\"]"
|
|
} ]
|
|
},
|
|
"Qc6VL8c5RWaw1qXZ0Rg57g" : {
|
|
"node_name" : "node2",
|
|
"node_attributes" : {
|
|
"bar" : "baz",
|
|
"foo" : "bar"
|
|
},
|
|
"final_decision" : "NO",
|
|
"weight" : -1.3833332,
|
|
"decisions" : [ {
|
|
"decider" : "same_shard",
|
|
"decision" : "NO",
|
|
"explanation" : "the shard cannot be allocated on the same node id [Qc6VL8c5RWaw1qXZ0Rg57g] on which it already exists"
|
|
} ]
|
|
},
|
|
"PzdyMZGXQdGhqTJHF_hGgA" : {
|
|
"node_name" : "node3",
|
|
"node_attributes" : { },
|
|
"final_decision" : "NO",
|
|
"weight" : 2.3166666,
|
|
"decisions" : [ {
|
|
"decider" : "filter",
|
|
"decision" : "NO",
|
|
"explanation" : "node does not match index include filters [foo:\"bar\"]"
|
|
} ]
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
<1> Whether the shard is assigned or unassigned
|
|
<2> Reason for the shard originally becoming unassigned
|
|
<3> List of node decisions about the shard
|
|
<4> User-added attributes the node has
|
|
<5> Final decision for whether the shard is allowed to be allocated to this node
|
|
<6> Weight for how much the allocator would like to allocate the shard to this node
|
|
<7> List of decisions factoring into final decision
|
|
|
|
For a shard that is already assigned, the output looks similar to:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
{
|
|
"shard" : {
|
|
"index" : "only-foo",
|
|
"index_uuid" : "KnW0-zELRs6PK84l0r38ZA",
|
|
"id" : 0,
|
|
"primary" : true
|
|
},
|
|
"assigned" : true,
|
|
"assigned_node_id" : "Qc6VL8c5RWaw1qXZ0Rg57g", <1>
|
|
"nodes" : {
|
|
"V-Spi0AyRZ6ZvKbaI3691w" : {
|
|
"node_name" : "Susan Storm",
|
|
"node_attributes" : {
|
|
"bar" : "baz"
|
|
},
|
|
"final_decision" : "NO",
|
|
"weight" : 1.4499999,
|
|
"decisions" : [ {
|
|
"decider" : "filter",
|
|
"decision" : "NO",
|
|
"explanation" : "node does not match index include filters [foo:\"bar\"]"
|
|
} ]
|
|
},
|
|
"Qc6VL8c5RWaw1qXZ0Rg57g" : {
|
|
"node_name" : "Slipstream",
|
|
"node_attributes" : {
|
|
"bar" : "baz",
|
|
"foo" : "bar"
|
|
},
|
|
"final_decision" : "CURRENTLY_ASSIGNED", <2>
|
|
"weight" : 0.0,
|
|
"decisions" : [ {
|
|
"decider" : "same_shard",
|
|
"decision" : "NO",
|
|
"explanation" : "the shard cannot be allocated on the same node id [Qc6VL8c5RWaw1qXZ0Rg57g] on which it already exists"
|
|
} ]
|
|
},
|
|
"PzdyMZGXQdGhqTJHF_hGgA" : {
|
|
"node_name" : "The Symbiote",
|
|
"node_attributes" : { },
|
|
"final_decision" : "NO",
|
|
"weight" : 3.6999998,
|
|
"decisions" : [ {
|
|
"decider" : "filter",
|
|
"decision" : "NO",
|
|
"explanation" : "node does not match index include filters [foo:\"bar\"]"
|
|
} ]
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
<1> Node the shard is currently assigned to
|
|
<2> The decision is "CURRENTLY_ASSIGNED" because the shard is currently assigned to this node
|
|
|
|
You can also have Elasticsearch explain the allocation of the first unassigned
|
|
shard it finds by sending an empty body, such as:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
$ curl -XGET 'http://localhost:9200/_cluster/allocation/explain'
|
|
--------------------------------------------------
|
|
|
|
And if you would like to include all decisions that were factored into the final
|
|
decision, the `include_yes_decisions` parameter will return all decisions:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
$ curl -XGET 'http://localhost:9200/_cluster/allocation/explain?include_yes_decisions=true'
|
|
--------------------------------------------------
|