這篇博客的原由是學校的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問題就行了