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

[COST] Fix NetworkCost raises an exception when some brokers have no replica #1499

Merged
merged 3 commits into from
Feb 18, 2023

Conversation

garyparrot
Copy link
Collaborator

修正兩個 NetworkCost 的 bug

  • NetworkCost 的統計結果中沒有考慮到沒有 replica 的 broker,導致後面統計時會忽略完全空負載的節點。
  • NetworkCost 的 MetricSensor,針對沒有 replica 的 broker 不會撈回任何 metrics,導致 NetworkCost#noMetricCheck 認為還沒有至少一個階段的 metrics 被完全索取而拒絕計算。修正方法為現在刻意撈取 JmxMemory,這個 metric 在沒有 replica 的 broker 上也能撈得到。

@garyparrot garyparrot self-assigned this Feb 16, 2023
@garyparrot garyparrot changed the title [COST] Fix bugs in NetworkCost [COST] Fix NetworkCost raise exception when some broker has no replica Feb 16, 2023
@chia7712
Copy link
Contributor

針對沒有 replica 的 broker

這邊有辦法區別是否為正在下線的節點嗎

@garyparrot
Copy link
Collaborator Author

這邊有辦法區別是否為正在下線的節點嗎

目前 Balancer 沒有下線節點的機制,你要做到區別的效果是因為後面會添加這個功能嗎。

如果要做到下線節點和區別的功能的話,我能想到的做法是

  1. 給 CostFunction 添加一個函數,能夠設定目前的 source cluster 的長相(不像現在的 NetworkCost 從和 Balancer 的互動的假設下去猜)。
  2. 要優化的時候傳入的 cluster info 做一些修改:
    • ClusterInfo#brokers 移除要下線的節點
    • 把下線節點的既有負載隨機發到其他節點
    • 套用上面的修改後進行優化。

上面這個做法應該不需要 Cost 想辦法區別下線節點就能做到優化,我覺得對 Cost 實作的影響應該比較低。

@garyparrot garyparrot changed the title [COST] Fix NetworkCost raise exception when some broker has no replica [COST] Fix NetworkCost exception raised when some brokers have no replica Feb 16, 2023
@garyparrot garyparrot changed the title [COST] Fix NetworkCost exception raised when some brokers have no replica [COST] Fix NetworkCost raises an exception when some brokers have no replica Feb 16, 2023
@chia7712
Copy link
Contributor

目前 Balancer 沒有下線節點的機制,你要做到區別的效果是因為後面會添加這個功能嗎。

這個討論跟這個PR無關,不過看到順便聊一下:如果現行的balancer要加入一個功能,叫做排除某些特定節點,你覺得有機會嗎?這個功能可以用來當有節點要下線(歲修 or update),但我們要避免影響上下游應用,所以要先把該節點身上的replicas都移到其他節點

@garyparrot
Copy link
Collaborator Author

garyparrot commented Feb 16, 2023

這個討論跟這個PR無關,不過看到順便聊一下:如果現行的balancer要加入一個功能,叫做排除某些特定節點,你覺得有機會嗎?這個功能可以用來當有節點要下線(歲修 or update),但我們要避免影響上下游應用,所以要先把該節點身上的replicas都移到其他節點

如果要做到你說的效果,我想到的方法有

  1. 透過 Constraint 限制,如果計劃中有 replica 放在下線 broker,這些計劃都會被拒絕。不過目前的優化框架對 constraint multi-objective optimization 的輔助機制幾乎沒有,以目前的框架採用這個手法,應該會讓優化的難度大提升。這個做法需要 Balancer 的實作去支援 constraint 的理解,會增加 Balancer 那邊的實作複雜度。
  2. 透過 Tweaker 支援,避免讓下線 broker 存在負載,然後 CostFunc 也需要知道哪些 broker 有負載要略過他們的計算,不過這樣會增加 Tweaker & Cost 實作的複雜度和假設。
  3. 可以把給定的起始狀態中的下線節點從 ClusterInfo#brokers() 中移除,然後被移除的 broker 的既有負載隨便轉移到其他節點,從這個狀態開始搜尋優化計劃,最後得到的結果應該是在假設下線節點不存在的一個重點狀態,套用之後特定節點應該是處於沒有負載的狀態,符合你說的情境。這個是增加 CostFunction 實作的負載度來做到你提到的效果(CostFunction 需要知道原本的 cluster 長相和現在的優化 problem 下的 cluster 長相,然後實作者不能假設二者會一樣)。

走 2 或 3 可能比較輕鬆,但走 1 的話可以順便把 constraint optimization 這一塊補起來,但 1 應該蠻複雜的。

@chia7712
Copy link
Contributor

透過 Constraint 限制,如果計劃中有 replica 放在下線 broker,這些計劃都會被拒絕。不過目前的優化框架對 constraint multi-objective optimization 的輔助機制幾乎沒有,以目前的框架採用這個手法,應該會讓優化的難度大提升。這個做法需要 Balancer 的實作去支援 constraint 的理解,會增加 Balancer 那邊的實作複雜度。

這個機制應該比較好,這塊切出來後我們可以延伸許多不同的功能,例如 topics, brokers, partitions 等等可能都可以透過這個手法做上去。能麻煩你用你的描述開一個議題出來嗎?

Copy link
Contributor

@chia7712 chia7712 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm 做得很棒

@garyparrot garyparrot merged commit bf45f5f into opensource4you:main Feb 18, 2023
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 this pull request may close these issues.

2 participants