|
OpenFiler DRBD in High Availability
Benvenuti nella prima guida proposta dalla Quadrata, mi presento sono Dimitri Bellini e mi occupo di sistemi Ux da molto tempo. Oggi ho deciso di presentarvi una soluzione NAS/SAN in High Availabilty basata sulla distribuzione OpenFiler (www.openfiler.com). Ma come cos'e' un cluster in HA? Il termine HA significa ad “alta dispobinibilita'” quindi quando si ha bisogno di servizi come ad esempio il file sharing e' la soluzione ideale per garantire un livello di servizio molto alto anche il caso di guasto di un server.
Innanzitutto una configurazione di questo tipo prevede almeno due server con hardware uguale soprattutto a livello di dischi. Per realizzare questa speciale configurazione in cluster sono indispensabili questi due componenti software “Heartbeat” (www.linux-ha.org/heartbeat) e “DRBD” (www.drbd.org), il primo permette di verificare lo stato di ogni singolo server (nodo) all'interno del cluster, il secondo esegue in maniera costante la copia in sincrono/asincrono dei dati contenuti nei dischi tra i nodi. Di seguito riporto uno schema della nostra configurazione. Dopo aver accennato ad una breve spiegazione dello scenario, andiamo a vedere cosa e' necessario per poter ricreare il tutto in laboratorio. Non tutti possono avere due server a disposizione per poter creare un cluster, ma quasi tutti possono utilizzare ad esempio VirtualBox (www.virtualbox.org) per emulare due macchine identiche. Nella mia guida ho usato: VirtualBox V.2.1.2 OpenFiler 2.3
Ok. Partiamo con la configurazione delle macchine virtuali: 1 scheda di rete “Intel PRO/1000” configurata in “Host Interface” => questa sara' la nostra interfaccia primaria (eth0) la quale eroghera' I vari servizi sulla nostra rete locale. 1 scheda di rete “Intel PRO/1000” configuarata in “Internal Network” => questa svolgera la funzione di HeartBeat (eth1) 1 HardDisk Virtuale da 4 Gbyte per ospitare il Sistema Operativo 1 HardDisk Virtuale da 1 Gbyte per contenere la sola parte di dati storage
Per semplicita' ho chiamato le due macchine componenti il nostro cluster HA come “ofha01” e “ofha02”, la prima svolgera' la funzione di nodo primario la seconda sara' dormiente fino al momento allo “switch” dei servizi in caso di guasto. Dopo aver scaricato l'immagine ISO della distribuzione OpenFiler andiamo a montarla come CD-Rom sulla nostra prima macchina virtuale (ofha01). Seguiamo l'installazione standard della distribuzione fino al partizionamento delle unita' HD e partizioniamo nel seguente modo il primo disco (hda) nel seguente modo: 2 GB root partition (“/”) - Filesystem Type “Ext3” (hda1) 400 Mbyte minimo nessun mount point solo partizione (hda2) 1 GB swap partition (hda3) ed il secondo:
Proseguiamo e definiamo le due schede di rete come segue: ofha01
Completata l'installazione collegatevi all'interfaccia grafica di OpenFiler all'indirizzo “https://192.168.1.201:446” eseguite il login come “openfiler” password “password” e spostatevi sul tab del menu' “update” ed aggiornate con le ultime patch la distro. La cosa piu' semplice per creare la seconda macchina “ofha02” e' copiare i dischi virtuali creati con VirtualBox e creare una nuova istanza di VirtualBox col nome “ofha02” e modificare a mano le configurazioni per le schede di rete e nome hosts nell'etc della nuova macchina. Per il corretto funzionamento del cluster ogni nodo deve avere configurato il file “/etc/hosts” come segue: ofha01
127.0.0.1 localhost.localdomain localhost 192.168.1.201 ofha01 ofha01.quadrata.it 192.168.1.202 ofha02 ofha02.quadrata.it
ofha02
127.0.0.1 localhost.localdomain localhost 192.168.1.201 ofha01 ofha01.quadrata.it 192.168.1.202 ofha02 ofha02.quadrata.it
I due nodi devono poter dialogare usando ssh senza l'utilizzo di password quindi cioe' con chiavi condivise: su “ofha01” root@ofha01 ~# ssh-keygen -t dsa premere enter ad ogni prompt proposto (non vogliamo usare password) su “ofha02” root@ofha02 ~# ssh-keygen -t dsa premere enter ad ogni prompt proposto (non vogliamo usare password) Il comando precedente ha creato il file chiamato “id_dsa.pub” in “~/.ssh/”, il quale e' la chiave pubblica che dobbiamo scambiare con l'altro nodo: root@ofha01 ~# scp /root/.ssh/id_dsa.pub root@ofha02:/root/.ssh/authorized_keys2 root@ofha02 ~# scp /root/.ssh/id_dsa.pub root@ofha01:/root/.ssh/authorized_keys2 Adesso configuriamo DRBD Come detto in precedenza DRBD si occupa di sincronizzare I dati tra I nodi su “ohha01” root@ofha01 ~# mv /etc/drbd.conf /etc/drbd.conf.org Spostiamo la configurazione di default proposta da OpenFiler e creiamo la seguente: “/etc/drbd.conf” global { # minor-count 64; # dialog-refresh 5; # 5 seconds # disable-ip-verification; usage-count ask; }
common { syncer { rate 100M; } }
resource cluster_metadata {
protocol C;
handlers { pri-on-incon-degr "echo O > /proc/sysrq-trigger ; halt -f"; pri-lost-after-sb "echo O > /proc/sysrq-trigger ; halt -f"; local-io-error "echo O > /proc/sysrq-trigger ; halt -f"; # outdate-peer "/usr/sbin/drbd-peer-outdater"; }
startup { # wfc-timeout 0; degr-wfc-timeout 120; # 2 minutes. }
disk { on-io-error detach;
}
net { after-sb-0pri disconnect; after-sb-1pri disconnect; after-sb-2pri disconnect; rr-conflict disconnect; }
syncer { # rate 10M; # after "r2"; al-extents 257; }
on ofha01.quadrata.it { device /dev/drbd0; disk /dev/hda2; address 10.1.1.1:7788; meta-disk internal; }
on ofha02.quadrata.it { device /dev/drbd0; disk /dev/hda2; address 10.1.1.2:7788; meta-disk internal; } }
resource vg0drbd {
protocol C; startup { wfc-timeout 0; ## Infinite! degr-wfc-timeout 120; ## 2 minutes. } disk { on-io-error detach; }
net { # timeout 60; # connect-int 10; # ping-int 10; # max-buffers 2048; # max-epoch-size 2048; }
syncer { after "cluster_metadata"; }
on ofha01.quadrata.it { device /dev/drbd1; disk /dev/hdd1; address 10.1.1.1:7789; meta-disk internal; } on ofha02.quadrata.it { device /dev/drbd1; disk /dev/hdd1; address 10.1.1.2:7789; meta-disk internal; } } Come potete vedere il nome di ogni singolo nodo e' stato scritto per esteso cioe' compreso di dominio per verificare il vs nome host: root@ofha01 ~# uname -n Tutti e due I nodi devono avere la medesima configurazione di DRBD quindi: root@ofha01 ~# scp /etc/drbd.conf root@ofha02:/etc/drbd.conf Adesso dobbiamo inizializzare I metadata di DRBD su “/dev/drbd0” (cluster_metadata) e “/dev/drbd1” (vg0drbd) su entrambi I nodi: root@ofha01 ~# drbdadm create-md cluster_metadata root@ofha01 ~# drbdadm create-md vg0drbd root@ofha02 ~# drbdadm create-md cluster_metadata root@ofha02 ~# drbdadm create-md vg0drbd NB: Se eseguendo questi comandi vi trovate difronte al seguente errore: You need to either * use external meta data (recommended) * shrink that filesystem first * zero out the device (destroy the filesystem) Operation refused. Eseguite : dd if=/dev/zero of=/dev/hda1 bs=1M count=128 (hda1 metadata | hda2 vg0drbd) Attenzione alla partizione su cui eseguite il comando!!!! Prima di far partire il servizio DRBD, occorre esser certi che la partizione “hda2” non sia montata. Adesso eseguiamo lo script di start di DBD su entrambi I nodi: root@ofha01 ~# service drbd start root@ofha02 ~# service drbd start Se tutto e' andato liscio, col seguente comando dovreste vedere un output di questo tipo: root@ofha01 /# service drbd status drbd driver loaded OK; device status: version: 8.2.7 (api:88/proto:86-88) GIT-hash: 61b7f4c2fc34fe3d2acf7be6bcc1fc2684708a7d build by phil@fat-tyre, 2008-11-12 16:47:11 m:res cs st ds p mounted fstype 0:cluster_metadata Connected Secondary/Secondary Inconsistent/Inconsistent C 1:vg0drbd Connected Secondary/Secondary Inconsistent/Inconsistent C Una volta che entrabe le risorse DRBD sono connesse e entrambi I nodi sono in Secondary state (come sopra), definire il nodo Primary (nel nostro caso “ofha01”): root@ofha01 ~# drbdsetup /dev/drbd0 primary -o root@ofha01 ~# drbdsetup /dev/drbd1 primary -o Questo comando portera' al seguente risultato: root@ofha01 /# service drbd status drbd driver loaded OK; device status: version: 8.0.12 (api:86/proto:86) GIT-hash: 5c9f89594553e32adb87d9638dce591782f947e3 build by phil@mescal, 2008-04-24 13:29:44 m:res cs st ds p mounted fstype ... sync'ed: 17.9% (247232/297152)K 0:cluster_metadata SyncSource? Primary/Secondary UpToDate/Inconsistent C 1:vg0drbd PausedSyncS? Primary/Secondary UpToDate/Inconsistent C PS: Questo comando sincronizza I dischi dei due nodi chiaramente nel nostro caso sara' un operazione veloce, ma in condizioni reali potrebbe richiedere molto tempo. Abilitiamo DRBD al boot: root@ofha01 ~# chkconfig --level 2345 drbd on root@ofha02 ~# chkconfig --level 2345 drbd on Adesso dobbiamo creare il filesystem “cluster_metadata” (hda2) su cui verrano salvate tutte le configurazioni condivise dai due nodi per le risorse in HA (es. NFS, CIFS/SMB e iSCSI) root@ofha01 ~# mkfs.ext3 /dev/drbd0 NB: Attenzione il comando deve essere eseguito sul nodo primario (ofha01) altrimenti: mke2fs 1.40.8 (13-Mar-2008) mkfs.ext3: Wrong medium type while trying to determine filesystem size Non e' necessario includere questo mount point nel “/etc/fstab” verra' gestito da servizio di heartbeat (si configurera' piu' tardi) Configuarazione Partizione LVM Grazie a LVM (Logical Volume Manager) avremo la flessibilita' di cui ci serve per realizzare una NAS/SAN innazitutto dobbiamo creare “/dev/drbd1” come PV (Physical Volume) cioe' definiamo il disco fisico su cui appoggiare il “Volume Group” (insieme di volumi ficisi). Mettiamo mano al file “/etc/lvm/lvm.conf” (da eseguire su entrambi I nodi) Sostituiamo la riga: con filter = [ "r|/dev/hdd1|" ] Nel nostro caso con questa modifica abbiamo escluso “/dev/hdd1” perche' gia' utilizzato come device in DRBD “/dev/drbd1”. Creiamo il Physical Volume (da eseguire sul nodo primario, DRBD si occupera' di replicare la modifica sul secondo nodo) root@ofha01 /# pvcreate /dev/drbd1 Physical volume "/dev/drbd1" successfully created Configurazione di HeartBeat Come detto in precedenza, Heartbeat si occupa di gestire lo switch (scambio) risorse tra I due nodi questo processo viene detto “FailOver”. I due nodi eseguono heartbeat come servizio, il quale invia un segnale cosi' detto di heartbeat sull'interfaccia secondaria (eth1), se un nodo muore, HeartBeat rileva questo evento ed elegge il nodo secondario a primario eseguendo vari script di avvio che si trovano in “/etc/ha.d/resources.d” Per far cio' dobbiamo modificare I file “/etc/ha.d/ha.cf” e “/etc/ha.d/authkeys”. In “/etc/ha.d/authkeys” aggiungere o creare il file con questi comandi: auth 2 2 crc Restringiamo i permessi al file su entrambi I nodi. root@ofha01 ~# chmod 600 /etc/ha.d/authkeys root@ofha02 ~# chmod 600 /etc/ha.d/authkeys
Creaiamo il file “/etc/ha.d/ha.cf” su entrambi I nodi: debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 bcast eth1 keepalive 5 warntime 10 deadtime 120 initdead 120 udpport 694 auto_failback off node ofha01.quadrata.it node ofha02.quadrata.it Creazione dei file condivisi di OpenFiler Sulla partizione denominata “cluster_metadata” andiamo a creare/muovere I file di configurazione per I servizi che vogliamo rendere disponibili in HA, per far cio' usere dei link simboligi verso I path originari: ofha01: root@ofha01 ~# mkdir /cluster_metadata root@ofha01 ~# mount /dev/drbd0 /cluster_metadata root@ofha01 ~# mv /opt/openfiler/ /opt/openfiler.local root@ofha01 ~# mkdir /cluster_metadata/opt root@ofha01 ~# cp -a /opt/openfiler.local /cluster_metadata/opt/openfiler root@ofha01 ~# ln -s /cluster_metadata/opt/openfiler /opt/openfiler root@ofha01 ~# rm /cluster_metadata/opt/openfiler/sbin/openfiler root@ofha01 ~# ln -s /usr/sbin/httpd /cluster_metadata/opt/openfiler/sbin/openfiler root@ofha01 ~# rm /cluster_metadata/opt/openfiler/etc/rsync.xml root@ofha01 ~# ln -s /opt/openfiler.local/etc/rsync.xml /cluster_metadata/opt/openfiler/etc/ NB: Probabilmente avrete qualche problema nel spostare la directory “/var/lib/nfs”, per ovviare a tale problema eseguite il comando “mv /var/lib/nfs /var/lib/nfs.old” e poi "ln -s /cluster_metadata/var/lib/nfs/ /var/lib/nfs" su entrami I nodi Editiamo il file “/opt/openfiler.local/etc/rsync.xml” <?xml version="1.0" ?> <rsync> <remote hostname="10.1.1.2"/> ## IP address of peer node. <item path="/etc/ha.d/haresources"/> <item path="/etc/ha.d/ha.cf"/> <item path="/etc/ldap.conf"/> <item path="/etc/openldap/ldap.conf"/> <item path="/etc/ldap.secret"/> <item path="/etc/nsswitch.conf"/> <item path="/etc/krb5.conf"/> </rsync> Questo file permette il sincronismo dei file di configurazione eseguiti sul nodo primario verso quello di failover (ofha02) ed in oltre creiamo la directory: root@ofha01 ~# mkdir -p /cluster_metadata/etc/httpd/conf.d ofha02: root@ofha02 ~# mkdir /cluster_metadata root@ofha02 ~# mv /opt/openfiler/ /opt/openfiler.local root@ofha02 ~# ln -s /cluster_metadata/opt/openfiler /opt/openfiler Modifichiamo il file di sincronisco anche su questo nodo “/opt/openfiler.local/etc/rsync.xml”: <?xml version="1.0" ?> <rsync> <remote hostname="10.1.1.1"/> ## IP address of peer node. <item path="/etc/ha.d/haresources"/> <item path="/etc/ha.d/ha.cf"/> <item path="/etc/ldap.conf"/> <item path="/etc/openldap/ldap.conf"/> <item path="/etc/ldap.secret"/> <item path="/etc/nsswitch.conf"/> <item path="/etc/krb5.conf"/> </rsync> Configurazione del Cluster HeartBeat Modifichiamo il file di configurazione “/cluster_metadata/opt/openfiler/etc/cluster.xml”. Questo file genera a sua volta il file “/etc/ha.d/haresources”, il quale descrive I passi da intraprendere nel caso di failover a HeartBeat. Ofha01 (da eseguire solo su questo nodo): <?xml version="1.0" ?> <cluster> <clustering state="on" /> <nodename value="ofha01.quadrata.it"/> <resource value="MailTo::
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
::ClusterFailover" /> <resource value="IPaddr::192.168.1.200/32" /> <resource value="drbddisk::" /> <resource value="LVM::vg0drbd" /> <resource value="Filesystem::/dev/drbd0::/cluster_metadata::ext3::defaults,noatime" /> <resource value="MakeMounts" /> </cluster> Come potete vedere il servizio di HA crea un IP virtuale su cui dovremo puntare per accere ai vari servizi.
Serizi Samba e NFS Modifichiamo i seguenti file per rendere i sopra citati servizi in HA: ofha01: root@ofha01~# mkdir /cluster_metadata/etc root@ofha01 ~# mv /etc/samba/ /cluster_metadata/etc/ root@ofha01 ~# ln -s /cluster_metadata/etc/samba/ /etc/samba root@ofha01 ~# mkdir -p /cluster_metadata/var/spool root@ofha01 ~# mv /var/spool/samba/ /cluster_metadata/var/spool/ root@ofha01 ~# ln -s /cluster_metadata/var/spool/samba/ /var/spool/samba root@ofha01 ~# mkdir -p /cluster_metadata/var/lib root@ofha01 ~# mv /var/lib/nfs/ /cluster_metadata/var/lib/ root@ofha01 ~# ln -s /cluster_metadata/var/lib/nfs/ /var/lib/nfs root@ofha01 ~# mv /etc/exports /cluster_metadata/etc/ root@ofha01 ~# ln -s /cluster_metadata/etc/exports /etc/exports Attenzione: col comando precedente abbiamo spostato "/var/spool/samba" sotto "cluster_metadata", il quale filesystem ha come capacita' solo 400 Mbyte, Quindi se abbiamo intenzione di usare Samba come coda di Job per la stampa mettiamo in conto la probabilita' di incorrere in problemi di saturazione. Per ovviare a questo problema o creiamo una nuova risorsa DRBD oppure usamo un'altro server. Ofha02: root@ofha02 ~# rm -rf /etc/samba/ root@ ofha02 ~# ln -s /cluster_metadata/etc/samba/ /etc/samba root@ofha02 ~# rm -rf /var/spool/samba/ root@ofha02 ~# ln -s /cluster_metadata/var/spool/samba/ /var/spool/samba root@ofha02 ~# rm -rf /var/lib/nfs/ root@ofha02 ~# ln -s /cluster_metadata/var/lib/nfs/ /var/lib/nfs root@ofha02 ~# rm -rf /etc/exports root@ofha02 ~# ln -s /cluster_metadata/etc/exports /etc/exports Supporto iSCSI : ofha01: root@ofha01~# mv /etc/ietd.conf /cluster_metadata/etc/ root@ofha01 ~# ln -s /cluster_metadata/etc/ietd.conf /etc/ietd.conf root@ ofha01 ~# mv /etc/initiators.allow /cluster_metadata/etc/ root@ofha01 ~# ln -s /cluster_metadata/etc/initiators.allow /etc/initiators.allow root@ofha01 ~# mv /etc/initiators.deny /cluster_metadata/etc/ root@ofha01 ~# ln -s /cluster_metadata/etc/initiators.deny /etc/initiators.deny ofha02: root@ofha02 ~# rm /etc/ietd.conf root@ofha02 ~# ln -s /cluster_metadata/etc/ietd.conf /etc/ietd.conf root@ofha02 ~# rm /etc/initiators.allow root@ofha02 ~# ln -s /cluster_metadata/etc/initiators.allow /etc/initiators.allow root@ofha02 ~# rm /etc/initiators.deny root@ofha02 ~# ln -s /cluster_metadata/etc/initiators.deny /etc/initiators.deny Supporto FTP: ofha01: root@ofha01 ~# mv /etc/proftpd /cluster_metadata/etc/ root@ofha01 ~# ln -s /cluster_metadata/etc/proftpd/ /etc/proftpd ofha02: root@ofha02 ~# rm -rf /etc/proftpd root@ofha02 ~# ln -s /cluster_metadata/etc/proftpd/ /etc/proftpd Configurazione del Volume Group ofha01: Creazione del Volume Group utilizzando “/dev/drbd1”: root@ofha01 etc# vgcreate vg0drbd /dev/drbd1
Volume group "vg0drbd" successfully created Attenzione: Se avete intenzione di utilizzare Windows per connetervi alla risorsa iSCSI target creata, non utlizzate I caratteri “_” o qualsiasi altro carattere speciale quando definite il nome del Volume Group. Una volta che il servizio di HeartBeat sara' attivo, I servizi web di OpenFiler saranno disponibili all'IP https://192.168.1.200:446. Tramite questa interfaccia potrete creare I volumi LVM da esportare come iSCSI. Avviare HeartBeat e prima configurazione: Per forzare OpenFiler a creare il file “/etc/ha.d/haresource” basato sul file “cluster.xml”, occorre restartare il servizio OpenFiler. E successivamente entrare sull'interfaccia del primo nodo (192.168.1.201) e abiltare il servizio iSCSI. Attenzione ad eseguire questi comandi sul mo primario (ofha01) root@ofha01~# rm /opt/openfiler/etc/httpd/modules root@ofaha01 ~# ln -s /usr/lib64/httpd/modules /opt/openfiler/etc/httpd/modules NB: se il vs sistema e a 32bit non eseguite la seconda riga root@ofha01 ~# service openfiler restart Se tutto e' andato bene dovreste avere il file “/etc/ha.d/haresources”, in questo caso copiate il file anche sul nodo secondario (ofha02). Prima di avviare il servizio HeartBeat dobbiamo creare un “Logial Volume” come ad esempio: root@ofha01 ~# lvcreate -L 400M -n filer vg0drbd Come detto in precedenza andando via interfaccia Web su OpenFiler e attivando I servizi NTF o Samba verra' creato il file “/etc/ha.d/haresources” questo file dovra essere copiato su “ofha02”. root@ofha01 ~# scp /etc/ha.d/haresources root@ofha02:/etc/ha.d/haresources Adesso sara' possibile riavviare il server “ofha01” e successivamente “ofha02”. Se tutto e' andato liscio collegatevi all'indirizzo https://192.168.1.200 Ricordo che il file di log per il cluster I HA possono essere trovati sotto “/var/logha-debug” e “/var/log/ha-log”. NB: Rsync sara' utile per poter sincronizzare tutti questi file legati al cluster, ma questo potrebbe non accadere se non usiamo una delle ultime versioni. Se cosi' fosse date un occhiata a questo workaround https://forums.openfiler.com/viewtopic.php?id=2380 Una volta che Openfiler e' Up & Running, cancellate il volume creato in precedenza come “filer” e create I vs nuovi volumi (prima di stoppare il servizio di heartbeat create I vs nuovi volumi altrimenti il servizio non partira al prossimo riavvio). Per Verificare il correto switch tra I nodi potete utilizare il seguente script “/usr/lib/heartbeat/hb_standby”. Bibliografia: La mia guida e' basata sull'ottimo HowTo pubblicato al seguente indirizzo http://www.howtoforge.com/installing-and-configuring-openfiler-with-drbd-and-heartbeat-p2 Ringrazio il superbo lavoro fatto dal team di OpenFiler (www.openfiler.com)
|