воскресенье, 4 сентября 2011 г.

Запуск нескольких экземпляров сервера Reddwarf на одной машине

Недавно возникла необходимость запустить несколько экземпляров игрового сервера на одной машине. Игровой сервер разработан на платформе Reddwarf.
Причем речь идет не о настройке прозрачного горизонтального масштабирования (которое уже много лет как обещается, но всё ещё не разработано), а просто запуск двух независимых серверов.
При  попытке запуска второго экземпляра сервера происходит исключение java.net.BindException: Address already in use.


Казалось бы, дело в использовании одного и того же порта обоими серверами. Меняем настройки одного из серверов чтобы задать другой порт для соединения.
Добавляем в файл sgs-server.properties строчку (порт 3214 выбран случайно):
com.sun.sgs.app.root=data
com.sun.sgs.app.name=GameServer
com.sun.sgs.app.listener=my.server.GameServer
com.sun.sgs.impl.transport.tcp.listen.port=3214

Запускаем... ошибка та же самая!
Sep 04, 2011 7:33:17 PM com.sun.sgs.impl.kernel.Kernel createServices
SEVERE: GameServer: failed to create services
java.lang.reflect.InvocationTargetException
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
 at com.sun.sgs.impl.kernel.Kernel.createService(Kernel.java:818)
 at com.sun.sgs.impl.kernel.Kernel.setupServiceNoManager(Kernel.java:752)
 at com.sun.sgs.impl.kernel.Kernel.loadCoreServices(Kernel.java:651)
 at com.sun.sgs.impl.kernel.Kernel.fetchServices(Kernel.java:600)
 at com.sun.sgs.impl.kernel.Kernel.createServices(Kernel.java:510)
 at com.sun.sgs.impl.kernel.Kernel.createAndStartApplication(Kernel.java:484)
 at com.sun.sgs.impl.kernel.Kernel.(Kernel.java:349)
 at com.sun.sgs.impl.kernel.Kernel.main(Kernel.java:1344)
Caused by: java.rmi.server.ExportException: Port already in use: 44533; nested exception is:
 java.net.BindException: Address already in use
 at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:328)
 at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:236)
 at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:411)
 at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
 at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:207)
 at sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:112)
 at sun.rmi.registry.RegistryImpl.(RegistryImpl.java:88)
 at java.rmi.registry.LocateRegistry.createRegistry(LocateRegistry.java:239)
 at com.sun.sgs.impl.util.Exporter.export(Exporter.java:98)
 at com.sun.sgs.impl.service.watchdog.WatchdogServerImpl.(WatchdogServerImpl.java:338)
 at com.sun.sgs.impl.service.watchdog.WatchdogServiceImpl.(WatchdogServiceImpl.java:352)
 ... 12 more
Оказывается, сервер использует некоторые порты в служебных целях: для самодиагностики и для нужд будущего масштабирования.
Вот такие настройки для своих служебных портов использует сервер по умолчанию:
com.sun.sgs.impl.service.data.store.net.server.port=44530
com.sun.sgs.impl.service.watchdog.server.port=44533
com.sun.sgs.impl.service.nodemap.server.port=44535

Добавим эти строчки в sgs-server.properties одного из серверов, изменив номера портов, получаем:
com.sun.sgs.app.root=data
com.sun.sgs.app.name=GameServer
com.sun.sgs.app.listener=my.server.GameServer
com.sun.sgs.impl.transport.tcp.listen.port=3214
com.sun.sgs.impl.service.data.store.net.server.port=55530
com.sun.sgs.impl.service.watchdog.server.port=55533
com.sun.sgs.impl.service.nodemap.server.port=55535

В результате второй экземпляр сервера запущен и ждет соединений на указанном нами порту!
Sep 04, 2011 7:54:30 PM com.sun.sgs.impl.kernel.Kernel 
INFO: The Kernel is ready, version: 0.10.2.1
Sep 04, 2011 7:54:30 PM com.sun.sgs.impl.service.data.store.DataStoreImpl 
INFO: Creating database directory : /opt/test/target/sgs-server-dist-0.10.2.1/data/dsdb
Sep 04, 2011 7:54:30 PM com.sun.sgs.impl.service.watchdog.WatchdogServerImpl registerNode
INFO: node:com.sun.sgs.impl.service.watchdog.NodeImpl[1,health:GREEN,backup:(none)]@cs1 registered
Starting new Game Server
Sep 04, 2011 7:54:31 PM com.sun.sgs.impl.kernel.Kernel startApplication
INFO: GameServer: application is ready

Комментариев нет:

Отправить комментарий