一、相關配置項
-
harbor
節點唯一性編號,1~255 之間的任意整數,因此一個 skynet 網絡最多支持 255 個節點。
若某個 slave 意外退出,則對應的 harbor 會被廢棄,不可再使用(即使該 slave 後續重啓),這樣是爲了防止網絡中其它服務還持有這個斷開的 slave 上的服務地址,而一個新的進程以相同的 harbor 接入時,是無法保證舊地址和新地址不重複的。也就是說該模式下,已經用過的 harbor 無法再次使用,所以該模式不能實現熱切換,而只能充當單個物理機壓力的分擔。 -
standalone
slave 節點指定爲 nil,master 需要配置該選項(控制中心的地址和端口),表示這個進程是 master,它會監聽這個地址並等待其它節點接入。 -
master
指定 skynet 控制中心的地址和端口,與 master 節點 standalone 項相同,slave 會嘗試連接這個地址。 -
address
當前 skynet 節點的地址和端口,方便其它節點和它組網,master 會通過(harbor 和 address)區分不同的 slave。
二、部署測試
由於測試條件限制,所有 master / slave 均部署在同一臺測試機上:
master:
harbor = 1
standalone = "192.168.255.128:20003"
master = "192.168.255.128:20003"
address = "192.168.255.128:30001"
slave:
harbor= 2
standalone = nil
master = "192.168.255.128:20003"
address = "192.168.255.128:30002"
- 先啓動 master,master 日誌:
- 再啓動 slave:
slave 日誌:
master 日誌:
- 殺死 slave 進程後,master 日誌:
- 重啓啓動 slave,slave 啓動失敗:
因爲 master 主動關閉了連接:
這是因爲 harbor = 2 之前已經用過了,解決方法:修改 slave 配置項 harbor 爲3,再次重啓,slave 正常。
三、master 全部配置:
thread = 8 --啓動多少個工作線程,通常不要將它配置超過你實際擁有的 CPU 核心數
root = "/root/skynet-master/" -- 指定工作目錄
proj_root = "/root/server_01/"
luaservice = root.."service/?.lua;"
..proj_root.."service/?.lua" -- 尋址對於的lua文件的目錄列表
lualoader = root.."lualib/loader.lua" -- 默認的加載器
lua_path = root.."lualib/?.lua;"
..root.."lualib/?/init.lua;"
..proj_root.."lib/?.lua"
lua_cpath = root.."luaclib/?.so"
cpath = root.."cservice/?.so" -- 用 C 編寫的服務模塊的位置,通常指 cservice 下那些 .so 文件。如果你的系統的動態庫不是以 .so 爲後綴,需要做相應的修改。這個路徑可以配置多項,以 ; 分割
logger = proj_root.."log/game.log" -- 決定了 skynet 內建的 skynet_error 這個 C API 將信息輸出到什麼文件中。若配置爲 nil,則輸出到標準輸出。
logpath = proj_root.."/log" -- 配置一個路徑,當你運行時爲一個服務打開 log 時,這個服務所有的輸入消息都會被記錄在這個目錄下,文件名爲服務地址。
bootstrap = "snlua bootstrap" -- skynet 會啓動 snlua 這個服務
profile = true -- 默認爲 true, 可以用來統計每個服務使用了多少 cpu 時間。在 DebugConsole 中可以查看。會對性能造成微弱的影響。
start = "main" -- 這是 bootstrap 最後一個環節將啓動的 lua 服務,也就是你定製的 skynet 節點的主程序。默認爲 main ,即啓動 main.lua 這個腳本。這個 lua 服務的路徑由 luaservice 指定。
nodename = "cluster_center" -- 節點服務名稱
harbor = 1
standalone = "192.168.255.128:20003"
master = "192.168.255.128:20003"
address = "192.168.255.128:30001"
四、slave 全部配置:
thread = 8 --啓動多少個工作線程,通常不要將它配置超過你實際擁有的 CPU 核心數
root = "/root/skynet-master/" -- 指定工作目錄
proj_root = "/root/server_01/"
luaservice = root.."service/?.lua;"
..proj_root.."service/?.lua" -- 尋址對於的lua文件的目錄列表
lualoader = root.."lualib/loader.lua" -- 默認的加載器
lua_path = root.."lualib/?.lua;"
..root.."lualib/?/init.lua;"
..proj_root.."lib/?.lua"
lua_cpath = root.."luaclib/?.so"
cpath = root.."cservice/?.so" -- 用 C 編寫的服務模塊的位置,通常指 cservice 下那些 .so 文件。如果你的系統的動態庫不是以 .so 爲後綴,需要做相應的修改。這個路徑可以配置多項,以 ; 分割
logger = proj_root.."log/game.log" -- 決定了 skynet 內建的 skynet_error 這個 C API 將信息輸出到什麼文件中。若配置爲 nil,則輸出到標準輸出。
logpath = proj_root.."/log" -- 配置一個路徑,當你運行時爲一個服務打開 log 時,這個服務所有的輸入消息都會被記錄在這個目錄下,文件名爲服務地址。
bootstrap = "snlua bootstrap" -- skynet 會啓動 snlua 這個服務
profile = true -- 默認爲 true, 可以用來統計每個服務使用了多少 cpu 時間。在 DebugConsole 中可以查看。會對性能造成微弱的影響。
start = "main" -- 這是 bootstrap 最後一個環節將啓動的 lua 服務,也就是你定製的 skynet 節點的主程序。默認爲 main ,即啓動 main.lua 這個腳本。這個 lua 服務的路徑由 luaservice 指定。
nodename = "cluster_gate1" -- 節點服務名稱
harbor = 2
standalone = nil
master = "192.168.255.128:20003"
address = "192.168.255.128:30002"
問題一、disconnect fd = *, error = /root/skynet-master/service/cmaster.lua:63: Slave 1 already register on ip: port
原因:Harbor 重複,Harbor 默認爲 1。