skynet master/slave 模式

一、相關配置項

  • 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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章