[High Availability] Master/slave election

Pagina: 1
Acties:

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Hallo,

Ik ben een load-balanced setup aan het opzetten met failover.
Ik gebruik voor de loadbalancing HaProxy, en dat lijkt erg goed te werken.

Nu heb ik enkel nog een systeem nodig dat gaat beslissen welke node er master is.
Ik heb dus een implementatie nodig van een algoritme dat healthchecks doet tussen master en slave,
en indien nodig een transitie van slave-naar master gaat starten op 1 van de slave nodes.
Dit algoritme moet er voor zorgen dat er steeds precies 1 master bestaat.
Ik wil dat een script opgeroepen wordt als een machine van staat veranderd, meer niet.

Ik ben mij bewust van oplossingen zoals Linux-Ha (Heartbeat/Pacemaker) en LVS/Keepalived.
Het is mij nog niet 100% duidelijk voor wat deze oplossingen juist staan, dit ben ik nu aan het onderzoeken.
Maar beide oplossingen lijken momenteel overkill.

Keepalived lijkt te verlappen met HAProxy. Kan ik HAProxy en keepalived naast elkaar gebruiken?
Dan zou HAProxy de loadbalancing behandelen, en keepalived is verantwoordelijk voor het detecteren van fouten en het verkiezen van een nieuwe master.

Heeft er hier al iemand ervaring mee? Kan er mij iemand vooruithelpen hierbij?

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 14:51

Kees

Serveradmin / BOFH / DoC
DieterVDW schreef op vrijdag 16 oktober 2009 @ 11:18:

Keepalived lijkt te verlappen met HAProxy. Kan ik HAProxy en keepalived naast elkaar gebruiken?
Dan zou HAProxy de loadbalancing behandelen, en keepalived is verantwoordelijk voor het detecteren van fouten en het verkiezen van een nieuwe master.
Dat is inderdaad juist, je wil een programma hebben dat specifiek kan detecteren wie er een master is, en of die nog goed werkt. Hierbij moet je er wel goed op letten dat je niet alleen state changes kan detecteren, als jij een poweroff op een master doet, dan heeft hij geen tijd om een state change door te geven, en zal de slave dat zelf moeten detecteren zonder dat er specifiek voor de slave iets veranderd.

Wat andere zaken:
- Een heartbeat (niet perse dat programma) tussen de beide nodes. Een hartslag is precies wat het is, een gebeurtenis die elke paar seconden plaatsvind. Een simpele heartbeat is bijvoorbeeld het pingen van de andere node, en als dat failed dan moet de slave het overnemen. Hiet zijn inderdaad programma's als keepalived en heartbeat voor. Wat die doen is, als er aan een set voorwaarden voldaan wordt, dan maken ze de slave de master.
- STONITH = Shoot The Other Node In The Head, altijd een leuke afkorting om te gebruiken. Op het moment dat de slave besluit dat hij master moet worden, wil je niet perongeluk twee masters naast elkaar hebben, dat heb je inderdaad goed gezien. Wat je dan wil doen is er zeker van zijn dat de oude master ook echt dood is en geen problemen gaat veroorzaken.
Dat kun je op verschillende manieren doen:
- Mbv een remote powerswitch, bijvoorbeeld een APC masterswitch, kun je hem laten rebooten door hem kort uit te zetten en daarna weer aan te zetten
- Mbv een remote access controller alla ILOM (sun), DRAC (dell), RSA (ibm) etc waarmee je hetzelfde doet; de oude master reboten.
- Een commando uitvoeren op de master om hem te reboten, dat kan zeer lastig zijn, er is een reden dat je de master overneemt, de belangrijkste reden is waarschijnlijk omdat je hem niet kan bereiken.
- Op de netwerkswitch de poorten van de oude master disablen - maar hiermee bereik je niet dat de node zichzelf gaat herstellen, alleen dat hij niet meer voor problemen kan zorgen.
- Als het een VM is, dan zou je op de host/dom0 hoe je het ook wil noemen de vm afschieten en opnieuw opstarten

Als je dit implementeerd, een heartbeat, een aantal condities waarop de slave het moet overnemen, en stonith, dan heb je geen probleem om te bepalen wie er master is. Want:

- Tijdens de installatie zet je je liefste server in als Master, de andere is slave
s1 = master, s2 = slave

- De slave bekijkt van tijd tot tijd of de master nog goed is
s1 = master, s2 = slave

- De slave detecteerd dat de master stuk is, en wordt master en brengt de andere node om:
s1 = dood, s2 = master

- De oude master is nu gereboot (handmatig, of door stonith) en komt weer op. De default state voor een loadbalancer is een slave, en hij wordt alleen master (inc de stonith) als hij geen master kan vinden. Die is er nu wel dus:
s1 = slave, s2 = master

- s1 blijft nu s2 monitoren tot s2 in de fout gaat. Dan zal hij s2 afschieten, master worden en als s2 weer opkomt, zal die weer slave zijn.

De enige keer dat je dus specifiek moet beslissen wie een master is, is tijdens de installatie. Verder moet je uitkijken voor oneindige loops; als beide servers elkaar niet kunnen bereiken, maar elkaar nog wel kunnen afschieten, dan kan het voorkomen dat ze, zodra ze weer opkomen, de master afschieten en zelf master worden. De oude master ziet de nieuwe master dan niet, en schiet hem af, en wordt zelf weer master etc. Dat kun je voorkomen door hem helemaal geen state na een reboot te geven, waarop je het handmatig weer op slave moet zetten nadat je gechecked hebt wat het probleem was, en of er geen rebootloop ontstaat.

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Kees, bedankt voor je uitleg!

Wat ik eigenlijk zoek is een programma dat hetgeen wat jij uitlegt implementeert.
Dus een heartbeat uitvoert en een signaal geeft als een bepaalde node master moet worden.

Keepalived lijkt erg goed te werken, maar helaas zitten de 2 nodes die ik gebruik niet in hetzelfde netwerk.
Daardoor kunnen de VRRP advertisements niet doorgegeven worden en gaan beide nodes naar master...
(Oid., ben het nog aan het bekijken.)

Ik zoek dus ofwel een oplossing om keepalived te laten werken terwijl de nodes in verschillende netwerken staan (hmm ...) , of een alternatieve oplossing die hetzelfde kan met nodes in verschillende netwerken. (Suggesties?)

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 14:51

Kees

Serveradmin / BOFH / DoC
Heartbeat kan het volgens mij wel, en anders kun je ook altijd wel een vpn aanleggen. Overigens is het met twee servers op twee locaties wel allemaal een stuk gecompliceerder, want dan krijg je dingen als IP takeover die, of lang duren, of gewoon niet kunnen omdat de servers in verschillende ranges hangen. Als ze wel in dezelfde ranges hangen, dan zou een VRRP gewoon moeten werken volgens mij.

Je zou anders ook kunnen kijken naar een VPN tussen de twee servers, of in ieder geval iets waardoor de servers redelijk direct met elkaar kunnen communiceren.

Er zijn erg veel cluster software pakketten, en het is helaas erg lastig om aan te geven welke de voorkeur boven een andere geniet, maar zoals je al merkte doet keepalived niet helemaal wat jij wil, dus dan zou ik gaan kijken naar heartbeat, eventueel in combinatie met een redhat cluster suite (als je redhat/fedora gebruikt is dat sowieso aan te bevelen).

Het is een kwestie van spelen met deze dingen tot jij iets vind wat voor jou werkt.

Enkele andere links, die je vast al wel gevonden had:
- http://linux-ha.org/
- http://clusterlabs.org/
- http://www.redhat.com/cluster_suite/
- http://www.linuxvirtualserver.org/

Alhoewel lang niet alle links en packages doen wat jij wilt, hebben ze heel vaak wel hetzelfde probleem en lossen ze dit op verschillende manieren op.

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Misschien wat context informatie: de 2 servers staan op Amazon EC2 , vandaar dat VRRP broadcasting niet werkt.

De IP takeover is een ec2-associate-address commando naar Amazon zodat zij het externe Elastic IP gaan koppelen aan de slave server bij een failure. De IP takeover wordt dus geregeld door Amazon.

Ik werkt nu met een simpel scriptje op de slave dat een IP takeover commando gaat uitvoeren als 'm denkt dat de master down is. Werkt ook, maar nogal ad-hoc. Ik had liever een robuustere oplossing :) .

Een Amazon loadbalancer is geen optie aangezien ik sticky sessions nodig heb.
LVS is ook problematisch in een Amazon omgeving denk ik...

Nog maar weinig informatie gevonden hierover.

[ Voor 15% gewijzigd door DieterVDW op 16-10-2009 14:04 ]


  • Kees
  • Registratie: Juni 1999
  • Laatst online: 14:51

Kees

Serveradmin / BOFH / DoC
Het gaat er niet zozeer om dat het problematisch is, als wel dat ze tegen dezelfde problemen aanlopen, en daar oplossingen voor verzonnen hebben.

Verder is een scriptje dat je zelf schrijft ook prima te doen, zolang je het maar goed doet. En volgens mij doet heartbeat precies wat jij allemaal beschrijft :)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Kees schreef op vrijdag 16 oktober 2009 @ 14:15:
Verder is een scriptje dat je zelf schrijft ook prima te doen, zolang je het maar goed doet. En volgens mij doet heartbeat precies wat jij allemaal beschrijft :)
Ok, even verdiepen in Heartbeat/Pacemaker dan! Bedankt!
Pagina: 1