web-dev-qa-db-fra.com

Équilibrage de charge HAProxy TCP

En utilisant HAProxy, j'essaie d'équilibrer la charge (TCP) Rserve (un service d'écoute dans TCP pour appeler les scripts R) fonctionnant au port 6311 sur 2 nœuds.

Ci-dessous est mon fichier de configuration. Lorsque j'exécute HAProxy, son démarrage sans aucun problème. Mais lorsque je me connecte aux nœuds équilibrés, je tombe en dessous de l'erreur. Quelque chose ne va pas avec la config?

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

Essayé avec une méthode d'équilibrage frontend-backend également. Même résultat.

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 
8
Anand

Après avoir lutté pendant une semaine pour une solution pour équilibrer la charge R, la solution ci-dessous (pile logicielle complète gratuite/open source) a fonctionné.

Si plus de personnes font référence à cela, je publierai un blog détaillé sur l'installation de la configuration.

A pu équilibrer la charge des requêtes de script R envoyées à Rserve via HAProxy TCP équilibreur de charge avec la configuration ci-dessous. Assez similaire à la configuration dans la section des questions, mais avec frontend et backend séparés.

#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:admin@rserve

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

L'essentiel est d'activer les connexions à distance pour HAproxy avec la commande ci-dessous (PAS de document clair à ce sujet dans la plupart des cas)

/usr/sbin/setsebool -P haproxy_connect_any 1

Assurez-vous également d'activer les connexions à distance dans Rserve avec le paramètre "enable remote" dans le fichier de configuration de Rserve.

17
Anand