What’s ServerEngine?
A framework to implement robust multiprocess servers like Unicorn
worker
worker
worker
super
visor
Server
Dynamic reconfig
live restart
Heartbeat via pipe
auto restart
multi
process/thread
how to use ServerEngine
worker
super
visor
Server
module MyServer
def before_run
@sock = TCPServer.new(
config[:bind], config[:port])
end
attr_reader :sock
end
module MyWorker
def run
c = server.sock.accept
c.write "Awesome work!"
end
def stop
c.close
end
end
1. write server module and worker module
how to use ServerEngine
worker
super
visor
Server
se = ServerEngine.create(MyServer, MyWorker, {
daemonize: true,
log: 'myserver.log',
pid_path: 'myserver.pid',
worker_type: 'process',
workers: 4,
bind: '0.0.0.0',
port: 9071,
})
se.run
2. write configuration and run
Signal and RPC server
api/config.reloadlive restart/config reload HUP
/api/processes
.interruptWorkers
INT
/api/processes
.killWorkers
/api/plugins.
flushBuffers
system config reload USR2
TERM
USR1flush buffers
shutdown
worker
super
visor
Server
you can reload system config without restart
system config reload
send USR2
check mtime and previous load time,
if there is new one, reload!
serverengine
config cash
new config
how to use Socket Manager
worker
Socket
Manager
client
Socket
Manager
server
Server
27
#generate path for UDS/TCP for server connection
socket_manager_path =
ServerEngine::SocketManager::Server.generate_path
#open socket manager server
socket_manager_server =
ServerEngine::SocketManager::Server.open(socket_manager_path)
In server
What’s the merit of Socket Manager?
worker
worker
worker
Socket
Manager
client
Socket
Manager
client
Socket
Manager
client
Socket
Manager
server
super
visor
Server
29
we can use multicore easily in future
easy to use multicore power fully
30
with SocketManagerwith in_multiprocess plugin
<source>
type multiprocess
<process>
cmdline -c /etc/td-agent/td-agent-child1.conf
</process>
<process>
cmdline -c /etc/td-agent/td-agent-child2.conf
</process>
</source>
#/etc/td-agent/td-agent-child1.conf
<source>
type forward
port 24224
</source>
#/etc/td-agent/td-agent-child2.conf
<source>
type forward
port 24225
</source>
<source>
type forward
port 24224
</source>
setting when using 2 core
support new features
(These are already ported to ruby core.)
・multiprocess aware log rotation
・reopening of log file
・'trace' level, which is lower level than ‘debug'
ServerEngine.create(MyServer, MyWorker, {
log: 'myserver.log',
log_level: 'debug',
log_rotate_age: 5,
log_rotate_size: 1*1024*1024,
})
summary
windows
・signal → rpc handler
・no socket FD and UDS
・fork based → spawn based
・live & auto restart
・multicore with socket manager
・sophisticated signal handler
・easier log rotation
unix→fork based damon
windows→spawn based damon
damonize
fluentd
server
engine
①set windows_daemon_cmdline
in configuration
②run windows_daemon_cmdline
when damonize
③windows_daemon_cmdline
runs daemon.rb
④run_server with
servermodule and workermodule