一、相关配置项
-
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。