[[index-modules-allocation]]
== Index Shard Allocation

This module provides per-index settings to control the allocation of shards to
nodes.

[float]
[[shard-allocation-filtering]]
=== Shard Allocation Filtering

Shard allocation filtering allows you to specify which nodes are allowed
to host the shards of a particular index.

NOTE: The per-index shard allocation filters explained below work in
conjunction with the cluster-wide allocation filters explained in
<<shards-allocation>>.

It is possible to assign arbitrary metadata attributes to each node at
startup.  For instance, nodes could be assigned a `rack` and a `group`
attribute as follows:

[source,sh]
------------------------
bin/elasticsearch --node.rack rack1 --node.size big  <1>
------------------------
<1> These attribute settings can also be specfied in the `elasticsearch.yml` config file.

These metadata attributes can be used with the
`index.routing.allocation.*` settings to allocate an index to a particular
group of nodes.  For instance, we can move the index `test` to either `big` or
`medium` nodes as follows:

[source,json]
------------------------
PUT test/_settings
{
  "index.routing.allocation.include.size": "big,medium"
}
------------------------
// AUTOSENSE

Alternatively, we can move the index `test` away from the `small` nodes with
an `exclude` rule:

[source,json]
------------------------
PUT test/_settings
{
  "index.routing.allocation.exclude.size": "small"
}
------------------------
// AUTOSENSE

Multiple rules can be specified, in which case all conditions must be
satisfied.  For instance, we could move the index `test` to `big` nodes in
`rack1` with the following:

[source,json]
------------------------
PUT test/_settings
{
  "index.routing.allocation.include.size": "big",
  "index.routing.allocation.include.rack": "rack1"
}
------------------------
// AUTOSENSE

NOTE: If some conditions cannot be satisfied then shards will not be moved.

The following settings are _dynamic_, allowing live indices to be moved from
one set of nodes to another:

`index.routing.allocation.include.{attribute}`::

    Assign the index to a node whose `{attribute}` has at least one of the
    comma-separated values.

`index.routing.allocation.require.{attribute}`::

    Assign the index to a node whose `{attribute}` has _all_ of the
    comma-separated values.

`index.routing.allocation.exclude.{attribute}`::

    Assign the index to a node whose `{attribute}` has _none_ of the
    comma-separated values.

These special attributes are also supported:

[horizontal]
`_name`::   Match nodes by node name
`_ip`::     Match nodes by IP address (the IP address associated with the hostname)
`_host`::   Match nodes by hostname

All attribute values can be specified with wildcards, eg:

[source,json]
------------------------
PUT test/_settings
{
  "index.routing.allocation.include._ip": "192.168.2.*"
}
------------------------
// AUTOSENSE

[float]
=== Total Shards Per Node

The cluster-level shard allocator tries to spread the shards of a single index
across as many nodes as possible.  However, depending on how many shards and
indices you have, and how big they are, it may not always be possible to spread
shards evenly.

The following _dynamic_ setting allows you to specify a hard limit on the total
number of shards from a single index allowed per node:

`index.routing.allocation.total_shards_per_node`::

    The maximum number of shards (replicas and primaries) that will be
    allocated to a single node.  Defaults to unbounded.

[WARNING]
=======================================
This setting imposes a hard limit which can result in some shards not
being allocated.

Use with caution.
=======================================