平衡负载:RServe接收R请求的负载平衡

9

我有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负载均衡TCP流量


我认为rserve不是http协议? - Jeroen Ooms
是的,Rserve不是http协议。它通过TCP/IP套接字连接。IP:6311 @jeroen - Anand
1
看起来有更多的人在寻找同样的解决方案。这里有一个可行的解决方案。如果有帮助,请点赞。https://dev59.com/MlkT5IYBdhLWcg3wIsOw#39052040 - Anand
1
太好了听到这个消息!我认为这里的教训是要找到一个合适的TCP而不仅仅是HTTP负载均衡。 - haddr
3个回答

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

自从Nginx 1.9版本开始,TCP负载均衡已经被添加进去了。但是由于企业仓库的限制,我只能使用1.6.3版本。因此,我正在寻找HAproxy(1.5.14)作为备选的TCP反向代理。目前还没有找到一个基本的配置来实现TCP流量的负载均衡。在这方面没有找到好的文档资料。如果有任何建议,将非常感激。 - Anand
TCP负载均衡与HAProxy有什么问题? - Anand
1
虽然由于Nginx版本限制,我无法尝试这个功能,因为它不支持TCP负载均衡,而这是Rserve所需的,但是我通过使用不同的代理服务器(如我的答案中所提到的链接)完成了类似的事情。 因此,我将赏金转给您@haddr。 点个赞,感谢您的帮助。 - Anand

0

看起来越来越多的人正在寻找负载平衡R脚本的解决方案。 这里提供了一种通过Rserve和HAproxy TCP负载均衡器负载平衡R的工作解决方案。

如果有帮助,请点赞。

https://dev59.com/MlkT5IYBdhLWcg3wIsOw#39052040


0
如果您还没有这样做,并且已经在使用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 的额外跳数。为什么不直接使用 WebSocket 负载均衡呢?您能否分享您的想法? - Anand
我的意思是,为什么不直接负载均衡TCP/IP套接字,而不需要使用HTTP负载均衡,这会增加额外的跳跃和故障风险点。 - Anand
如果您想直接连接到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),则无需担心传输格式。 - Daniel Wisehart
有一些TCP反向代理可用(如HA代理),我正在尝试使用它们。通过这种方法,我们就不需要上述的hack了。不过,我仍然需要弄清楚如何配置haproxy以处理TCP流量。 - Anand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接