[LinuxFocus-icon]
Home  |  Map  |  Index  |  Zoek

Nieuws | Archieven | Links | Over LF
Dit document is beschikbaar in: English  Castellano  Deutsch  Francais  Nederlands  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Atif Ghaffar]
door Atif Ghaffar
<atif(at)developer.ch>

Over de auteur:

Atif is een kameleon. Hij verandert van rol, van systeembeheerder naar programmeur naar leraar naar projectleider, al naar gelang het werk vereist.
Soms zul je hem zien programmeren op zijn draagbare computer terwijl hij in de bioskoop een film bekijkt. Atif is van mening dat hij veel aan Linux en de opensource gemeenschap met zijn projecten te danken heeft vanwege de leerzame ervaringen.
Je kunt meer over hem vinden op zijn homepage.

Vertaald naar het Nederlands door:
Tom Uijldert <tom.uijldert(at)cmgplc.com>

Inhoud:


 

Hoge beschikbaarheid onder Linux

[Illustratie]

Kort:

Wanneer je aan het ontwerp van een kritisch systeem werkt, hetzij tijdens het uitdenken of bij het configureren van de hardware, moet je jezelf de volgende vragen stellen:

Als ik mezelf die vragen stel luid het antwoord meestal: "Dan word ik ontslagen!"

Als ik mezelf daarentegen afvraag "Zal het besturingssysteem het begeven?" dan is het antwoordt altijd: Nee.
"You are not running 32 bit extensions for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition". (deze aanhaling heb ik eens in een .sig gelezen).

Maar nu even serieus.

 

Waarom hoge beschikbaarheid?

Hoewel ik een grenzeloos vertrouwen heb in Linux, heb ik dat niet in de machines waarop het draait: de voedingen, netwerkverbindingen, insteekkaarten enz. En ik ben altijd bang dat, mocht er iets stuk gaan, ik word opgezadeld met een instabiel systeem. Gevolg is dat de applicatie niet beschikbaar is, en bovendien een aantal andere applicaties binnen het bedrijf, hoewel deze applicaties waarschijnlijk niet direct iets met de mijne te maken hebben. Bijvoorbeeld: Exact hetzelfde overkomt natuurlijk een Windows Server maar daar maakt men zich niet echt druk om, de druiloren zijn er tenslotte aan gewend. Maar wees gewaarschuwd; als dit een Linux-doos overkomt dan vliegen de opmerkingen in de trant van "Dat Linux is toch nooit echt betrouwbaar geweest" je vanuit het hogere echelon om de oren. Laten we dit concept nu eens in detail gaan bekijken.  

Wat is hoge beschikbaarheid?

Precies wat het zegt. "Iets wat bijna altijd beschikbaar is". Ook bekend als high availability.

Voorbeelden van belangrijke applicaties die het bedrijf gaande houden:

Het niet beschikbaar zijn van dergelijke applicaties kan twee oorzaken hebben: Het hogere management is erg voorzichtig als het gaat om falende hardware. Iedere machine wordt besteld met dubbele voeding, RAID 5 opslagsystemen enz. Waar men vaak aan voorbij gaat is falende software.
Geloof het of niet, ik heb Linux-dozen zien bevriezen door onverwachte problemen met netwerkkaarten, oververhitte processoren enz.

De grote baas wil niet weten of er sprake is van een kapotte voeding of een falende netwerkkaart.
Het enige wat je baas, je collegae en klanten interesseert is dat de "applicatie" beschikbaar is. Merk hierbij op dat ik "applicatie" vet heb gedrukt.
Deze draait natuurlijk op een machine en het overzetten van een dergelijke applicatie met het bijhorende dataverkeer is waar het allemaal om draait bij hoge beschikbaarheid.  

Toepassingsvoorbeelden van beschikbaarheid

In dit voorbeeld gaan we een cluster maken met een actieve en passieve machine waarop een Apache server draait voor het Intranet.
Voor het maken van dit kleine cluster gebruiken we een dikke machine met veel geheugen en processoren en een tweede goedkope machine met nét genoeg geheugen en processorkracht om de applicatie te laten draaien.
De eerste machine wordt de master node (primaire machine), de tweede de backup node (reserve machine).
De taak van de backup node is om de applicatie te gaan draaien en daarmee de functie over te nemen zodra hij denkt dat de master node niet meer reageert.  

Hoe gaat dat in zijn werk?

Laten we eens nagaan hoe een gebruiker het Intranet benadert.

Zij tikt http://intranet in in haar bladerprogramma en de DNS applicatie verwijst dit door naar adres 10.0.0.100 (voorbeeld IP-adres).

Wat dacht je ervan om de twee machines met een verschillend IP-adres uit te rusten en gewoon de DNS applicatie te vragen om het tweede adres te gebruiken als de master node plat gaat?
Het is zeker een optie maar er spelen subtielere problemen zoals DNS caching op machines van gebruikers en wellicht wil je deze applicatie zélf wel een hoge beschikbaarheid op het cluster geven.
Een andere mogelijkheid is dat de backup node (of slave node) het IP-adres overneemt van de master node wanneer deze plat gaat en begint met het verlenen van de service. Dit heet IP takeover (IP adresovername) en dit is de methode die we zullen gebruiken in onze voorbeelden.
Men zal dus nog steeds http://intranet benaderen, wat wordt vertaald naar 10.0.0.100, óók als de master node plat gaat en zónder de instellingen van DNS te wijzigen.  

Hoe communiceren clusters?

Hoe kan een machine in het cluster weten dat een andere plat is gegaan? Ze staan in nauw contact met elkaar via een seriële kabel én een Ethernet verbinding (ook hier meer hardware dan strikt noodzakelijk, de seriële verbinding zou het kunnen begeven óf de netwerkverbinding) en controleren elkaars hartslag (Jazeker, dezelfde hartslag als die van jou). Als je hart stopt met kloppen dan ben je waarschijnlijk dood. Het programma om de hartslag binnen een cluster te controleren heet... drie keer raden... "heartbeat" en is van het net te halen bij http://www.linux-ha.org/download/.
Het programma voor IP takeover heet fake en is inbegrepen bij heartbeat.

Indien je geen extra netwerkkaart ter beschikking hebt voor de beide machines dan kan het ook via alleen de seriële kabel (null modem). Netwerkkaarten zijn echter goedkoop dus het is aan te bevelen om deze extra aanschaf toch te doen.  

De cluster machines prepareren

Zoals gezegd zullen we een Ferrari-PC gebruiken en een 2CV-PC. Beide machines hebben twee netwerkkaarten en tenminste één seriële poort. Verdere benodigdheden zijn een cross link cat 5 RJ45 (Ethernet) kabel en een null modem (cross link seriële kabel).

De eerste netwerkkaart op beide machines gebruiken we voor de toegang tot het Internet (eth0), de twee secundaire (eth1) kaarten vormen het privé-netwerk voor het heartbeat (udp-)verkeer tussen de nodes.

Beide machines krijgen hun IP-adressen en namen, bijvoorbeeld op eth0 op beide machines:
clustnode1 met IP-adres 10.0.0.1
clustnode2 met IP-adres 10.0.0.2

Vervolgens reserveren we een verhuisadres (waar we het al eerder over hebben gehad), te weten 10.0.0.100 (Intranet). Deze hoeven we nu nog niet aan een machine toe te wijzen.

Ook de tweede kaart moet voor beide machines worden geconfigureerd. Gebruik hiervoor willekeurige andere IP-adressen die nog niet in gebruik zijn. Voor beide machines bijvoorbeeld op eth1 met het masker 255.255.255.0:
clustnode1 met IP-adres 192.168.1.1
clustnode2 met IP-adres 192.168.1.2

Vervolgens sluiten we de seriële kabel aan op poort 1 of 2 van de machines en vergewissen ons ervan dat ze zo met elkaar kunnen communiceren (het is aan te raden op beide machines dezelfde poort te gebruiken, dat is makkelijker). Zie ook: http://www.linux-ha.org/download/GettingStarted.html  

heartbeat installeren

Installeren hiervan is eenvoudig, het is beschikbaar in rpm-formaat (binair) of in .tar.gz-formaat (broncode).
Als je problemen hebt met het installeren hiervan dan is het wellicht af te raden om überhaupt een cluster te gaan bouwen (hoog beschikbaar wordt dan waarschijnlijk niet beschikbaar). Er is een prima beschrijving Getting Started with Linux-HA op het net te verkrijgen dus dat ga ik hier niet herhalen.  

Configureren van het cluster

Configureer heartbeat:

Wijzig het bestand /etc/ha.d/authkeys indien de configuratiebestanden in /etc/ha.d staan volgens onderstaand voorbeeld:

#/etc/ha.d/authkeys
auth 1
1 crc
#end /etc/ha.d/authkeys
Later kun je md5 of sha gebruiken voor de verificatie wanneer je een beetje gewend bent maar laat deze voor nu maar even op 1 staan.

Wijzig /etc/ha.d/ha.cf als volgt:

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
deadtime 10
serial  /dev/ttyS3  # wijzig in juiste poort en haal dit commentaar weg
udp     eth1        # verwijder deze regel als je geen tweede netwerkkaart gebruikt
node    clustnode1
node    clustnode2
Wijzig /etc/ha.d/haresources als volgt:
#masternode ip-address service-name
clustnode1 10.0.0.100 httpd
Hierin staat nu dat de master node clustnode1 is. Wanneer deze plat gaat zal clustnode2 het overnemen, totdat clustnode1 weer in de lucht komt. Daarom gebruiken we een goede en een minder goede machine (clustnode1 is de goede machine).

Het tweede woord geeft het IP-adres wat over moet worden genomen en het derde geeft de naam van de over te nemen applicatie.
Als de eerste machine de applicatie weer terugneemt zal deze proberen

$ /etc/ha.d/httpd start
uit te voeren en als het deze niet kan vinden zal het
$ /etc/rc.d/init.d/httpd start
proberen uit te voeren.

Idem als de tweede machine de applicatie weer wil teruggeven zal geprobeerd worden

$ /etc/ha.d/httpd stop
uit te voeren. Indien het bestand niet wordt gevonden zal het op zoek gaan naar
$ /etc/rc.d/init.d/httpd stop
Wanneer je klaar bent met het configureren op clustnode1 kun je de configuratiebestanden naar clustnode2 kopiëren.
In /etc/ha.d/rc.d staat een script ip-request die het toekennen van IP-adressen enz. voor zijn rekening neemt.
Start nu /etc/rc.d/init.d/heartbeat op beide machines. Maak verschillende index-pagina's aan op de machines voor de httpd server. Bijvoorbeeld op clustnode1:
$ echo hallo, dit is clustnode1 >/jouWwwDocRoot/index.html
en op clustnode2:
$ echo hallo, dit is clustnode2 >/jouWwwDocRoot/index.html
Vergewis je ervan dat op beide machines httpd niet standaard wordt aangeroepen tijdens opstarten. Verwijder links uit de rc.N directories of, nog beter, verplaats het httpd of apache opstartscript van /etc/rc.d/init.d naar /etc/ha.d/rc.d.

Als alles correct is ingesteld en heartbeat actief is dan zal clustnode1 het adres 10.0.0.100 hebben en zal het reageren op verzoeken tot httpd toegang. Probeer het een aantal keren en verifieer de werking. Als alles goed lijkt te functioneren, stop dan clustnode1 en binnen 10 seconden zal clustnode2 de applicatie en het IP-adres over nemen. De applicatie is dus maximaal 10 seconden niet beschikbaar.  

Hoe zit het met data-opslag?

Als httpd wordt overgenomen vanaf machine 1 naar machine 2 dan verlies ik alle data die ik met mijn CGI-scripts heb aangemaakt.

Twee oplossingen:
1. Schrijf nooit naar lokale bestanden vanuit CGI's (gebruik in plaats daarvan een netwerkdatabase. MySQL is aan te bevelen).
2. Je kunt de twee machines aan centrale SCSI-opslag koppelen. Doe het zó dat je zeker weet dat de twee machines de opslag nooit tegelijk benaderen en zorg er ook voor dat de SCSI- identificatie op de kaart van beide machines niet dezelfde is (bijvoorbeeld een machine met identificatie 6 en de andere met 7).

Ik heb dit uitgeprobeerd met Adaptec 2940 SCSI kaarten die je de mogelijkheid geven de identificatie te veranderen. De meeste goedkope kaarten hebben die mogelijkheid niet.
Sommige RAID-controllers worden verkocht als zijnde "cluster-bewust" maar vergewis je ervan dat je de HOST-ID hiervan kunt veranderen zonder dat je de Microsoft cluster kit hoeft te kopen.
Ik had twee NetRaid controllers van HP en deze ondersteunen Linux zeker niet. Ik heb ze maar gemold om toch nog enig "waar voor m'n geld"- gevoel te krijgen.

De volgende stap is om Fibrechannel (via glasvezel dus) kaarten te kopen, tezamen met een Fibrechannel hub en Fibrechannel opslag om zo een klein SAN (Storage Area Network) te bouwen. Dit is uiteraard duurder dan gedeelde SCSI maar een goede investering.
Hier overheen kun je GFS (Global File System, zie ook de referenties) draaien die toegang geeft tot opslag voor alle machines als ware het een lokale schijf.

Op dit moment gebruiken we GFS in een productie-omgeving met 8 machines waarvan 2 geconfigureerd voor hoge beschikbaarheid zoals boven beschreven.  

Hoe zit dat met een cluster van gelijkwaardige machines?

Dat is eenvoudig in elkaar te zetten als je ook beschikt over een opslagsysteem wat parallelle toegang toelaat (zoals Fibrechannel en GFS). Als je met NFS al tevreden bent is dat ook prima maar ik raad het niet aan.

Hoe dan ook, je kunt dan serviceA aan clustnode1 toewijzen en serviceB aan clustnode2. Een voorbeeld van mijn haresources bestand:

clustnode2 172.23.2.13 mysql
clustnode1 172.23.2.14 ldap
clustnode2 172.23.2.15 cyrus
Ik gebruik GFS voor de opslag dus ik heb geen problemen met parallelle schijftoegang en kan dus zoveel applicaties op de machines draaien als ze aan kunnen.
clustnode2 is in dit geval de master node voor mysql en cyrus, terwijl clustnode1 de master node is voor ldap. In het geval van een crash zullen ze elkaars applicaties over nemen.  

Referenties

Linux-HA.org
De site van hoge beschikbaarheid voor Linux
kimberlite clustering technology
Een KimberLite Cluster ondersteunt cluster configuraties van twee gelijkwaardige machines met gedeelde SCSI-opslag of Fibrechannel opslag. De software detecteert wanneer een machine uit het cluster valt en zal automatisch herstel-scripts starten voor overname van applicaties op de andere machine. Wanneer de machine terugkeert in het cluster kan handmatig of automatisch de applicatie terug worden gezet indien gewenst. Voorbeeld-scripts worden meegeleverd
ultra monkey
Ultra Monkey is een project voor het realiseren van hoog beschikbare clusters met werkverdeling op een lolaal netwerk via open source software op Linux. Op dit moment concentreert men zich op een schaalbaar en hoog beschikbare webkudde (web farm). Deze techniek is eenvoudig uit te breiden naar andere applicaties zoals email en FTP.
Linux Virtual Server
De Linux Virtual Server is een zeer schaalbare, hoog beschikbare server, gebaseerd op een cluster van meerdere machines, waarbij de werkverdeler op Linux draait. Hoe het cluster in elkaar zit is transparant voor de gebruiker. Gebruikers zien slechts de ene server.
4U cluster / 4U SAN (schaamteloze reclame)
4U cluster en 4U SAN is een clusterimplementatie van ons bedrijf 4Unet.
Als je een ISP bent of telecommunicatiebedrijf en je hebt behoefte aan hoog beschikbare oplossingen dan is 4Unet het juiste bedrijf om bij aan te kloppen. Let wel, 4Unet verkoopt oplossingen, geen systemen of clusters. Deze worden voor de klanten geïmplementeerd. De technieken die hierbij worden gebruikt zijn allemaal gebaseerd op open source. 4Unet bedient alleen ISP's en telecommunicatiebedrijven.
Global File System
Het Global File System (GFS) is een opslagsysteem met schijfclusters voor parallelle toegang vanaf meerdere Linux systemen. GFS ondersteunt journalling en herstellen bij uitvallen van clients. GFS cluster machines delen de toegang naar dezelfde schijven via glasvezel of via gedeelde SCSI. Het bestandssysteem lijkt voor iedere machine alsof het lokale opslag is, waarbij GFS de toegang tot de schijven regelt voor het gehele cluster. GFS is geheel symmetrisch, wat betekent dat alle machines gelijk worden behandeld en dat een server geen obstakel mag vormen voor andere machines. GFS gebruikt hiervoor caching van lees- en schrijfoperaties waarbij volledig het gedrag van een Unix bestandssysteem wordt gehandhaafd.
 

Talkback voor dit artikel

Elk artikel heeft zijn eigen talkback pagina. Daar kan je commentaar geven of commentaar van anderen lezen:
 talkback pagina 

Site onderhouden door het LinuxFocus editors team
© Atif Ghaffar, FDL
LinuxFocus.org

Klik hier om een fout te melden of commentaar te geven
Vertaling info:
en --> -- : Atif Ghaffar <atif(at)developer.ch>
en --> nl: Tom Uijldert <tom.uijldert(at)cmgplc.com>

2002-06-08, generated by lfparser version 2.28