Jasper Aikema

Open Source: freedom to do what I want and to help people wherever I can.

De mailservers op het internet zijn zo ingesteld dat mails worden doorgestuurd tussen de verschillende mailservers.

Dit doorsturen gebeurt via het SMTP protocol. De mailserver worden ook wel MTA’s genoemd. MTA staat voor Mail Transport Agent. Zoals de naam al zegt, zorgt een MTA voor het transport van de mail. Voorbeelden van een MTA zijn sendmail, postfix, qmail en exim.

Naast MTA’s hebben we ook MDA’s en MUA’s. MDA staat voor Mail Delivery Agent en MUA staat voor Mail User Agent. De MUA is de mail client, zoals bijvoorbeeld Outlook (Express), Evolution, Apple Mail, KMail of mutt. De mail client haalt zijn email via POP3 of IMAP op bij de MDA. Als MDA zijn dovecot, courier-imap, en UW IMAP voorbeelden.

Soms is een MDA en een MTA in 1 programma geïntegreerd. Hierbij kun je denken aan Microsoft Exchange, Lotus Domino en Novell Groupwise.

Op het moment dat het belangrijk is dat een database beschikbaar is, zijn er verschillende mogelijkheden om dit te bereiken. In deze post zal ik beschrijven hoe je dit kunt oplossing door middel van 2 database server, deze 2 servers zijn gekoppeld door middel van master master synchronisatie. Bij master master synchronisatie is het belangrijk dat er maar op 1 van de servers geschreven wordt.
Op het moment dat allebei de servers gebruikt worden om naar toe te schrijven, bestaat de kans dat de data corrupt wordt. Het is namelijk mogelijk dat een id (welke automatisch verhoogd wordt) dubbel wordt uitgegeven.
Om dit probleem tegen te gaan, is het mogelijk om door middel van heartbeat één ipadres te delen tussen de 2 database servers. Hoe dit gedaan moet worden zal ik ook beschrijving.

Als eerst heb ik 2 servers geïnstalleerd op basis van Ubuntu 10.04, hierbij heb ik voor een minimale installatie gekozen. Bij de installatie heb ik ervoor gekozen om ook openssh-server en vim te installeren. De ssh server heb ik nodig zodat ik vanaf afstand bij de server kan. Verder heb ik vim geïnstalleerd, deze heeft namelijk ondersteuning voor syntax highlighting. Voor het bewerken van configuratie bestanden kan dit erg handig zijn.

Hierna heb ik de MySQL server geïnstalleerd

apt-get install mysql-server

De aanpassingen aan de configuratie heb ik in een apart bestand gezet. Dit bestand moet als extensie .cnf hebben en in de map /etc/mysql/conf.d/ staan.

[mysqld]
bind-address = 0.0.0.0
server-id = 11
log_bin = /var/log/mysql/mysql-bin.log

In dit bestand zorg ik ervoor dat MySQL op elk ipadres luistert en niet alleen op het locale adres 127.0.0.1
Verder moet er een server-id worden mee gegeven. Dit id moet uniek zijn binnen deze servers.
Tenslotte moet het log_bin nog gezet worden.

Voordat de data naar de tweede server gekopieerd moet worden, is het handig om een gebruiker aan te maken welke de slave replicatie rechten heeft. Dit doen we door in te loggen op de primaire database server en de gebruiker toe te voegen.

mysql -u root -p
GRANT replication slave ON *.* TO 'repl'@'<ipadres1>' IDENTIFIED BY '<wachtwoord>';
GRANT replication slave ON *.* TO 'repl'@'<ipadres2>' IDENTIFIED BY '<wachtwoord>';

Bij ipadres1 vul ik het ipadres in van de eerste server, bij ipadres2 vul ik het ipadres in van de tweede server. Nu heb ik voor allebei de servers een gebruiker toegevoerd. De database kan nu in zijn geheel gekopieerd worden naar de tweede server.

Om de data te kopiëren naar de tweede server moeten we eerst de master status bekijken en daarna de server stoppen. Tenslotte kan de data ingepakt en verstuurd worden naar de tweede server.

mysql -u root -p
SHOW MASTER STATUS;
service mysql stop
tar -czvf mysql.tar.gz /var/lib/mysql
scp mysql.tar.gz beheer@<ipadres2>:/home/beheer/
service mysql start

Bij de master status moeten we de waardes weten die bij File en Position staan.

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000017 | 106      |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

De tweede database server moet nu gestopt worden. Daarna kan de data uitgepakt worden naar de juiste directory.

service mysql stop
cd /
sudo tar -xzvf /home/beheer/mysql.tar.gz
service mysql start

Nu we exact dezelfde data hebben staan op allebei de servers kunnen we de replicatie opzetten.
Hiervoor loggen we als eerste in op de tweede database server en starten daar de replicatie.

mysql -u root -p
STOP SLAVE;
CHANGE MASTER TO
   MASTER_HOST='<ipadres1>',
   MASTER_USER='repl',
   MASTER_PASSWORD='<wachtwoord>',
   MASTER_LOG_FILE='<naam van de logfile>',
   MASTER_LOG_POS=<positie in de logfile>;
START SLAVE;
SHOW SLAVE STATUS;

De naam van de logfile en de positie in de logfile hebben we opgezocht op de eerste server.
Als we de status van de slave opzoeken moet er bij “Slave_IO_State” de waarde “Waiting for master to send event” staan.

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: <ipadres1>
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000017
Read_Master_Log_Pos: 106

Nadat de replicatie van de eerste server naar de tweede server goed gaat, moet de replicatie van de tweede server naar de eerste server ingesteld worden.
Hiervoor moet eerst de naam van de logfile en de positie in de logfile opgezocht worden op de tweede server.

mysql -u root -p
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Hierna moet de replicatie aangezet worden op de eerste server.

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='<ipadres2>', MASTER_USER='repl', MASTER_PASSWORD='<wachtwoord>', MASTER_LOG_FILE='<naam van de logfile>', MASTER_LOG_POS=<positie in de logfile>;
START SLAVE;
SHOW SLAVE STATUS;

Ook hier moet weer worden gecheckt of alles goed synchroniseert.

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: <ipadres2>
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000011
Read_Master_Log_Pos: 106

Nu de MySQL master master replicatie is opgezet, zal ik heartbeat zo configureren dat deze tussen de twee servers 1 ipadres deelt. Dit ipadres zal ik voor het gemak ipadres0 noemen.

Als eerste zal heartbeat geïnstalleerd moeten worden.

apt-get install heartbeat

De configuratie bestanden voor heartbeat staan in /etc/heartbeat. Het configuratie bestand ha.cf heb ik vanaf /usr/share/doc/heartbeat/ gekopieerd. De andere twee configuratie bestanden heb ik zelf aangemaakt. De aanpassingen die ik gedaan heb, staan hieronder beschreven.

ha.cf:
keepalive 2
deadtime 10
initdead 20
bcast eth0
auto_failback off
node <naam van eerste database server>
node <name van tweede database server>
ping <ipadres van de router>
respawn hacluster /usr/lib/heartbeat/ipfail

haresources:
<naam van eerste database server> IPaddr::<ipadres0>

authkeys:
auth 1
1 sha1 <random string>

De naam van de server (in het configuratie bestand), moet exact overeen komen met de echte naam. De echte naam kan gevonden worden via uname -n.
Dit bestand zal ook nog de juiste rechten, ivm beveiliging, moeten krijgen, namelijk 600.

chmod 600 authkeys

Zodra heartbeat op allebei de server is geïnstalleerd en geconfigureerd, kan heartbeat gestart worden. Als alles goed gaat wordt het ipadres aan de eerste server toegekend.

Het is nu mogelijk om op <ipadres0> verbinding te maken. Mocht 1 van de server uitvallen, dan zal alles gewoon door blijven werken. Zodra de server weer beschikbaar wordt, wordt de server geupdate.

We hebben een aantal servers welke IPMI ondersteunen, maar op dit moment gebruiken we dit eigenlijk niet.
Een IPMI module kan op twee manieren worden aangesproken. De eerste manier is via de CLI van de server. De tweede manier is via de netwerkinterface van de module.

De module kan uitgelezen worden via het ipmitool programma. De werking hiervan is voor allebei de methodes gelijk. Het enige verschil is het aanroepen van het programma.

Via de CLI van de server roepen we het programma aan als: ipmitool -I open
Via de netwerkinterface roepen we het programma aan als ipmitool -I lan -H [ipadres vd ipmi module] -U [gebruikersnaam] -a

Hierna kunnen we een aantal opties mee geven:

commando optie 1 optie 2 werking
sensor list Ophalen van sensor informatie
sensor get [naam van de sensor] Ophalen van specifieke sensor informatie
chassis status
chassis power soft Shutdown commando via ACPI
chassis power reset Herstart de server
lan print Ophalen van netwerk gegevens
lan set [id] ipaddr [ipaddr] Stel het ipadres in
lan set [id] defgw ipaddr [ipaddr] Stel het ipadres van de gateway in