这篇博客的原由是学校的OJ由于高考被切断了, 可是个人公网OJ是个实现很不清真的UOJ并且上面只有1core和1GB内存. 费了一些周折部署好syzoj以后你们喜闻乐见地被卡常/卡内存了...因而须要分布式评测来将评测任务分流给新租的性能优秀一些的服务器.nginx
然而因为如今开发组被鸽子占据因此分布式评测的wiki咕咕咕了...git
本身xjb搞了搞如今实现了分布式评测(网站端和评测姬不在同一台服务器)github
因而在这里记录一下方便本身之后复现, 以及但愿能在必定程度上帮到想部署syzoj的你们.web
这部分是问了Menci才知道的...json
目前SYZOJ的结构是长这样的: web端分配评测任务给评测姬的judge-daemon, judge-daemon再把运行任务分配到各个judge-runner.服务器
整个系统的通讯是: web端内部使用本机的Redis通信, web端到judge-daemon使用SocketIO经过HTTP(?)实现, judge-daemon和judge-runner之间的通信是用Redis+RabbitMQ实现的.分布式
可是web端到judge-daemon之间的通信并不会传递测试数据. 也就是说测试数据必须在web端server和judge-daemon所在的server上同时存在且同步.性能
根据上面的机制描述, 咱们能够发现实际上只要解决web端到judge-daemon之间的通信就能够实现分布式评测. 也就是更改 config/daemon.json
中的 ServerUrl
项为web端的URL便可. 若是有nginx反向代理的话可能须要填写域名而非IP.测试
因此按照Wiki安装好judger基本就完事了.
觉得redis也须要和web server共享的我折腾了一段时间的外部访问redis...最后在amqp的时候自闭询问了一下Menci发现消息机制并不须要共享
由于SocketIO并无论测试数据, 咱们须要自行同步 data/testdata
下的全部文件. 我的使用的策略是使用 inotify+rsync
作到实时差量同步. (用NFS没准也能够?)
inotify
是一个内核接口, 内核会在指定文件被进行指定操做后对程序发出信号.
而后剩下的工做网上有同步教程(
大体流程是在judger那头开个 rsync --daemon
, 而后在web这头写个脚本同步.
注意各类各样的token问题就行了