Configurant el MySQL al DRBD

Ara que ja tenim el servidor redundant (però redundant del tot eh! jaja), anem a donar-li alguna utilitat, perquè per ara està configurat per a que monitoritze el HeartBeat al Apache, però este no està configurat per a que siga redundant, simplement està per a saber quan està o no en marxa.

Instal·lació i configuració del servidor MySQL
Anem a instalar el MySQL i configurar-lo per a que siga redundant, és molt fàcil. Primer que res s’instal·la el servidor MySQL als dos servidors i es configura com si foren independents (al final la configuració que valdrà serà la del servidor 1)
root@pc:/# apt-get install mysql-server mysql-common mysql-client

Aixina amb el client podem provar que està en marxa quan s’acabe la instal·lació:
root@pc:/# mysql -u root -p

I si tot va be ja estarem en la línia de comandament del servidor MySQL. Després d’aquesta comprovació (que s’ha de fer precís i així sabem que com a mínim fins a ací arriba be) es configura la redundancia de les dades al servidor 1, així que tot el que s’explica a continuació fa referència al servidor 1.
Parem el servici:
root@pc:/# mysqladmin -p shutdown

I ara anem a moure els fitxers de configuració i de la base de dades a la partició del DRBD. Ací explique com fer-ho sensefer backups dels fitxers però és recomanable que abans de moure cap arxiu també es faja un backup d’aquestos ‘per si les mosques’, quedeu avisats!
Primer creem una carpeta per a tenir-ho tot ben estructurat en la partició del DRBD:
root@pc:/# mkdir /mnt/mysql

Migrem la carpeta de configuració a aquesta carpeta i fem un enllaç simbolic que reemplaça la carpeta anterior:
root@pc:/# mv -f /etc/mysql /mnt/mysql/conf
root@pc:/# ln -s /mnt/mysql/conf /etc/mysql

Ara es mou la carpeta on es troben les db’s:
root@pc:/# mv -f /var/lib/mysql /mnt/mysql/data
root@pc:/# chown mysql:mysql /mnt/mysql/data
<– Per a que funcione correctament el MySQL aquesta carpeta tindrà com a owner l’usuari que utilitze mysqld (per defecte mysql).

I es modifica l’axiu de configuració per a indicar la nova ruta, així que s’edita el my.cnf que es troba al /etc/mysql, modificant el paràmetre datadir:
datadir = /mnt/mysql/data

Finalmente posem en marxa una altra vegada el servici de mysql
root@pc:/# /etc/init.d/mysql start

Si ha arrancat el servici comprobem que es pot accedir correctament
root@pc:/# mysql -u root -p

I funciona, a que si? Be ací he supost que l’usuari per a accedir al servidor de dades és el root i que necessita password. També s’havera pogut configurar la carpeta de bd’s com la de configuració, és a dir, mitjançant enllaços simbòlics però crec que aixina està tot més controlat.
Ara que ja està configurat l’apartat del MySQL al servidor 1 passem al servidor 2, que és més senzill. S’elimina la carpeta de configuració (recordeu que recomane fer primer un backup) i després es crea l’enllaç simbòlic a la carpeta de la partició DRBD:
root@pc:/# mysqladmin -p shutdown <– Parem el servici
root@pc:/# rm -fr /etc/mysql
root@pc:/# ln -s /mnt/mysql/conf /etc/mysql

Per a fer la prova de l’ou ara forcem el HeartBeat per a que el servidor 2 es pose en marxa i una vegada fet això tornem a posar en marxa el servici del MySQL i comprovem que es pot entrar, no fa falta que torne a escriure les ordres perquè ja està abans.
Funciona? Espere que si, a mi si que m’ha funcionat.

Configuració del HeartBeat
Tot el que es configura es farà tant en el servidor 1 com en el servidor 2. Ara passem a configurar el HeartBeat per a que monitoritze i pose en marxa el MySQL automàticament. Creem l’arxiu (si no està creat ja) /etc/ha.d/resource.d/mysql.resource amb el següent contingut:

#!/bin/bash
#
#This script is inteded to be used as resource script by heartbeat
#
#Mar 2006 by Monty Taylor
#
###
. /etc/ha.d/shellfuncs
case "$1" in
start)
res=`/etc/init.d/mysql start`
ret=$?
ha_log $res
exit $ret
;;
stop)
res=`/etc/init.d/mysql stop`
ret=$?
ha_log $res
exit $ret
;;
status)
if [[ `ps -ef | grep '[m]ysqld'` > 1 ]] ; then
echo "running"
else
echo "stopped"
fi
;;
*)
echo "Usage: mysql {start|stop|status}"
exit 1
;;
esac
exit 0

Que serà el script encarregat de posar en marxa i parar el servici de MySQL quan canvie de servidor (si està mal escrit en la referència que pose més avall es pot aconseguir)

Per a finalitzar la configuració del HeartBeat modifiquem l’arxiu /etc/ha.d/haresources afegint mysql al final de la línia, tenint en compte que aquesta instal·lació s’ha fet als servidors que hem configurat en el post anterior, l’arxiu quedaria així:
server1 drbddisk::r0 Filesystem::/dev/drbd1::/servidor::ext3 IPaddr2::10.7.250.10/16/eth0 apache2 mysql

Es reinicia el servei de HeartBeat als dos servidors…. i a rodar!!! Ja es pot fer les proves per a comprovar

Webs d’interés
==============
http://downloads.mysql.com/docs/mysql-ha-drbd-en.pdf

 

Servidor Redundant DRBD+HeartBeat

DRBD + HEARTBEAT

Hui explicaré com poder tenir un servidor redundant. No estic parlant d’un simple RAID de HDD’s, sino de redundacia de servidor completa, que si per el que siga el servidor es para es puga donar servei igualment. Està clar que per a això fan falta 2 servers, un que és el principal i l’altre que està ‘dormint’ i quan detecta que el primer està ‘caigut’ es ‘desperta’ i continua donant el mateix servei.
Açò s’aconseguix amb el DRBD i el HEARTBEAT. El que fa el DRBD és el mateix que un RAID1 però a nivell de xarxa i el funcionament és el següent: Es sincronitzen dues particions iguals (una a cada servidor) formant una partició virtual visible pels dos servidors, el servidor principal té accés RW i el secundari sols R. Quan el principal cau, el secundari passa a ser el principal i ja té accés RW. Tota la informació que s’escriu a aquesta partició, s’escriu tant a la partició física del propi servidor principal, com a la partició física del servidor secundari (enviant les dades per la xarxa), així quan el servidor primari torna a estar en funcionament es torna a sincronitzar les particions i torna a ser el principal.
El HEARTBEAT és l’encarregat de monitoritzar l’estat dels dos servidors i activar el servidor secundari quan el primari ha caigut, sense el HEARTBEAT aquesta feina s’hauria de fer en manual, que també l’explicaré per si ho tenim que fer alguna vegada.
Una vegada explicat més o menys els conceptes (qui no tinga qualsevol cosa clara que pregunte, jeje) passe ja a començar el tutorial:
No és requisit indispensable que les dues máquines siguen idèntiques, sols les particions a sincronitzar (encara que per a que no es veja afectat el rendiment del servidor si que deuria de ser igual)
Les particions que van a utilitzar-se en el DRBD no tindran cap format ni estaran muntades, en aquest cas anem a dir que les particions que anem a utilitzar són la /dev/sda7 per als dos servidors i que tenen el mateix tamany.
Les proves les he fet en la debian 6.0 i he utilitzat el repositori per a la instal·lació de les aplicacions, no he compilat res (facilet ehhhh), anem allà.

Instal·lació i configuració del DRBD

Instal·lem el paquet drbd8-utils:
root@pc:/# apt-get install drbd8-utils

I ara passem a configurar-ho, comentar que per a la comunicació entre els dos servidors es neccesita tenir oberts els ports 7788/TCP i 7799/TCP, com estic fent més o menys un ‘copy & paste’ del manual de la web oficial (però traduït, per supost) vaig a utilitzar les mateixes ip’s, configuracions,…. Així que les IP’s dels servidors, és a dir que el servidor1 té la IP 10.1.1.31 i el servidor 2 la 10.1.1.32 i utilitcen la tarjeta de xarxa eth1.
Mantenint la configuració que tenen per defecte sols hem de fer la següent modificació en el fitxer /etc/drbd.conf:

resource r0 {
on alice {
device    /dev/drbd1;
disk      /dev/sda7;
address   10.1.1.31:7789;
meta-disk internal;
}
on bob {
device    /dev/drbd1;
disk      /dev/sda7;
address   10.1.1.32:7789;
meta-disk internal;
}
}

Si ja tenim un resource el borrem i posem este, i ara toca explicar-lo un poc. En el tag resource es definix les particions locals a utilitzar en el servidors i la partició virtual que es crea. Podem vore que el nom que es definix en resource és el r0 i que hi ha dos servidors dins del resource el servidor ‘alice’ i el ‘bob’. En cada servidor està definit la seva IP, la seva partició que s’utilitzarà i la partició virtual a la que pertany.
Així que per a extrapolar-ho al nostre cas sols falta canviar els noms dels servidors, les IP’s i les particions locals que s’utilitzaran, la partició virtual (el ‘device’) podem mantindre el que apareix en l’exemple.
Continuem en l’activació de l’aplicació amb els següents programes (teniu en compte que on diu ‘r0’ es modificarà per el nom del resource que heu posat vosaltres):
Primer carreguem el mòdul al kernel:
root@pc:/#modprobe drbd

Es crea el metadata del resource, aqueta acció sols es farà la primera vegada que es cree el device (en aquest cas el /dev/drbd1)
root@pc:/#drbdadm create-md r0

Apareixerà un resultat paregut a aquest:
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.
success

i continuem amb
root@pc:/#drbdadm up r0

Si falla aquest comandament es pot provar d’una altra forma:
root@pc:/#drbdadm attach r0 (asocia el device als servidors)
root@pc:/#drbdadm syncer r0 (configura els paràmetres de sincronització)
root@pc:/#drbdadm connect r0 (connecta els servidors)

Be fent la primera opcció o la segona opcio per a comprovar que està tot correcte es fa un
root@pc:/#cat /proc/drbd

I el que mostre per pantalla serà similar al que es mostra
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by buildsystem@linbit, 2008-12-18 16:02:26
1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:200768

Diu Inconsistent/Inconsistent perquè encara no s’ha sincronitzat.
Si fins a ací ha funcionat tot correcte… ja toca sincronitzar les dues particions, si no ha funcionat tot correcte reviseu la configuració que algo mal hi haurà. Per a sincronitzar les particions i dir quin servidor és el node principal s’executa el següent comandament (sols en el servidor principal):
root@pc:/#drbdadm -- --overwrite-data-of-peer primary r0

i començarà una sincronització completa de les particions, que depenent del tamany de la partició, recursos dels servidors i connexió de xarxa tardarà més o menys (ja vos assegure que tardar si que tarda prou en completar). Per a monitoritzar la sincornització es pot fer un
root@pc:/#watch -n1 cat /proc/drbd

i veurem com va avançant la sincronització.

Posada en marxa i comprovació del sistema

Ara que ja ha acabat de sincronitzar-se les particions ja podem començar a utilitzar-les. Recordar que en aquest sistema el servidor primari té accés de RW a la partició /dev/drbd1 mentre que el servidor secundari sols R.
Com aquesta partició no té format ni està utilitzant-se el primer que es fa és donar-li format
root@pc:/#mkfs.ext3 /dev/drbd1

i la muntem en un directori que creem nosaltres
root@pc:/#mount /dev/drbd1 /mnt
root@pc:/#mount

Aixina que ens mostre si s’ha muntat o no i ja podem accedir a ella i crear qualsevol cosa, ara si s’intenta fer el mateix des del servidor secundari es comprovarà que no es pot fer. Si es necessitara poder accedir es tindria que configurar d’una altra forma (si que es pot) fent els dos servidors com a principals i utilitzar un altre format (GFS per exemple), i açò està explicat en la web principal i en altres blogs.
Passem a comprovar que el que es modifica en el primer servidor també ho fa al secundari. Desmuntem la partició en el primari:
root@pc:/#umount /mnt

Canviem el rol en el server primari a secundari
root@pc:/#drbdadm secondary r0

I ara fem el contrari en el server secundari
root@pc:/#drbdadm primary r0
root@pc:/#mount /dev/drbd1 /mnt
root@pc:/#mount

Així comprovem que està muntat correctament i si accedim al seu punt de muntatge trobarem que les dades són les mateixes, tornem a fer la mateixa operació per a deixar-ho com estava (el servidor principal el tornem a fer principal i el secundari el tornem a fer secundari)
I si tot ha anat be ja tenim en marxa el DRBD!

Instal·lació i configuració del HeartBeat

root@pc:/#apt-get install heartbeat

I ja tenim instal·lada l’aplicació (que senzilles són les coses!), ara passem a la configuració d’aquest. Es necessiten 3 arxius de configuració:
/etc/ha.d/authkeys <- definix el xifratge
/etc/ha.d/ha.cf <-paràmetres per a la monitorització
/etc/ha.d/haresources <- paràmetres d’IPV, servici a monitoritzar,…

Abans de fer res en el fitxer /etc/hosts es posen dues linies amb les ip’s i noms dels dos servidors per a un millor funcionament del heartbeat. Després ja podem passar a crear els arxius de configuració ja que al fer-ho jo he vist que no se me crea cap arxiu, els creem a ma i funciona igual, primer creem el authkeys amb el següent contingut

auth 1
1 crc

és l’autenticació menys forta però per a proves funciona be, per a altres métodes més forts buscar ‘per ahí’

Ara li toca al ha.cf

#       File to write debug messages to
debugfile /var/log/ha-debug
#
#
#       File to write other messages to
#
logfile /var/log/ha-log
#
#
#       Facility to use for syslog()/logger
#
logfacility     local0
#
#
#       A note on specifying "how long" times below...
#
#       The default time unit is seconds
#               10 means ten seconds
#
#       You can also specify them in milliseconds
#               1500ms means 1.5 seconds
#
#
#       keepalive: how long between heartbeats?
#
keepalive       2
#
#       deadtime: how long-to-declare-host-dead?
#
#               If you set this too low you will get the problematic
#               split-brain (or cluster partition) problem.
#               See the FAQ for how to use warntime to tune deadtime.
#
deadtime        30
#
#       warntime: how long before issuing "late heartbeat" warning?
#       See the FAQ for how to use warntime to tune deadtime.
#
warntime 10
#
#
#       Very first dead time (initdead)
#
#       On some machines/OSes, etc. the network takes a while to come up
#       and start working right after you've been rebooted.  As a result
#       we have a separate dead time for when things first come up.
#       It should be at least twice the normal dead time.
#
initdead        120
#
#
#       What UDP port to use for bcast/ucast communication?
#
udpport 694
#       Set up a unicast / udp heartbeat medium
#       ucast [dev] [peer-ip-addr]
#
#       [dev]           device to send/rcv heartbeats on
#       [peer-ip-addr]  IP address of peer to send packets to
#
ucast eth0 (ip_del_otro_servidor)
#
auto_failback   on
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    server1
node    server2
#
bcast   eth1

D’on es modifica el ‘ucast eth0 (ip_del_otro_servidor)‘ posant-li la IP de l’altre servidor (en el servidor primari es posa la IP del servidor secundari i en el secundari la del primari) i en node es posen els noms dels servers. Si s’utilitzara una altra interficie diferent a eth1, es modificaria el bcast.

Ja donem pas al haresources:

servidor1 drbddisk::r0 Filesystem::/dev/drbd1::/mnt::ext3 IPaddr2::192.168.1.10/24/eth1 apache2

Tot està a la mateixa línia, en primer lloc es posa el nom del servidor principal, després del drbddisk:: es posa el nom del resource que s’havia posat en el DRBD, supose que el que està en el filesystem no fa falta que ho explique, no? partició, punt de muntatge i format de la partició, jejeje
El punt de IPaddr2 és important, aquesta és la IP virtual. Gràcies a aquesta IP el sistema és redundant, ja que encara que cada servidor té una IP diferent, el servidor que estiga en actiu també respondrà a la IP virtual, tenint així sempre un servidor que responga a esta IP (a no ser que es paren els 2). Està format per la IP/màscara/interficie de xarxa.
I al final es posa els servicis a monitoritzar, en aquest cas he posat el apache2, que no ho he dit en aquest post però l’he instal·lat també per a poder ser monitoritzat.
Aquestos 3 fitxers de configuració seran iguals en els dos servidors (exeptuant l’apartat ucast del ha.cf)
Es reinicia el Heartbeat en els dos servidors, que si està tot correcte no donarà cap error
root@pc:/#/etc/init.d/heartbeat restart

I ja ho tenim funcionant!

Posada en marxa i comprovació

He posat “posada en marxa” però és mentida, ja està en marxa, dona igual és per a seguir els mateixos apartats en una aplicació que en l’altra.
El primer pas per a comprovar que el HeartBeat funciona correctament és fer un ping a la IP virtual, si respon es que està tot correcte, de vegades quan es posa en marxa per primera vegada li costa un poc respondre al ping.
I el segon pas de comprovació és simular la caiguda del servidor primar i comprovar que el secundari es ‘desperta’. Per a això deixem un ping constant a la IP virtual des d’una màquina que no siga ni el server1 ni el server2 i executem:
root@pc:/#/etc/init.d/heartbeat stop

El ping es pedrà per uns pocs segons i tornarà a fer-se. En aquest moment intentem accedir al punt de muntatge del servidor2 i es comprovarà que s’ha muntat automàticament.
Ara simulem que torna tot a la normalitat
root@pc:/#/etc/init.d/heartbeat start

I es veu que el ping es torna a perdre i torna a fer-se, també es comprova que la partició s’ha muntat en el servidor1 i que ja no està accesible des del servidor2.

Ara ja si que es pot dir que tenim el servidor redundant en marxa. Ara falta utilitzar-lo en algun servei, si puc més endavant penjaré en un nou post com muntar un servidor FTP amb usuari per MySQL sobre aquest sistema.

Webs d’interés
==============

http://www.drbd.org/users-guide/ –D’on he tret la instal·lació del DRBD
http://bytecoders.net/content/servidores-de-alta-disponibilidad-heartbeat.html –D’on he tret la instal·lació del HeartBeat
http://bytecoders.net/content/servidores-de-alta-disponibilidad-drbd.html –D’on he tret la instal·lació del HeartBeat
https://help.ubuntu.com/10.04/serverguide/C/drbd.html
http://www.howtoforge.com/drbd-on-centos-4.5