| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | [[index-modules-allocation]]== Index Shard Allocation[float][[shard-allocation-filtering]]=== Shard Allocation FilteringAllows to control the allocation of indices on nodes based on include/excludefilters. The filters can be set both on the index level and on thecluster level. Lets start with an example of setting it on the clusterlevel:Lets say we have 4 nodes, each has specific attribute called `tag`associated with it (the name of the attribute can be any name). Eachnode has a specific value associated with `tag`. Node 1 has a setting`node.tag: value1`, Node 2 a setting of `node.tag: value2`, and so on.We can create an index that will only deploy on nodes that have `tag`set to `value1` and `value2` by setting`index.routing.allocation.include.tag` to `value1,value2`. For example:[source,js]--------------------------------------------------curl -XPUT localhost:9200/test/_settings -d '{    "index.routing.allocation.include.tag" : "value1,value2"}'--------------------------------------------------On the other hand, we can create an index that will be deployed on allnodes except for nodes with a `tag` of value `value3` by setting`index.routing.allocation.exclude.tag` to `value3`. For example:[source,js]--------------------------------------------------curl -XPUT localhost:9200/test/_settings -d '{    "index.routing.allocation.exclude.tag" : "value3"}'--------------------------------------------------`index.routing.allocation.require.*` can be used tospecify a number of rules, all of which MUST match in order for a shardto be allocated to a node. This is in contrast to `include` which willinclude a node if ANY rule matches.The `include`, `exclude` and `require` values can have generic simplematching wildcards, for example, `value1*`. Additonally, special attributenames called `_ip`, `_name`, `_id` and `_host` can be used to match by nodeip address, name, id or host name, respectively.Obviously a node can have several attributes associated with it, andboth the attribute name and value are controlled in the setting. Forexample, here is a sample of several node configurations:[source,js]--------------------------------------------------node.group1: group1_value1node.group2: group2_value4--------------------------------------------------In the same manner, `include`, `exclude` and `require` can work againstseveral attributes, for example:[source,js]--------------------------------------------------curl -XPUT localhost:9200/test/_settings -d '{    "index.routing.allocation.include.group1" : "xxx"    "index.routing.allocation.include.group2" : "yyy",    "index.routing.allocation.exclude.group3" : "zzz",    "index.routing.allocation.require.group4" : "aaa",}'--------------------------------------------------The provided settings can also be updated in real time using the updatesettings API, allowing to "move" indices (shards) around in realtime.Cluster wide filtering can also be defined, and be updated in real timeusing the cluster update settings API. This setting can come in handyfor things like decommissioning nodes (even if the replica count is setto 0). Here is a sample of how to decommission a node based on `_ip`address:[source,js]--------------------------------------------------curl -XPUT localhost:9200/_cluster/settings -d '{    "transient" : {        "cluster.routing.allocation.exclude._ip" : "10.0.0.1"    }}'--------------------------------------------------[float]=== Total Shards Per NodeThe `index.routing.allocation.total_shards_per_node` setting allows tocontrol how many total shards (replicas and primaries) for an index will be allocated per node.It can be dynamically set on a live index using the update indexsettings API.[float][[disk]]=== Disk-based Shard Allocationdisk based shard allocation is enabled from version 1.3.0 onwardElasticsearch can be configured to prevent shardallocation on nodes depending on disk usage for the node. Thisfunctionality is enabled by default, and can be changed either in theconfiguration file, or dynamically using:[source,js]--------------------------------------------------curl -XPUT localhost:9200/_cluster/settings -d '{    "transient" : {        "cluster.routing.allocation.disk.threshold_enabled" : false    }}'--------------------------------------------------Once enabled, Elasticsearch uses two watermarks to decide whethershards should be allocated or can remain on the node.`cluster.routing.allocation.disk.watermark.low` controls the lowwatermark for disk usage. It defaults to 85%, meaning ES will notallocate new shards to nodes once they have more than 85% diskused. It can also be set to an absolute byte value (like 500mb) toprevent ES from allocating shards if less than the configured amountof space is available.`cluster.routing.allocation.disk.watermark.high` controls the highwatermark. It defaults to 90%, meaning ES will attempt to relocateshards to another node if the node disk usage rises above 90%. It canalso be set to an absolute byte value (similar to the low watermark)to relocate shards once less than the configured amount of space isavailable on the node.Both watermark settings can be changed dynamically using the clustersettings API. By default, Elasticsearch will retrieve informationabout the disk usage of the nodes every 30 seconds. This can also bechanged by setting the `cluster.info.update.interval` setting.By default, Elasticsearch will take into account shards that are currently beingrelocated to the target node when computing a node's disk usage. This can bechanged by setting the `cluster.routing.allocation.disk.include_relocations`setting to `false` (defaults to `true`). Taking relocating shards' sizes intoaccount may, however, mean that the disk usage for a node is incorrectlyestimated on the high side, since the relocation could be 90% complete and arecently retrieved disk usage would include the total size of the relocatingshard as well as the space already used by the running relocation.
 |