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 日志:
    skynet master/slave 模式_第1张图片
  • 再启动 slave:
    slave 日志:
    skynet master/slave 模式_第2张图片
    master 日志:
    skynet master/slave 模式_第3张图片
  • 杀死 slave 进程后,master 日志:

skynet master/slave 模式_第4张图片

  • 重启启动 slave,slave 启动失败:
    skynet master/slave 模式_第5张图片
    因为 master 主动关闭了连接:
    skynet master/slave 模式_第6张图片
    这是因为 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。

你可能感兴趣的:(skynet)