Unix Clusters

Il sistema operativo Unix offre, da sempre, un ambiente efficiente e flessibile per lo sviluppo delle applicazioni. I sistemi Unix sono utilizzati efficacemente come server per applicazioni dipartimentali e per servizi di rete.

La sempre maggiore dei sistemi aperti e l'evoluzione tecnologica hanno portato alla possibilita' di offrire su Unix, con costi contenuti e prestazioni altissime, applicazioni e servizi di livello enterprise per le aziende. Tali applicazioni richiedono pero' un'affidabilita' molto elevata, superiore a quella dell'HW utilizzato. Il fault di una scheda di rete, di un disco o di un intero sistema non possono compromettere le attivita' aziendali. Per tale ragione sono stati sviluppati software che consentono di aumentare l'affidabilita' dei componenti che gestiscono i diversi tipi di fault possibili. Tra questi i Failover Cluster sono naturalmente i piu' importanti per garantire l'alta affidabilita' (HA: High Availability).

Cluster

Un cluster e' un'infrastruttura che consente fornire servizi in condizioni di alta affidabilita'. Fanno parte del cluster una serie di sistemi, generalmente detti nodi, che ospitano applicazioni generalmente dette servizi. In caso di fault i servizi sono in grado di migrare ed essere eseguiti su un nodo differente (failover). Naturalmente tutte le connessioni al servizio vengono perdute al momento del fault, ma queste possono riprendere non appena il servizio viene riprestinato sul nodo alternativo. Questo generalmente avviene in pochi secondi o alcuni minuti a seconda della complessita' del servizio.

I prodotti di clustering possono differire parecchio tra loro ma le caratteristiche ed i concetti di base sono comuni.
I nodi condividono una serie di risorse che vengono di volta in volta assegnate al nodo che ospita il servizio che le richiede. Si tratta generalmente di dischi e volumi in configurazione dual host o multi homed ovvero accedibili da piu' server (shared storage). I servizi sono generalmente associati ad un indirizzo di rete virtuale, anche questo viene assegnato dinamicamente al nodo che ospita il servizio. I nodi "parlano" tra loro mediante le connessioni di rete pubblica ma anche attraverso connessioni dedicate dette HeartBeat. Tramite queste connessioni il cluster e' sempre in grado di controllare il corretto funzionamento di tutti i nodi e di tutti i servizi. Al fine di evitare l'attivazione degli stessi servizi su server differenti, nel caso di caduta di tutte le connessioni di rete, vengono utilizzati meccanismi di "maggioranza" (eg. quorum partition).
Particolarmente grave e' infatti la situazione di split brain che occorre quando viene partizionato il cluster e che puo' portare alla corruzione di dati.


Cluster con dischi in SAN

Nelle configurazioni di maggiori dimensioni e con piu' nodi la soluzione preferita e' l'utilizzo di storage in SAN.
La prima immagine riporta la tipica configurazione di un sistema in cluster in cui un'applicazione e' in grado di migrare tra i diversi nodi.

Le figure seguenti riportano invece la parte di accesso allo storage che puo' essere connesso SCSI in multi-homed o con device "intelligenti". La configurazione in SAN con fibra, attualmente la piu' diffusa, o in iSCSI sono analoghe.

Perdonate: ho rubato un paio di figure... ma non sono riuscito a farne di migliori!

Una volta configurato e certificato, cosa che richiede competenze tecniche specifiche ed esperienza, un cluster e' di semplice utilizzo e puo' essere gestito normalmente da operatori. Le attivita' piu' comuni sono il controllo dei servizi attivi e l'eventuale migrazione di questi quando e' necessario svolgere un'attivita' di manutenzione su un nodo del cluster.
Quando sono presenti piu' nodi e servizi un soluzione in cluster e' molto efficace per bilanciare il carico delle applicazioni.

Prodotti di Cluster su Unix

Sul mercato sono disponibili diverse soluzioni cluster. Tra le principali ricordiamo:

Altre soluzioni, tecnicamente differenti, ma con alcune funzionalita' simili a quelle dei failover cluster sono: VMware HA, Oracle VM, ...

Qualche comando...

Non potevo esimermi dal compilare una lista pratica di comandi!
Ogni cluster ha una sua terminologia... ne ho adottato una comune che utilizza i termini node e serv.

Stato cluster Start di un servizio Stop di un servizio Switch di un servizio Stop del cluster e dei servizi Dettaglio configurazione File di configurazione

VCS
hastatus -sum hagrp -online serv -sys node hagrp -offline serv -sys node hagrp -switch serv -to node hastop -all hasys -display
hagrp -display
hares -display
/etc/VRTSvcs/conf/config/main.cf

ServiceGuard
cmviewcl cmrunpkg [-n node] serv cmhaltpkg [-n node] serv cmhaltcl cmviewcl -v /etc/cmcluster/cluster.ascii
/etc/cmcluster/serv/serv.ascii

HACMP/PowerHA
clstat -a cldare -M serv:node cldare -M serv:stop cldare -M serv:node clstop -y -N -g cllsgrp
clshowres
/usr/es/sbin/cluster/

SUN Cluster
scstat -p scswitch -Z -g serv scswitch -F -g serv scshutdown scrgadm -p; scconf -p /etc/clusters

RH Cluster Suite
clustat clusvcadm -e serv clusvcadm -d serv clusvcadm -r serv service cman stop /etc/cluster/cluster.conf

HA 1.2
heartbeat status /etc/rc.d/init.d/serv start /etc/rc.d/init.d/serv stop /etc/rc.d/init.d/heartbeat stop /etc/ha.d/ha.cf
/etc/ha.d/haresources

Pacemaker
heartbeat status /etc/rc.d/init.d/serv start /etc/rc.d/init.d/serv stop /etc/rc.d/init.d/heartbeat stop /etc/ha.d/ha.cf
/etc/ha.d/haresources

Tru64 CAA
caa_stat -t -v caa_start serv caa_stop serv caa_relocate serv -c node caa_stat -f /var/cluster/caa/profile
/var/cluster/caa/script/*

Tru64 ASE
asemgr -d asemgr -s serv [node] asemgr -x serv asemgr -r serv [node] asemgr -d /usr/var/ase/config

Oracle Grid
srvctl status database -d dbname

srvctl status asm

srvctl start database -d dbname srvctl stop database -d dbname srvctl config

srvctl config asm

Altre tabelle: Cheat Sheet in verticale e in PDF PDF

Maggiori dettagli si trovano nei documenti specifici: Disegno di un Cluster, Veritas ClusterServer, Amministrare Veritas ClusterServer, HP ServiceGuard, RedHat Cluster Suite, Digital/HP Available Server Environment.

Tips and tricks

Le configurazioni in cluster sono complesse... meglio affrontarle con un buon bagaglio di esperienza. Per questo possono essere utili alcuni suggerimenti!

Test e certificazione cluster sono fondamentali per verificare effettivamente il corretto comportamento del sistema. Ovviamente debbono essere svolti in modo esaustivo e prima di ospitare ambienti di produzione. Nella mia esperienza non ho mai eseguito un test che non abbia trovato almeno un problema (anche se non grave) e molte, molte volte ho trovato configurazioni di cluster "in produzione" che non sarebbero stati in grado di superare anche i test piu' banali.

Aggiornamento e patching sono importanti ma vanno effettuati con notevole attenzione. In particolare e' opportuno partire da una configurazione completamente certificata ed il piu' possibile aggiornata. Gli upgrade successivi vanno invece pianificati ed effettuati solo se effettivamente necessari.

Sono da verificare con attenzione eventuali conflitti tra i servizi. Per esempio le basi dati sono spesso in ascolto su una specifica porta TCP. Con un cluster vanno utilizzate porte differenti per servizio.

Le configurazioni in cluster funzionano benissimo con i Firewall. Pero' la configurazione deve essere quella corretta.
In particolare per accedere dall'esterno ad un servizio (eg. un MySQL) andra' abilitata in ingresso la porta 3306 sull'IP del servizio.
Se invece da un servizio cluster si accede ad un DB esterno andranno abilitati tutti gli IP dei nodi poiche' la richiesta potrebbe provenire da ciascuno di questi.

L'accesso SSH ad un servizio funziona benissimo ma... nel caso di switch del servizio ovviamente cambia il server e l'SSH si accorge della differenza (e blocca l'accesso per evitare il Man-in-the-meddle).
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no myUser@myHost.MyDomain


Testo: Unix Clusters
Data: 1 Novembre 2003
Versione: 1.0.16 - 14 Febbraio 2013 ❤️ San Valentino
Autore: mail@meo.bogliolo.name