对到达 RServe 的 R 请求进行负载平衡

Load balancing R requests coming to RServe

我有 6 个 Linux 框 运行 RServe 并提供同一组 R 脚本。

192.168.0.1 : 6311
192.168.0.2 : 6311
...
...
192.168.0.6 : 6311

我使用 REngine(Rserve Java 客户端)从 java 连接到这些 Rserve。

RConnection rServeConnection = new RConnection(R_SERVE_SERVER_ADDRESS, R_SERVE_SERVER_PORT);

现在我该如何负载平衡呢?最好在 Apache Mod Proxy?

我已经尝试使用 httpd websocket 负载平衡设置,但没有成功。

更新:得出结论,httpd 不会对 TCP 流量进行负载平衡(Rserve 使用 TCP,而 Rserve 中有启用 websocket 模式的选项,我的用例不需要那个额外的层)。移动到 HAProxy 以使用配置进行负载平衡,如下面 link 并能够负载平衡进入 Rserve 的 R 脚本请求,具有容错性。

如果您还没有这样做,并且因为您已经在 Java 中工作,请先从 Java 和 运行 连接到您的 RServe 服务器,一个简单的 "hello world" 脚本,如 CRAN examples

中给出

一旦 RServe 实例工作正常,那么您需要从 Java 进行负载平衡,或者为每个服务器创建一个 Java 程序并让 Apache 在它们之间进行负载平衡。在任何一种情况下,您的 Java 程序都需要提供 http 服务,因为您仍然需要 html 和 RServe 之间的 link。

我不确定这是否可以通过 Apache mod_proxy 实现。我认为它只适用于 HTTP 协议。也许您可以尝试使用 nginx 进行概念验证设置。它支持普通TCP和UDP连接的负载均衡。它还允许您定义负载平衡方法(例如循环法等)。

配置为:

stream {
    upstream myapp1 {
        server 192.168.0.1:6311;
        server 192.168.0.2:6311;
        ...
        server 192.168.0.6:6311;
    }

    server {
        listen 80;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }
}

您可以在 nginx 文档中找到更多信息: https://www.nginx.com/resources/admin-guide/tcp-load-balancing/ 在这里: https://nginx.org/en/docs/stream/ngx_stream_core_module.html

看起来越来越多的人在寻找负载平衡 R 脚本的解决方案。 这是一个通过 Rserve 和 HAproxy TCP 负载均衡器对 R 进行负载均衡的工作解决方案。

有帮助就点个赞吧