Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inquiry about the definition of "a movement" for max.migrated.leader.number constraint #1670

Closed
garyparrot opened this issue Apr 24, 2023 · 2 comments · Fixed by #1672
Closed

Comments

@garyparrot
Copy link
Collaborator

garyparrot commented Apr 24, 2023

各位大大好🙇

我想詢問關於 max.migrated.leader.number 這個限制的定義,文件內是說 "設定最大可搬移的leader 數量",我對文字的理解是,如果一個 Leader Replica 原本在 Broker A,然後他被換到 Broker B,那麼這個是 "1個移動",然後移動的數量不能超過該參數的設定值。

我嘗試實作一段程式碼去測試 ReplicaLeaderCost 的實作行為

  @Test
  void testLeaderCount() {
    var baseCluster = ClusterInfoBuilder.builder()
        .addNode(Set.of(1, 2))
        .addFolders(Map.of(1, Set.of("/folder")))
        .addFolders(Map.of(2, Set.of("/folder")))
        .build();
    var sourceCluster = ClusterInfoBuilder.builder(baseCluster)
        .addTopic("topic1", 3, (short) 1, r -> Replica.builder(r).nodeInfo(baseCluster.node(1)).build())
        .addTopic("topic2", 3, (short) 1, r -> Replica.builder(r).nodeInfo(baseCluster.node(2)).build())
        .build();
    var targetCluster = ClusterInfoBuilder.builder(baseCluster)
        .addTopic("topic1", 3, (short) 1, r -> Replica.builder(r).nodeInfo(baseCluster.node(2)).build())
        .addTopic("topic2", 3, (short) 1, r -> Replica.builder(r).nodeInfo(baseCluster.node(1)).build())
        .build();

    MoveCost moveCost = new ReplicaLeaderCost(Configuration.of(Map.of(
        ReplicaLeaderCost.MAX_MIGRATE_LEADER_KEY, "1"
    ))).moveCost(sourceCluster, targetCluster, ClusterBean.EMPTY);

    System.out.println(moveCost.overflow());
  }

上面這段程式碼建立兩個 ClusterInfo,有兩個節點,每個節點各自負責 3 個 leader。

  • sourceCluster 中節點1 負責 A,B,C leader,而節點2 負責 D,E,F leader
  • targetCluster 中節點1 負責 D,E,F leader,而節點2 負責 A,B,C leader
  • 兩者的差異基本上是底下的 leader replica 全部交換到另外一個節點

建立 ReplicaLeaderCost,設定限制只能夠發生一次 leader 的搬移,輸出這個他的 movecost 有沒有被違反

如果依照我前面對 “搬移的理解",這個情境每個 leader replica 都被移動到別的節點,總共發生了 6 個 leader 的搬移。但程式碼的輸出表示沒有任何搬移被發生 (migration < 1)。

參考程式碼的細部實作,ReplicaLeaderCost 的 MoveCost 好像是在避免每個節點的 leader 數量變化,比如如果有一個節點有 30 個 leader replica,則在套用限制 5 個移動的情況下,該節點的 leader replica 數量要控制在 5 之間。拿上面的程式碼範例,這個過程移出了 3 個 leader replica 然後移入 3 個 leader replica,整體數量變化是 0,所以沒有 MoveCost 發生。

我的感覺是 ReplicaLeaderCost 的 MoveCost 是在拘限 leader 轉移帶給叢集的影響(leadership change 帶來的延遲?),使用 leader 原本在 broker A 被轉移到 broker B 好像比較能反映這個影響。我怕我漏看了什麼條件,所以想詢問現行的 ReplicaLeaderCost MoveCost 實作的目的是要避免哪種搬移帶來的影響?

@garyparrot garyparrot changed the title Inquiry about the definition of "a movement" formax.migrated.leader.number constraint Inquiry about the definition of "a movement" for max.migrated.leader.number constraint Apr 24, 2023
@chia7712
Copy link
Contributor

參考程式碼的細部實作,ReplicaLeaderCost 的 MoveCost 好像是在避免每個節點的 leader 數量變化,比如如果有一個節點有 30 個 leader replica,則在套用限制 5 個移動的情況下,該節點的 leader replica 數量變化要控制在 (25, 35) 之間。拿上面的程式碼範例,這個過程移出了 3 個 leader replica 然後移入 3 個 leader replica,所以沒有 MoveCost 發生。

我覺得應該就是 bug

限制搬移 leader 的目的就跟你說的一樣,要避免大幅度的連線重新建立(下游影響),所以是要計算「有多少leader被搬移」,而不是「節點身上的leader變化量」

@qoo332001 有機會看一下嗎?

@qoo332001
Copy link
Collaborator

現在這支的邏輯是看分佈的差異沒錯,我會開支PR類似 #1584 (計算搬移資料量)的改法,將Leader的搬移數量分別計算leader移入與leader移出,這樣計算移動的leader數量就不會錯了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants