ray叢集多節點在NAT環境下的部署(ray兩個節點在不同wifi下連線上後丟失心跳掉線)

空心橙子發表於2024-12-04

描述

ray在內網完美執行,但是work節點和head節點在不同wifi下丟失心跳,8265皮膚檢測最初可以連線並alive 但是很快就變為dead

環境

windows
python3.10.14
ray-3.0.0.dev0-cp310-cp310-win_amd64

客戶端(work節點) 啟動項

ray start --address=12.34.567.89:6379 --node-ip-address=98.765.43.21

伺服器端(head節點)啟動項

ray start--head --port=6379 --dashboard-host=0.0.0.0 --dashboard-port=8265 --node-ip-address=12.34.567.89

node-ip-address可以強行指定本機ip

分析

丟失心跳的原因是因為
客戶端應答心跳時,目的地址錯誤,應為伺服器端的公網地址而非伺服器端所在的內網地址
使用wireshark抓包抓黑色的錯誤包,發現客戶端企圖用伺服器端所在的內網回應心跳,這必然是回覆不到的。

但是--address對應的ip必須填內網而不是公網(head節點指定nodeip)不然無法啟動,因為填公網ip無法迴環去找自己,但是如果填內網ip客戶端又找不到心跳
或者直接把裸機暴露給公網,不走所謂NAT
或者使用代理伺服器,讓他以為自己是在內網

參考

from ray.scripts.scripts import start, stop
ctx = start.make_context('start',
                                 [
                                     '--address', f'33.44.55.66:6379',
                                     '--resources', f'{json.dumps(custom_resources)}',
                                     '--node-name', name,
                                     # '--node-ip-address', "11.22.33.44",
                                 ],
                                 )
        result = start.invoke(ctx)

ray github issue 45179

相關文章