Запросы балансировки нагрузки R, поступающие в RServe

У меня есть 6 Linux-компьютеров с RServe и одним и тем же набором R-скриптов.

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

Я подключаюсь из java к этим Rserve с помощью REngine (клиент Rserve Java).

RConnection rServeConnection = new RConnection(R_SERVE_SERVER_ADDRESS, R_SERVE_SERVER_PORT);

Теперь, как мне сбалансировать нагрузку? Предпочтительно в Apache Mod Proxy?

Я пробовал с настройками балансировки нагрузки httpd websocket и не повезло.

Обновление: сделан вывод, что httpd не балансирует нагрузку TCP-трафика (Rserve использует TCP, хотя в Rserve есть параметры для включения режима веб-сокета, в моем случае использования этот дополнительный уровень не нужен). Перемещен на HAProxy для балансировки нагрузки с конфигурацией, как показано в приведенной ниже ссылке, и для балансировки нагрузки запросов R-скриптов, поступающих в Rserve, с отказоустойчивостью.

HAProxy Балансировка нагрузки TCP-трафика


person Anand    schedule 20.07.2016    source источник
comment
Я не думаю, что rserve - это http?   -  person Jeroen    schedule 13.08.2016
comment
да.. Rserve это не http. Подключается через сокет TCP/IP. IP:6311 @jeroen   -  person Anand    schedule 15.08.2016
comment
Похоже, что все больше людей ищут такое же решение. Вот рабочее решение. Лайкни, если поможет. stackoverflow.com/a/39052040/1057093   -  person Anand    schedule 20.08.2016
comment
Приятно слышать! Я думаю, что урок здесь состоял в том, чтобы найти правильный TCP, а не только балансировку нагрузки HTTP.   -  person haddr    schedule 20.08.2016


Ответы (3)


Я не уверен, что это возможно с 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

person haddr    schedule 15.08.2016
comment
Балансировка нагрузки TCP добавлена ​​в Nginx, начиная с версии 1.9, в то время как у меня есть возможность использовать только 1.6.3 (ограничение корпоративного репо). Итак, рассмотрим HAproxy (1.5.14) как альтернативный обратный прокси-сервер TCP. Тем не менее, чтобы найти базовую конфигурацию, которая может сбалансировать нагрузку TCP-трафика. Не найдя хорошей документации по тому же самому. Любой вклад в это будет действительно полезен. - person Anand; 17.08.2016
comment
Есть идеи, что не так с балансировкой нагрузки TCP с помощью HAProxy? - person Anand; 19.08.2016
comment
Хотя я не смог попробовать это из-за ограничения версии Nginx, который не поддерживал балансировку нагрузки TCP, необходимую для Rserve, я сделал то же самое с другим прокси-сервером, как указано в ссылке в моем ответе. Итак, передаю награду вам, @haddr. Палец вверх и спасибо за помощь. - person Anand; 20.08.2016

Если вы еще этого не сделали и уже работаете с Java, начните с подключения к своим серверам RServe с Java и запустите на них простой скрипт «hello world», как указано в примеры CRAN

Как только экземпляры RServe заработают нормально, вам нужно либо сбалансировать нагрузку с Java, либо создать одну Java-программу на каждый сервер и позволить Apache сбалансировать нагрузку между ними. В любом случае ваши Java-программы должны будут обслуживать http, потому что вам по-прежнему нужна связь между html и RServe.

person Daniel Wisehart    schedule 13.08.2016
comment
Подключение с Java к резерву даже для сложного типа запроса/ответа, если даже с удаленным подключением. Единственное, что нужно знать, почему балансировка нагрузки веб-сокета не работает. Не предпочитая HTTP-подключение, резерв, поскольку apache будет продолжать отправлять запрос на java, пока java/tomcat отвечает, даже если за ним не стоит резерв. Кроме того, он добавляет дополнительный прыжок для достижения R. Почему бы не балансировать нагрузку через websockt напрямую? Не могли бы вы поделиться своими идеями по этому поводу? - person Anand; 15.08.2016
comment
Я имею в виду, почему бы не балансировать нагрузку на сокет TCP/IP напрямую без необходимости балансировки нагрузки http, которая добавляет дополнительный переход и риск точки отказа. - person Anand; 15.08.2016
comment
Если вы хотите подключиться к экземплярам 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), вам не нужно беспокоиться о формате для передачи по сети. - person Daniel Wisehart; 15.08.2016
comment
Доступен обратный прокси-сервер TCP (например, прокси-сервер HA), который я пробую. При этом нам не понадобится вышеуказанный хак. Однако мне еще предстоит выяснить, как настроить haproxy для трафика tcp. - person Anand; 17.08.2016

Похоже, все больше людей ищут решение для балансировки нагрузки R-скриптов. Вот рабочее решение для балансировки нагрузки R через балансировщик нагрузки Rserve и HAproxy TCP.

Спасибо, если поможет.

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

person Anand    schedule 20.08.2016