@@ -229,19 +229,45 @@ works in parallel with the storage engine.)
229229
230230# Allocation
231231
232- (AllocationService runs on the master node)
233-
234- (Discuss different deciders that limit allocation. Sketch / list the different deciders that we have.)
235-
236- ### APIs for Balancing Operations
237-
238- (Significant internal APIs for balancing a cluster)
239-
240- ### Heuristics for Allocation
241-
242- ### Cluster Reroute Command
243-
244- (How does this command behave with the desired auto balancer.)
232+ ### Core Components
233+
234+ The ` DesiredBalanceShardsAllocator ` is what runs shard allocation decisions. It leverages the ` DesiredBalanceComputer ` to produce
235+ ` DesiredBalance ` instances for the cluster based on the latest cluster changes (add/remove nodes, create/remove indices, load, etc.). Then
236+ the ` DesiredBalanceReconciler ` is invoked to choose the next steps to take to move the cluster from the current shard allocation to the
237+ latest computed ` DesiredBalance ` shard allocation. The ` DesiredBalanceReconciler ` will apply changes to a copy of the ` RoutingNodes ` , which
238+ is then published in a cluster state update that will reach the data nodes to start the individual shard recovery/deletion/move work.
239+
240+ The ` DesiredBalanceReconciler ` is throttled by cluster settings, like the max number of concurrent shard moves and recoveries per cluster
241+ and node: this is why the ` DesiredBalanceReconciler ` will make, and publish via cluster state updates, incremental changes to the cluster
242+ shard allocation. The ` DesiredBalanceShardsAllocator ` is the endpoint for reroute requests, which may trigger immediate requests to the
243+ ` DesiredBalanceReconciler ` , but asynchronous requests to the ` DesiredBalanceComputer ` via the ` ContinuousComputation ` component. Cluster
244+ state changes that affect shard balancing (for example index deletion) all call some reroute method interface that reaches the
245+ ` DesiredBalanceShardsAllocator ` to run reconciliation and queue a request for the ` DesiredBalancerComputer ` , leading to desired balance
246+ computation and reconciliation actions. Asynchronous completion of a new ` DesiredBalance ` will also invoke a reconciliation action, as will
247+ cluster state updates completing shard moves/recoveries (unthrottling the next shard move/recovery).
248+
249+ The ` ContinuousComputation ` saves the latest desired balance computation request, which holds the cluster information at the time of that
250+ request, and a thread that runs the ` DesiredBalanceComputer ` . The ` ContinuousComputation ` thread takes the latest request, with the
251+ associated cluster information, feeds it into the ` DesiredBalanceComputer ` and publishes a ` DesiredBalance ` back to the
252+ ` DesiredBalanceShardsAllocator ` to use for reconciliation actions. Sometimes the ` ContinuousComputation ` thread's desired balance
253+ computation will be signalled to exit early and publish the initial ` DesiredBalance ` improvements it has made, when newer rebalancing
254+ requests (due to cluster state changes) have arrived, or in order to begin recovery of unassigned shards as quickly as possible.
255+
256+ ### Rebalancing Process
257+
258+ There are different priorities in shard allocation, reflected in which moves the ` DesiredBalancerReconciler ` selects to do first given that
259+ it can only move, recover, or remove a limited number of shards at once. The first priority is assigning unassigned shards, primaries being
260+ more important than replicas. The second is to move shards that violate any rule (such as node resource limits) as defined by an
261+ ` AllocationDecider ` . The ` AllocationDeciders ` holds a group of ` AllocationDecider ` implementations that place hard constraints on shard
262+ allocation. There is a decider, ` DiskThresholdDecider ` , that manages disk memory usage thresholds, such that further shards may not be
263+ allowed assignment to a node, or shards may be required to move off because they grew to exceed the disk space; or another,
264+ ` FilterAllocationDecider ` , that excludes a configurable list of indices from certain nodes; or ` MaxRetryAllocationDecider ` that will not
265+ attempt to recover a shard on a certain node after so many failed retries. The third priority is to rebalance shards to even out the
266+ relative weight of shards on each node: the intention is to avoid, or ease, future hot-spotting on data nodes due to too many shards being
267+ placed on the same data node. Node shard weight is based on a sum of factors: disk memory usage, projected shard write load, total number
268+ of shards, and an incentive to distribute shards within the same index across different nodes. See the ` WeightFunction ` and
269+ ` NodeAllocationStatsAndWeightsCalculator ` classes for more details on the weight calculations that support the ` DesiredBalanceComputer `
270+ decisions.
245271
246272# Autoscaling
247273
0 commit comments