【问题标题】:Load balancing R requests coming to RServe对 RServe 的 R 请求进行负载平衡
【发布时间】:2016-07-20 10:46:21
【问题描述】:

我有 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 以使用以下链接中的配置进行负载平衡,并且能够负载平衡进入 Rserve 的具有容错能力的 R 脚本请求。

HAProxy Loadbalancing TCP traffic

【问题讨论】:

  • 我不认为 rserve 是 http?
  • 是的.. Rserve 不是 http。它通过 TCP/IP 套接字连接。 IP:6311 @jeroen
  • 看起来更多的人正在寻找相同的解决方案。这是一个有效的解决方案。如果有帮助,请点赞。 stackoverflow.com/a/39052040/1057093
  • 很高兴听到这个消息!我认为这里的教训是找到合适的 TCP 而不仅仅是 HTTP 负载平衡。

标签: r apache load-balancing haproxy rserve


【解决方案1】:

我不确定这是否可以通过 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

【讨论】:

  • 自 1.9 版开始在 Nginx 中添加 TCP 负载平衡,而我可以选择仅使用 1.6.3(企业 repo 限制)。因此,将 HAproxy(1.5.14) 视为备用 TCP 反向代理。尚未找到可以负载平衡 TCP 流量的基本配置。没有找到好的文档。对此的任何意见都会非常有帮助。
  • 知道使用 HAProxy 进行 TCP 负载平衡有什么问题吗?
  • 虽然由于 Nginx 版本限制不支持 Rserve 所需的 TCP 负载平衡,但我无法尝试此操作,但使用我的链接中提到的不同代理服务器做了类似的事情回答。因此,将赏金传递给您@haddr。竖起大拇指,感谢您的帮助。
【解决方案2】:

如果您还没有这样做并且因为您已经在使用 Java,请首先从 Java 连接到您的 RServe 服务器并在其上运行一个简单的“hello world”脚本,如 CRAN examples

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

【讨论】:

  • 即使对于复杂的请求/响应类型,即使通过远程连接也可以从 Java 连接到 Reserve。只需要知道为什么 websocket 负载平衡不起作用。不喜欢 http 连接的 Reserve,因为只要 java/tomcat 响应,apache 就会继续向 java 发送请求,即使它后面的 Reserve 没有。此外,它增加了一个额外的跃点来到达 R。为什么不直接使用 websockt 负载平衡呢?你能分享一下你的想法吗?
  • 我的意思是,为什么不直接对 TCP/IP 套接字进行负载平衡,而不需要增加额外的跃点和故障点风险的 http 负载平衡。
  • 如果您想直接连接到 Rserve 实例,您将不得不深入研究 Rserve 的源代码——或可用的适配器之一——并找出现有的有线协议。当您执行以下操作时,实际发生了什么:RConnection c = new RConnection(); c.assign("x", dataX); c.assign("y", dataY); RList l = c.eval("lowess(x,y)").asList(); 如果您使用现有适配器之一(Java、C/C++、PHP),您不必担心在线格式。
  • 有可用的 TCP 反向代理(如 HA 代理),我正在尝试。有了这个,我们就不需要上面的hack了。不过,我还没有弄清楚如何为 tcp 流量配置 haproxy。
【解决方案3】:

似乎越来越多的人正在寻找负载平衡 R 脚本的解决方案。 这是通过 Rserve 和 HAproxy TCP 负载平衡器对 R 进行负载平衡的有效解决方案。

如果有帮助,请点赞。

https://stackoverflow.com/a/39052040/1057093

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2017-04-01
    • 2012-02-28
    • 2018-07-02
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多