LVS-DR

Ho migrato il clusterone da LVS-NAT a LVS-DR.

Ora i server non reinoltrano il traffico in uscita al load balancer ma lo girano direttamente al client che ha fatto la richiesta. Questo per evitare il collo di bottiglia sul loadbalancer che, durante le ultime partite ha già sfiorato un paio di volte i 100Mbit (limite hw della scheda di rete).

Ora il limite è imposto solo dal cavo che porta la connettività al nostro switch. Limite che però è superabile portando un fibra o, al limite, un altro cat5 da mettere in trunk con quello che c’è già.

La soluzione Direct-Routing ha il problema che i pacchetti che arrivano ed escono dal server devono apparire sono associati al VIP. Non si può banalmente creare un ip alias sulla scheda di rete perchè risponderebbe agli arp-request cerando di rubare il VIP al load balancer.

Una delle soluzioni adottate richiede una patch al kernel per definire un interfaccia non-arp (l’opzione noarp in ifconfig/ip storicamente viene ignorata dal kernel 2.2). Per i kernel 2.6 ci sono un paio di sysctl che possono funzionare a tale scopo, ho trovato un post di un tizio che ha configurato i server con:
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

Ma la soluzione *geniale* è quella di usare un REDIRECT di iptables per far accettare il pacchetto senza avere il VIP definito:
iptables -t nat -A PREROUTING -p tcp -d <VIP> --dport <vport> -j REDIRECT --to-port <vport>

Soluzione spiegata per benino nell’HOWTO. Peccato che quando l’avevo letto io no c’era e mi ricordavo che l’unica possibilità fosse la patch per il kernel… fa’ sempre bene andarsi a rileggere la documentazione :-)

1 thought on “LVS-DR

Comments are closed.