2016-08-18 39 views
5

Korzystając z HAProxy, próbuję (TCP) załadować saldo Rserve (usługa nasłuchująca w gnieździe TCP do wywoływania skryptów R) działającą na porcie 6311 w 2 węzłach.HAProxy Loadbalancing Ruch TCP

Poniżej znajduje się mój plik konfiguracyjny. Kiedy uruchamiam HAProxy, jego statystyka bez żadnych problemów. Ale kiedy podłączam się do zrównoważonych węzłów, dostaję się poniżej błędu. Coś nie tak z konfiguracją?

Handshake failed: expected 32 bytes header, got -1

#--------------------------------------------------------------------- 
# Global settings 
#--------------------------------------------------------------------- 
global 
    log   127.0.0.1 local2 

    chroot  /var/lib/haproxy 
    pidfile  /var/run/haproxy.pid 
    maxconn  4000 
    user  haproxy 
    group  haproxy 
    daemon 

    # turn on stats unix socket 
    stats socket /var/lib/haproxy/stats 

#--------------------------------------------------------------------- 
# common defaults that all the 'listen' and 'backend' sections will 
# use if not designated in their block 
#--------------------------------------------------------------------- 
defaults 
    mode     tcp 
    log      global 
    option     httplog 
    option     dontlognull 
    option http-server-close 
    #option forwardfor  except 127.0.0.0/8 
    option     redispatch 
    retries     3 
    timeout http-request 10s 
    timeout queue   1m 
    timeout connect   10s 
    timeout client   1m 
    timeout server   1m 
    timeout http-keep-alive 10s 
    timeout check   10s 
    maxconn     3000 


listen haproxy_rserve 
     bind *:81 
     mode tcp 
     option tcplog 
     timeout client 10800s 
     timeout server 10800s 
     balance leastconn 
     server rserve1 rserveHostName1:6311 
     server rserve2 rserveHostName2:6311 

listen stats proxyHostName:8080 
    mode http 
    stats enable 
    stats realm Haproxy\ Statistics 
    stats uri /haproxy_stats 
    stats hide-version 
    stats auth admin:password 

Próbowałem z poniżej frontend-backend sposób równoważenia, jak również. Ten sam wynik.

frontend haproxy_rserve 
    bind *:81 
    mode tcp 
    option tcplog 
    timeout client 10800s 
    default_backend rserve 

backend rserve 
    mode tcp 
    option tcplog 
    balance leastconn 
    timeout server 10800s 
    server rserve1 rserveHostName1:6311 
    server rserve2 rserveHostName2:6311 

Odpowiedz

12

Po zmaga się przez tydzień na rozwiązanie, aby załadować równowagi R, poniżej rozwiązanie (full free/open source software stack) pracował.

Jeśli więcej osób to odsyła, opublikuję szczegółowy blog na temat instalacji do konfiguracji.

Był w stanie załadować żądania skryptu R do Rserve'a za pośrednictwem loadera obciążenia HAProxy TCP z poniższą konfiguracją. W zasadzie podobne do sekcji config w pytaniu, ale z oddzielnym frontendem i backendem.

#Load balancer stats page access at hostname:8080/haproxy_stats 
listen stats <load_balancer_hostname>:8080 
    mode http 
    log global 
    stats enable 
    stats realm Haproxy\ Statistics 
    stats uri /haproxy_stats 
    stats hide-version 
    stats auth admin:[email protected] 

frontend rserve_frontend 
    bind *:81 
    mode tcp 
    option tcplog 
    timeout client 1m 
    default_backend rserve_backend 

backend rserve_backend 
    mode tcp 
    option tcplog 
    option log-health-checks 
    option redispatch 
    log global 
    balance roundrobin 
    timeout connect 10s 
    timeout server 1m 
    server rserve1 <rserve hostname1>:6311 check 
    server rserve2 <rserve hostname2>:6311 check 
    server rserve2 <rserve hostname3>:6311 check 

Kluczowe jest to, aby umożliwić zdalne połączenia dla HAProxy z poleceniem poniżej (bez wyraźnego doc na ten temat w większości)

/usr/sbin/setsebool -P haproxy_connect_any 1 

również upewnić umożliwić zdalne połączenia w Rserve z „enable zdalny "parametr w pliku konfiguracyjnym Rserve.

+1

Witam - jest to bardzo interesujące. dlaczego nie używasz nginx? ponieważ większość z nas używa nginx, fajnie byłoby zobaczyć tam rozwiązanie. Zauważ, że nginx obsługuje tcp (używając strumienia i/lub protokołu proxy). – Sandeep

+1

@ Nie zostawiaj żadnego konkretnego powodu, aby nie używać nginx. Znaleziony haproxy jest przeznaczony wyłącznie do odwrotnego proxy i działa dobrze przez dziesięciolecia i nie potrzebowałbym niczego innego, co oferuje nginx (np. Serwer WWW). Tak. możemy użyć tylko części odwrotnego proxy. Ale właśnie załatwiłem się z haproxy. – Anand

+3

@Sandeep Oto implementacja nginx przykładu równoważenia obciążenia TCP. https://www.nginx.com/resources/admin-guide/tcp-load-balancing/ – Anand