[MEGOLDVA] HAproxy állapot megtartással

 ( Dolpa | 2016. március 9., szerda - 12:08 )

Hali,

Van két HAproxy node szerver, corosync/heartbeat-el. Úgy van beállítva, hogy az egyiken fut a HAproxy float IP-vel, gond esetén a másik node felhúzza az IP és indítja a HAproxyt.
Ezzel semmi gond, szépen működik.
De, ha az aktuális node-on pl. MAINT állapotba helyezek egy backend-et, és közben átkapcsol a másik node-ra, akkor ez az állapot nem megy át, hanem minden backend megint online módban lesz a mások node-on.
A haproxy-hoz a heartbeat-es scriptet innen töltöttem le. Abban nem volt semmi olyan dolog, ami átvinné az állapotokat.

A kérdésem az, hogy aki üzemeltet hasonlót, az hogyan oldja ezt meg?

UPDATE:A megoldás

# echo “1” > /proc/sys/net/ipv4/ip_nonlocal_bind

Így nem kell leállítani/elindítani a HAproxy-kat, hanem állandóan futnak. a Corosync csak az IP-t húzza fel.
Az 'server state' infók pedig átmennek ha beállítom a peers-t, sőt a kapcsolatok is.

A haproxy konfig valahogy így néz ki:

global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
pidfile /var/run/haproxy.pid
maxconn 1000
ulimit-n 65535
tune.bufsize 16384
tune.maxrewrite 1024

defaults
log global
mode http
...
peers haproxy
peer haproxy1 10.10.10.1:9999
peer haproxy2 10.10.10.2:9999

frontend gateway
bind 10.10.10.10:443 <-- közös IP
default_backend nginx

backend nginx
balance leastconn
stick-table type ip size 20k peers haproxy
stick on src
...
server s1 127.0.0.1:44301 cookie sl ssl check inter 10000 weight 1 maxconn 1000
server s2 127.0.0.1:44302 cookie s2 ssl check inter 10000 weight 1 maxconn 1000
server s3 127.0.0.1:44303 cookie s3 ssl check inter 10000 weight 1 maxconn 1000
server maint 127.0.0.1:443 ssl check inter 5000 backup

Köszi mindekinek a tippet!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Nem ertek a HAProxy-hoz, de gondolom a backend statuszoknak is shared allapotban kell lenniuk? Nem tudom, hogy ez egy konfigba irodik e vagy valami state allomanyba, de a ketto HAProxy kozott ezt meg kellene osztani. Igy elso blikkre.

Ha 1.5-ös, vagy újabb haproxyt használsz, akkor képesek egymással állapotokat és táblákat szinkronizálni. Ehhez az kell, hogy mindkét gépen fusson a haproxy és ne a heartbeat indítgassa, valamint a peers opcióval be kell állítani, hogy megtalálják egymást.
Egy próbát megérne, hogy a kézzel beállított MAINT állapot is szinkronizálódik-e.

HAproxy 1.6-os van. Azért nem fut a passzív node-on, mert egy közös IP címre kell felhúzni a HAproxy-t, ami értelemszerűen csak ez egyiken lehet egyszerre. * bind sajnos nem jó, mert ugyanazon a porton másik IP címen más is fut. De ha más megoldás nem lesz, mergpróbálom átszervezni, hogy ez ne legyen gond.

Köszi a tippet.

Erre megoldás a net.ipv4.ip_nonlocal_bind, amivel akkor is tud listenelni, ha nincs nála az adott ip. Megfelelő feltételekkel persze.

Köszi, valószinüleg ez lesz a megoldás. Holnap kipróbálom.

+1

csak egy otlet, megprobalhatod iptables REDIRECT targettel is:
A haproxynak van egy sajat ipje, amit adott gepnek szol, es azon bindel X porton, iptables redirecttel meg csak odakuldod a bejovo forgalmat.
a man szerint a redirect atirja a cel ipt is (*).
eth0 - 10.0.0.11 < ez a fixed address
eth0:0 - 10.0.0.1 < ez vandorol a heartbeattel

haproxy 10.0.0.11:2180-re bindel es
iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 2180

* REDIRECT

This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
It redirects the packet to the machine itself by changing the destination IP to the primary address of the incoming interface (locally-generated packets are mapped to the 127.0.0.1 address).

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Igen ez is egy jó ötlet, de nem akartam nat-olni és iptablest belekeverni.

Üdv!

conntrackd-t próbáltad esetleg?

K.

A szokás hatalma, nem hét!!!

Köszi, már közben megoldottam.

Hu de jo lenne tudni, hogy hogyan? :D

Ott van a végén leírva. :-)

ooops, csak a kommenteket olvastam...bocs :D

A ip_nonlocal_bind nem csak a Corosync-nel jatszik, hanem az osszes tobbi mas failover IP megoldasnal. Pl.: keepalived. ;)
Nalunk van egy jopar "orokolt" regi load-balancer OpenSips szerver, amiken a keepalived jatszik.

Sot a Severalnines (http://severalnines.com/) meg mindig hasznalja a HA-Proxy-s konfigjaiban.
Mondjuk az teny, hogy egy keepalived konfiguracio "5" perc, ellenben a corosync/pacemaker kombot egy kicsit tovabb tart beloni. :)

.

sub

nice job!

--
"nem tárgyszerűen nézem a dolgot, hanem a vádló szerepéből. Sok bosszúságot okoztak, örülnék ha megbüntetnék őket - tudom gyarló dolog, de hát nem vagyok tökéletes." (BehringerZoltan)