2018-12-10 17:54:23 +00:00
---
layout: "docs"
page_title: "spread Stanza - Job Specification"
sidebar_current: "docs-job-specification-spread"
description: |-
2019-01-10 21:46:03 +00:00
The "spread" stanza is used to spread placements across a certain node attributes such as datacenter.
2019-12-11 14:59:26 +00:00
Spread may be specified at the job or group levels for ultimate flexibility.
2018-12-10 17:54:23 +00:00
More than one spread stanza may be specified with relative weights between each.
---
# `spread` Stanza
< table class = "table table-bordered table-striped" >
< tr >
< th width = "120" > Placement< / th >
< td >
< code > job -> **spread** </ code >
< br >
< code > job -> group -> **spread** </ code >
< / td >
< / tr >
< / table >
2019-01-28 22:59:55 +00:00
The `spread` stanza allows operators to increase the failure tolerance of their
applications by specifying a node attribute that allocations should be spread
over. This allows operators to spread allocations over attributes such as
datacenter, availability zone, or even rack in a physical datacenter. By
default, when using spread the scheduler will attempt to place allocations
equally among the available values of the given target.
2018-12-10 17:54:23 +00:00
2019-01-24 20:58:26 +00:00
```hcl
job "docs" {
# Spread allocations over all datacenter
spread {
attribute = "${node.datacenter}"
}
group "example" {
# Spread allocations over each rack based on desired percentage
spread {
2019-03-26 20:01:56 +00:00
attribute = "${meta.rack}"
target "r1" {
2019-01-24 20:58:26 +00:00
percent = 60
}
2019-03-26 20:01:56 +00:00
target "r2" {
2019-01-24 20:58:26 +00:00
percent = 40
}
}
}
}
```
2019-01-10 21:46:03 +00:00
Nodes are scored according to how closely they match the desired target percentage defined in the
2018-12-10 17:54:23 +00:00
spread stanza. Spread scores are combined with other scoring factors such as bin packing.
A job or task group can have more than one spread criteria, with weights to express relative preference.
2019-01-10 21:46:03 +00:00
Spread criteria are treated as a soft preference by the Nomad scheduler.
If no nodes match a given spread criteria, placement is still successful.
Spread may be expressed on [attributes][interpolation] or [client metadata][client-meta].
2019-12-11 14:59:26 +00:00
Additionally, spread may be specified at the [job][job] and [group][group] levels for ultimate flexibility. Job level spread criteria are inherited by all task groups in the job.
2019-01-10 21:46:03 +00:00
2018-12-10 17:54:23 +00:00
## `spread` Parameters
- `attribute` `(string: "")` - Specifies the name or reference of the attribute
to use. This can be any of the [Nomad interpolated
values](/docs/runtime/interpolation.html#interpreted_node_vars).
- `target` < code > ([target](#target-parameters): < required > )</ code > - Specifies one or more target
percentages for each value of the `attribute` in the spread stanza. If this is omitted,
Nomad will spread allocations evenly across all values of the attribute.
- `weight` `(integer:0)` - Specifies a weight for the spread stanza. The weight is used
2019-01-10 21:46:03 +00:00
during scoring and must be an integer between 0 to 100. Weights can be used
2018-12-10 17:54:23 +00:00
when there is more than one spread or affinity stanza to express relative preference across them.
## `target` Parameters
- `value` `(string:"")` - Specifies a target value of the attribute from a `spread` stanza.
- `percent` `(integer:0)` - Specifies the percentage associated with the target value.
## `spread` Examples
The following examples show different ways to use the `spread` stanza.
### Even Spread Across Data Center
2019-01-10 21:46:03 +00:00
This example shows a spread stanza across the node's `datacenter` attribute. If we have
two datacenters `us-east1` and `us-west1` , and a task group of `count = 10` ,
Nomad will attempt to place 5 allocations in each datacenter.
2018-12-10 17:54:23 +00:00
```hcl
spread {
attribute = "${node.datacenter}"
weight = 100
}
```
### Spread With Target Percentages
2019-01-10 21:46:03 +00:00
This example shows a spread stanza that specifies one target percentage. If we
2019-03-26 20:01:56 +00:00
have three datacenters `us-east1` , `us-east2` , and `us-west1` , and a task group
of `count = 10` , Nomad will attempt to place place 5 of the allocations in "us-east1",
and will spread the remaining among the other two datacenters.
2019-01-10 21:46:03 +00:00
```hcl
spread {
attribute = "${node.datacenter}"
weight = 100
target "us-east1" {
percent = 50
}
}
```
2018-12-10 17:54:23 +00:00
This example shows a spread stanza that specifies target percentages for two
2019-01-10 21:46:03 +00:00
different datacenters. If we have two datacenters `us-east1` and `us-west1` ,
and a task group of `count = 10` , Nomad will attempt to place 6 allocations
in `us-east1` and 4 in `us-west1` .
2018-12-10 17:54:23 +00:00
```hcl
spread {
attribute = "${node.datacenter}"
weight = 100
2019-01-10 21:46:03 +00:00
2018-12-10 17:54:23 +00:00
target "us-east1" {
percent = 60
}
2019-01-10 21:46:03 +00:00
2018-12-10 17:54:23 +00:00
target "us-west1" {
percent = 40
}
}
```
### Spread Across Multiple Attributes
2019-01-10 21:46:03 +00:00
This example shows spread stanzas with multiple attributes. Consider a Nomad cluster
where there are two datacenters `us-east1` and `us-west1` , and each datacenter has nodes
2019-03-26 20:01:56 +00:00
with `${meta.rack}` being `r1` or `r2` . With the following spread stanza used on a job with `count=12` , Nomad
2019-01-10 21:46:03 +00:00
will attempt to place 6 allocations in each datacenter. Within a datacenter, Nomad will
attempt to place 3 allocations in nodes on rack `r1` , and 3 allocations in nodes on rack `r2` .
2018-12-10 17:54:23 +00:00
```hcl
spread {
attribute = "${node.datacenter}"
weight = 50
}
spread {
attribute = "${meta.rack}"
weight = 50
}
```
[job]: /docs/job-specification/job.html "Nomad job Job Specification"
[group]: /docs/job-specification/group.html "Nomad group Job Specification"
[client-meta]: /docs/configuration/client.html#meta "Nomad meta Job Specification"
[task]: /docs/job-specification/task.html "Nomad task Job Specification"
[interpolation]: /docs/runtime/interpolation.html "Nomad interpolation"
[node-variables]: /docs/runtime/interpolation.html#node-variables- "Nomad interpolation-Node variables"
2019-01-28 22:59:55 +00:00
[constraint]: /docs/job-specification/constraint.html "Nomad Constraint job Specification"