我在数据中心的多台计算机上运行游戏。我们把所有东西都归咎于地狱。在每个播放节点/ VM上,我使用Apache和init.d / play脚本来启动和停止播放服务。
问题是我们的游戏网站托管在共享网络存储上。这使部署非常好,您部署到一个地方,并在所有100台机器上更新网站。每台机器都有一个映射文件夹“/ z / www / PlayApp1”,其中播放应用程序存在。
问题是,当服务启动或停止时,server.pid文件将被写入应用程序文件所在的网络位置。
问题在于,当我调出100个节点时,第100个节点会用它的pid覆盖PID文件,现在pid文件只代表100个节点中的1个正确的进程ID。
那么如何在本地存储pid文件,而不是在网络共享上存储app文件?我需要每个服务器的PID文件来反映机器的实际过程。
我们正在使用CentOS(Linux)
提前致谢 约什
答案 0 :(得分:2)
根据https://github.com/playframework/play/pull/43,看起来有一个--pid_file命令行选项;它可能只适用于应用程序根目录下的路径,因此您可能必须为每个不同的主机创建目录(可能是符号链接)
我对Play有0次经验,所以希望这是有用的信息。
答案 1 :(得分:1)
根据当前的源代码,我甚至认为它不应该运行第二个副本。 main
函数是:
public static void main(String[] args) throws Exception {
File root = new File(System.getProperty("application.path"));
if (System.getProperty("precompiled", "false").equals("true")) {
Play.usePrecompiled = true;
}
if (System.getProperty("writepid", "false").equals("true")) {
writePID(root);
}
:
blah blah blah
}
和writePID
是:
private static void writePID(File root) {
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
File pidfile = new File(root, PID_FILE);
if (pidfile.exists()) {
throw new RuntimeException("The " + PID_FILE + " already exists. Is the server already running?");
}
IO.write(pid.getBytes(), pidfile);
}
意味着当您尝试使用相同的application.path
运行多个副本时,它应该抛出异常。
所以要么你没有使用the version I'm looking at,要么你正在讨论 else。
在我看来,更改上面一行是一件简单的事情:
File root = new File(System.getProperty("application.path"));
为PID文件存储使用不同的属性,共享驱动器上的不。
虽然您需要小心,root
也会传递给Play.int
,因此您应该调查更改它的影响。
毕竟,这是开源软件的一大优势,因为你可以自己修复“错误”。
对于它的价值,我不是你选择部署的方法的忠实粉丝。是的,它简化了部署,但升级服务器是一个全有或全无的事情,如果你不小心安装了一些狡猾的软件,会让你感到悲伤。
我很多更喜欢分阶段部署,因此我可以根据需要关闭不良节点。
答案 2 :(得分:0)
更改您的init脚本,将pid写入/ tmp或其他机器本地。 如果这很难,则符号链接可能会起作用。