Add distrib. arch. guide intro and autoscaling basics (#107284)
This commit is contained in:
parent
437acfaed1
commit
33009d443b
|
@ -1,6 +1,14 @@
|
|||
# Distributed Area Team Internals
|
||||
# Distributed Area Internals
|
||||
|
||||
(Summary, brief discussion of our features)
|
||||
The Distributed Area contains indexing and coordination systems.
|
||||
|
||||
The index path stretches from the user REST command through shard routing down to each individual shard's translog and storage
|
||||
engine. Reindexing is effectively reading from a source index and writing to a destination index (perhaps on different nodes).
|
||||
The coordination side includes cluster coordination, shard allocation, cluster autoscaling stats, task management, and cross
|
||||
cluster replication. Less obvious coordination systems include networking, the discovery plugin system, the snapshot/restore
|
||||
logic, and shard recovery.
|
||||
|
||||
A guide to the general Elasticsearch components can be found [here](https://github.com/elastic/elasticsearch/blob/main/docs/internal/GeneralArchitectureGuide.md).
|
||||
|
||||
# Networking
|
||||
|
||||
|
@ -237,9 +245,101 @@ works in parallel with the storage engine.)
|
|||
|
||||
# Autoscaling
|
||||
|
||||
(Reactive and proactive autoscaling. Explain that we surface recommendations, how control plane uses it.)
|
||||
The Autoscaling API in ES (Elasticsearch) uses cluster and node level statistics to provide a recommendation
|
||||
for a cluster size to support the current cluster data and active workloads. ES Autoscaling is paired
|
||||
with an ES Cloud service that periodically polls the ES elected master node for suggested cluster
|
||||
changes. The cloud service will add more resources to the cluster based on Elasticsearch's recommendation.
|
||||
Elasticsearch by itself cannot automatically scale.
|
||||
|
||||
(Sketch / list the different deciders that we have, and then also how we use information from each to make a recommendation.)
|
||||
Autoscaling recommendations are tailored for the user [based on user defined policies][], composed of data
|
||||
roles (hot, frozen, etc) and [deciders][]. There's a public [webinar on autoscaling][], as well as the
|
||||
public [Autoscaling APIs] docs.
|
||||
|
||||
Autoscaling's current implementation is based primary on storage requirements, as well as memory capacity
|
||||
for ML and frozen tier. It does not yet support scaling related to search load. Paired with ES Cloud,
|
||||
autoscaling only scales upward, not downward, except for ML nodes that do get scaled up _and_ down.
|
||||
|
||||
[based on user defined policies]: https://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-autoscaling.html
|
||||
[deciders]: https://www.elastic.co/guide/en/elasticsearch/reference/current/autoscaling-deciders.html
|
||||
[webinar on autoscaling]: https://www.elastic.co/webinars/autoscaling-from-zero-to-production-seamlessly
|
||||
[Autoscaling APIs]: https://www.elastic.co/guide/en/elasticsearch/reference/current/autoscaling-apis.html
|
||||
|
||||
### Plugin REST and TransportAction entrypoints
|
||||
|
||||
Autoscaling is a [plugin][]. All the REST APIs can be found in [autoscaling/rest/][].
|
||||
`GetAutoscalingCapacityAction` is the capacity calculation operation REST endpoint, as opposed to the
|
||||
other rest commands that get/set/delete the policies guiding the capacity calculation. The Transport
|
||||
Actions can be found in [autoscaling/action/], where [TransportGetAutoscalingCapacityAction][] is the
|
||||
entrypoint on the master node for calculating the optimal cluster resources based on the autoscaling
|
||||
policies.
|
||||
|
||||
[plugin]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/Autoscaling.java#L72
|
||||
[autoscaling/rest/]: https://github.com/elastic/elasticsearch/tree/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/rest
|
||||
[autoscaling/action/]: https://github.com/elastic/elasticsearch/tree/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/action
|
||||
[TransportGetAutoscalingCapacityAction]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/action/TransportGetAutoscalingCapacityAction.java#L82-L98
|
||||
|
||||
### How cluster capacity is determined
|
||||
|
||||
[AutoscalingMetadata][] implements [Metadata.Custom][] in order to persist autoscaling policies. Each
|
||||
Decider is an implementation of [AutoscalingDeciderService][]. The [AutoscalingCalculateCapacityService][]
|
||||
is responsible for running the calculation.
|
||||
|
||||
[TransportGetAutoscalingCapacityAction.computeCapacity] is the entry point to [AutoscalingCalculateCapacityService.calculate],
|
||||
which creates a [AutoscalingDeciderResults][] for [each autoscaling policy][]. [AutoscalingDeciderResults.toXContent][] then
|
||||
determines the [maximum required capacity][] to return to the caller. [AutoscalingCapacity][] is the base unit of a cluster
|
||||
resources recommendation.
|
||||
|
||||
The `TransportGetAutoscalingCapacityAction` response is cached to prevent concurrent callers
|
||||
overloading the system: the operation is expensive. `TransportGetAutoscalingCapacityAction` contains
|
||||
a [CapacityResponseCache][]. `TransportGetAutoscalingCapacityAction.masterOperation`
|
||||
calls [through the CapacityResponseCache][], into the `AutoscalingCalculateCapacityService`, to handle
|
||||
concurrent callers.
|
||||
|
||||
[AutoscalingMetadata]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/AutoscalingMetadata.java#L38
|
||||
[Metadata.Custom]: https://github.com/elastic/elasticsearch/blob/v8.13.2/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java#L141-L145
|
||||
[AutoscalingDeciderService]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/capacity/AutoscalingDeciderService.java#L16-L19
|
||||
[AutoscalingCalculateCapacityService]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/capacity/AutoscalingCalculateCapacityService.java#L43
|
||||
|
||||
[TransportGetAutoscalingCapacityAction.computeCapacity]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/action/TransportGetAutoscalingCapacityAction.java#L102-L108
|
||||
[AutoscalingCalculateCapacityService.calculate]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/capacity/AutoscalingCalculateCapacityService.java#L108-L139
|
||||
[AutoscalingDeciderResults]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/capacity/AutoscalingDeciderResults.java#L34-L38
|
||||
[each autoscaling policy]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/capacity/AutoscalingCalculateCapacityService.java#L124-L131
|
||||
[AutoscalingDeciderResults.toXContent]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/capacity/AutoscalingDeciderResults.java#L78
|
||||
[maximum required capacity]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/capacity/AutoscalingDeciderResults.java#L105-L116
|
||||
[AutoscalingCapacity]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/capacity/AutoscalingCapacity.java#L27-L35
|
||||
|
||||
[CapacityResponseCache]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/action/TransportGetAutoscalingCapacityAction.java#L44-L47
|
||||
[through the CapacityResponseCache]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/action/TransportGetAutoscalingCapacityAction.java#L97
|
||||
|
||||
### Where the data comes from
|
||||
|
||||
The Deciders each pull data from different sources as needed to inform their decisions. The
|
||||
[DiskThresholdMonitor][] is one such data source. The Monitor runs on the master node and maintains
|
||||
lists of nodes that exceed various disk size thresholds. [DiskThresholdSettings][] contains the
|
||||
threshold settings with which the `DiskThresholdMonitor` runs.
|
||||
|
||||
[DiskThresholdMonitor]: https://github.com/elastic/elasticsearch/blob/v8.13.2/server/src/main/java/org/elasticsearch/cluster/routing/allocation/DiskThresholdMonitor.java#L53-L58
|
||||
[DiskThresholdSettings]: https://github.com/elastic/elasticsearch/blob/v8.13.2/server/src/main/java/org/elasticsearch/cluster/routing/allocation/DiskThresholdSettings.java#L24-L27
|
||||
|
||||
### Deciders
|
||||
|
||||
The `ReactiveStorageDeciderService` tracks information that demonstrates storage limitations are causing
|
||||
problems in the cluster. It uses [an algorithm defined here][]. Some examples are
|
||||
- information from the `DiskThresholdMonitor` to find out whether nodes are exceeding their storage capacity
|
||||
- number of unassigned shards that failed allocation because of insufficient storage
|
||||
- the max shard size and minimum node size, and whether these can be satisfied with the existing infrastructure
|
||||
|
||||
[an algorithm defined here]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/ReactiveStorageDeciderService.java#L158-L176
|
||||
|
||||
The `ProactiveStorageDeciderService` maintains a forecast window that [defaults to 30 minutes][]. It only
|
||||
runs on data streams (ILM, rollover, etc), not regular indexes. It looks at past [index changes][] that
|
||||
took place within the forecast window to [predict][] resources that will be needed shortly.
|
||||
|
||||
[defaults to 30 minutes]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/ProactiveStorageDeciderService.java#L32
|
||||
[index changes]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/ProactiveStorageDeciderService.java#L79-L83
|
||||
[predict]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/ProactiveStorageDeciderService.java#L85-L95
|
||||
|
||||
There are several more Decider Services, implementing the `AutoscalingDeciderService` interface.
|
||||
|
||||
# Snapshot / Restore
|
||||
|
||||
|
|
Loading…
Reference in New Issue