proposal of divide replicas by static weight evenly
Signed-off-by: chaosi-zju <chaosi@zju.edu.cn>
This commit is contained in:
parent
1b2c6edfba
commit
68656bfbe9
|
@ -0,0 +1,212 @@
|
|||
---
|
||||
title: divide replicas by static weight evenly
|
||||
authors:
|
||||
- "@chaosi-zju"
|
||||
reviewers:
|
||||
- "@RainbowMango"
|
||||
- "@XiShanYongYe-Chang"
|
||||
- "@zhzhuang-zju"
|
||||
approvers:
|
||||
- "@RainbowMango"
|
||||
|
||||
creation-date: 2023-11-11
|
||||
---
|
||||
|
||||
# Divide replicas by static weight evenly
|
||||
|
||||
## Summary
|
||||
|
||||
Karmada supports specifying the number of replicas to be allocated to each member cluster in a static weight ratio,
|
||||
e.g., the user specifies that the total replicas of a Deployment is 5,
|
||||
and the requirement is to distribute them into two clusters, member1 and member2, with a static weight of 1:1.
|
||||
|
||||
According to the current implementation, the result must be 3 replicas for member1 and 2 replicas for member2.
|
||||
(5 is an odd number, so it can't be divided equally, and member1 allocates one more).
|
||||
|
||||
This is because for clusters with equal weights, the remainder prefers the cluster with the smaller dictionary order of cluster names
|
||||
in current implementation (the remainder is the number of replicas left over if the total replicas is not exactly divided by the static weights).
|
||||
|
||||
If there are many such Deployments, the total replicas of member1 cluster will be significantly higher than that of member2 cluster,
|
||||
i.e., a potential problem of uneven replicas distribution.
|
||||
|
||||
Therefore, in order to solve the uneven replicas allocation problem without affecting the scheduling inertia,
|
||||
I propose to optimize the sorting of clusters when allocating the remainder as:
|
||||
|
||||
* Sort the clusters first by weights
|
||||
* If the weights are equal, then the clusters are sorted according to the current number of replicas
|
||||
(more current number of replicas implies that the remainders of the last scheduling were randomized to such clusters,
|
||||
and in order to keep the inertia in this scheduling, such clusters should also be prioritized).
|
||||
* If the weights are equal and the current number of replicas is equal too, then the clusters will be randomized.
|
||||
|
||||
|
||||
## Motivation
|
||||
|
||||
### Problem Summary
|
||||
|
||||
The essence of above case is that the "total replicas" is not divisible by the "sum weights", and a remainder is generated.
|
||||
|
||||
The remainder is preferred allocating to clusters with higher dictionary order of cluster name when they have equal weights,
|
||||
which caused unevenness of replicas distribution.
|
||||
|
||||
Therefore, Karmada needs to do:
|
||||
|
||||
* The remainder should be assigned to clusters having equal weights with equal probability
|
||||
* Scheduler rescheduling should ensure inertia of the scheduling result
|
||||
|
||||
### Current realization
|
||||
|
||||
#### Example
|
||||
```
|
||||
sum replicas = 7,clusters = [member1, member2, member3],weight = 2 : 1 : 1
|
||||
```
|
||||
|
||||
#### Calculation Formula
|
||||
|
||||
```console
|
||||
each cluster allocations = (total replicas * each cluster weight) / sum weights
|
||||
|
||||
remainders = total replicas - sum (each cluster allocations)
|
||||
```
|
||||
|
||||
#### Detail Steps
|
||||
|
||||
* Calculate cluster allocations and remainders:
|
||||
|
||||
```
|
||||
member1 = 7 * 2 / 4 = 3
|
||||
member2 = 7 * 1 / 4 = 1
|
||||
member3 = 7 * 1 / 4 = 1
|
||||
|
||||
so, remainders = 2
|
||||
```
|
||||
|
||||
* Sort clusters: first by weight, then by dictionary order of cluster name (member1 > member2 > member3)
|
||||
* Assign the remainders to the sorted clusters one by one (one for member1 and another for member2)
|
||||
* Eventually: member1 = 4、member2 = 2、member3 = 1
|
||||
|
||||
### Expected goals
|
||||
|
||||
As in the above example, since member2 and member3 have equal weights, when assigning the remainder, it must be assigned to member2 first,
|
||||
which is not expected
|
||||
|
||||
We expect that it will be assigned to member2 and member3 with equal probability.
|
||||
|
||||
|
||||
## Proposal
|
||||
|
||||
Since the unevenness of the current implementation is caused by sorting the clusters in dictionary order,
|
||||
the simplest way is changing it to directly randomize the ordering when the weights are equal.
|
||||
|
||||
However, it requires consideration of scheduling inertia, avoiding biased rescheduling results due to the introduction of randomization.
|
||||
|
||||
Therefore, to solve the problem of uneven replicas allocation, I propose to optimize the ordering of clusters when allocating remainders as:
|
||||
|
||||
1. Sort the clusters first by weights
|
||||
2. If the weights are equal, then the clusters are sorted according to the current number of replicas
|
||||
(more current number of replicas implies that the remainders of the last scheduling were randomized to such clusters,
|
||||
and in order to keep the inertia in this scheduling, such clusters should also be prioritized).
|
||||
3. If the weights are equal and the current number of replicas is equal too, then the clusters will be randomized.
|
||||
|
||||
|
||||
### User Stories
|
||||
|
||||
#### Story 1:expanded replicas scenario
|
||||
|
||||
In expanding replicas scenario, we expect directly increasing replicas in several clusters,
|
||||
avoiding different results calculated when rescheduling due to randomness, which leads to some clusters increasing replicas, while others reducing replica.
|
||||
|
||||
Yet this proposal can avoid this problem:
|
||||
|
||||
```
|
||||
sum replicas = 7,clusters = [member1, member2, member3, member4],weight = 2 : 1 : 1 : 1
|
||||
|
||||
1、Calculation:【each cluster allocations】= 2、1、1、1,【remainders】= 2 // 7*2/5=2、7*1/5=1
|
||||
2、Sorting:member1 > member2 = member3 = member4
|
||||
3、One possible result:3、2、1、1
|
||||
|
||||
Supposing sum replicas change from 7 to 8
|
||||
|
||||
1、Calculation:【each cluster allocations】= 3、1、1、1,【remainders】= 2 // 8*2/5=3、8*1/5=1
|
||||
2、Sorting:member1 > member2 > member3 = member4 // member2 has more current replicas than member3 / member4
|
||||
3、Result:4、2、1、1 (results ensured inertia)
|
||||
```
|
||||
|
||||
#### Story 2:reduced replicas scenario
|
||||
|
||||
In reducing replicas scenario, we expect directly reducing replicas in several clusters,
|
||||
avoiding different results calculated when rescheduling due to randomness, which leads to some clusters increasing replicas, while others reducing replica.
|
||||
|
||||
Yet this proposal can avoid this problem:
|
||||
|
||||
```
|
||||
sum replicas = 9,clusters = [member1, member2, member3, member4],weight = 2 : 1 : 1 : 1
|
||||
|
||||
1、Calculation:【each cluster allocations】= 3、1、1、1,【remainders】= 3 // 9*2/5=3、9*1/5=1
|
||||
2、Sorting:member1 > member2 = member3 = member4
|
||||
3、One possible result:4、2、2、1
|
||||
|
||||
Supposing sum replicas change from 9 to 8
|
||||
|
||||
1、Calculation:【each cluster allocations】= 3、1、1、1,【remainders】= 2 // 8*2/5=3、8*1/5=1
|
||||
2、Sorting:member1 > member2 = member3 > member4 // member2 and member3 has more current replicas than member4
|
||||
3、Result:4、2、1、1 or 4、1、2、1 (results ensured inertia)
|
||||
|
||||
```
|
||||
|
||||
#### Story 3:modifying Weight Scenarios
|
||||
|
||||
Modifying the weight scenario generally involves increasing or decreasing each cluster replicas, rescheduling can be directly recalculated.
|
||||
|
||||
However, assuming that the weights are adjusted and the sum replicas is also adjusted, it is important to ensure inertia as much as possible.
|
||||
|
||||
```
|
||||
sum replicas = 6,clusters = [member1, member2, member3, member4],weight = 1 : 1 : 1 : 1
|
||||
|
||||
1、Calculation:【each cluster allocations】= 1、1、1、1,【remainders】= 2 // 6*1/4=1
|
||||
2、Sorting:member1 = member2 = member3 = member4
|
||||
3、One possible result:2、1、2、1
|
||||
|
||||
1)Supposing weight change to 2 : 1 : 1 : 1
|
||||
|
||||
1、Calculation:【each cluster allocations】= 2、1、1、1,【remainders】= 1 // 6*2/5=2、6*1/5=1
|
||||
2、Sorting:member1 > member3 > member2 = member4 // member3 has more current replicas than member2 / member4
|
||||
3、Result:3 : 1 : 1 : 1 (Minimal adjustments based on weights)
|
||||
|
||||
2)Supposing weight change to 2 : 1 : 1 : 1, and sum replicas change to 7
|
||||
|
||||
1、Calculation:【each cluster allocations】= 2、1、1、1,【remainders】= 2 // 7*2/5=2、7*1/5=1
|
||||
2、Sorting:member1 > member3 > member2 = member4 // member3 has more current replicas than member2 / member4
|
||||
3、Result:3 : 1 : 2 : 1 (results ensured inertia)
|
||||
```
|
||||
|
||||
#### Story 4:expanded clusters scenario
|
||||
|
||||
```
|
||||
sum replicas = 5,clusters = [member1, member2, member3],weight = 1 : 1 : 1
|
||||
|
||||
1、Calculation:【each cluster allocations】= 1、1、1,【remainders】= 2 // 5*1/3=1
|
||||
2、Sorting:member1 = member2 = member3
|
||||
3、One possible result:2、1、2
|
||||
|
||||
Supposing after clusters expanded,clusters = [member1, member2, member3, member4],weight = 1 : 1 : 1 : 1
|
||||
|
||||
1、Calculation:【each cluster allocations】= 1、1、1、1,【remainders】= 1 // 5*1/4=1
|
||||
2、Sorting:member1 = member3 > member2 > member4
|
||||
3、Result:1、1、2、1 or 2、1、1、1 (equivalent to move one replica from member1/member3 to member4, others keep unchanged)
|
||||
```
|
||||
|
||||
#### Story 5:reduced clusters scenario
|
||||
|
||||
```
|
||||
sum replicas = 5,clusters = [member1, member2, member3, member4],weight = 1 : 1 : 1 : 1
|
||||
|
||||
1、Calculation:【each cluster allocations】= 1、1、1、1,【remainders】= 1 // 5*1/4=1
|
||||
2、Sorting:member1 = member2 = member3 = member4
|
||||
3、One possible result:2、1、1、1
|
||||
|
||||
Supposing after clusters reduced,clusters = [member1, member2, member3],weight = 1 : 1 : 1
|
||||
|
||||
1、Calculation:【each cluster allocations】= 1、1、1,【remainders】= 2 // 5*1/3=1
|
||||
2、Sorting:member1 > member2 = member3
|
||||
3、Result:2、2、1 or 2、1、2 (equivalent to move one replica from member4 to member1/member3, others keep unchanged)
|
||||
```
|
Loading…
Reference in New Issue