2

我正在我们数据中心的多台机器上运行游戏。我们对所有内容进行负载平衡。在每个播放节点/VM 上,我使用 Apache 和一个 init.d/play 脚本来启动和停止播放服务。

问题是我们的游戏网站托管在共享网络存储上。这使得部署非常好,你部署到一个地方,网站在所有 100 台机器上更新。每台机器都有一个映射文件夹“/z/www/PlayApp1”,播放应用程序所在的位置。

问题是当服务启动或停止时 server.pid 文件被写入应用程序文件所在的网络位置。

问题是当我启动 100 个节点时,第 100 个节点将使用它的 pid 覆盖 PID 文件,现在 pid 文件仅代表 100 个节点中的 1 个的正确进程 ID。

那么我如何才能在本地存储 pid 文件而不是网络共享上的应用程序文件呢?我需要每台服务器的 PID 文件来反映该机器的实际进程。

我们正在使用 CentOS (Linux)

提前感谢乔希

4

3 回答 3

2

根据https://github.com/playframework/play/pull/43看起来有一个 --pid_file 命令行选项;它可能仅适用于应用程序根目录下的路径,因此您可能必须为每个不同的主机创建目录(可能是符号链接)

我有 0 次玩游戏的经验,所以希望这是有用的信息。

于 2012-01-19T04:50:48.407 回答
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.

因此,要么您没有使用我正在查看的版本,要么您正在讨论其他内容。

在我看来,更改上面的一行将是一件简单的事情:

File root = new File(System.getProperty("application.path"));

为 PID 文件存储使用不同的属性,该属性不在共享驱动器上。

尽管您需要小心,但root也会传递给,Play.int因此您应该调查更改它的影响。

毕竟,这是开源软件的一大优势,因为您可以自己修复“错误”。


对于它的价值,我不是您选择的部署方法的忠实粉丝。是的,它简化了部署,但是升级你的服务器是一个全有或全无的事情,如果你不小心安装了一些狡猾的软件,这会让你感到悲伤。

喜欢分阶段部署,因此我可以根据需要关闭性能不佳的节点。

于 2012-01-19T05:00:54.730 回答
0

更改您的初始化脚本以将 pid 写入 /tmp 或其他机器本地位置。如果这很难,符号链接可能会起作用。

于 2012-01-19T04:31:27.283 回答