Cluster Web · 10 min read · Sep 10, 2025
Il Perfetto Cluster Web Bilanciato e ad Alta Disponibilità con 2 Server che Eseguono Xen su Ubuntu 8.04 Hardy Heron
Il Perfetto Cluster Web Bilanciato e ad Alta Disponibilità con 2 Server che Eseguono Xen su Ubuntu 8.04 Hardy Heron
Introduzione
Questo è un copia e incolla dal mio sito: blogama.org
In questo howto costruiremo un cluster web bilanciato e ad alta disponibilità su 2 server reali con Xen, heartbeat e ldirectord. Il cluster gestirà http, mail, DNS, database MySQL e sarà completamente monitorato. Questo è attualmente utilizzato su un server di produzione con un paio di siti web.
L’obiettivo di questo tutorial è raggiungere il bilanciamento del carico e l’alta disponibilità con il minor numero possibile di server reali e, naturalmente, con software open-source. Più server significano più costi hardware e di hosting.
La maggior parte delle informazioni che troverai qui sono state copiate/incollate da una dozzina di howto, molti di essi da howtoforge.com, ma alcuni dettagli importanti sono stati modificati per rendere tutto possibile e mettere tutto insieme.
Ecco un elenco rapido di servizi e applicazioni che saranno installati:
- Apache
- MySQL + phpmyadmin
- Postfix (SMTP) con configurazione utenti basata sul web e Spamassassin
- Courier (IMAP & POP) e squirrelmail
- Bind (server DNS)
- Munin e monit per monitoraggio basato sul web
- Script fatti in casa per il monitoraggio
Cosa ti serve
2 server con doppia lan, almeno 7 IP. Gli IP saranno utilizzati in questo modo:
- dom01.example.com : 192.168.1.100
- dom02.example.com : 192.168.1.101
- lb1.example.com : 192.168.1.102
- lb2.example.com : 192.168.1.103
- web1.example.com : 192.168.1.104
- web2.example.com : 192.168.1.105
- example.com : 192.168.1.106
- yousite.com (opzionale) : 192.168.1.107
Dom0 sarà separato dai bilanciatori di carico e dai server web. Non l’ho provato, ma credo che sarebbe possibile mettere i bilanciatori di carico su Dom0.
Suggerisco almeno 2GB di RAM e dischi rigidi RAID 1 o 10 per un server di produzione.
Limitazioni
Questo ha funzionato per me. Non significa che funzionerà per te, ma stai tranquillo che il howto è stato testato al 100% per funzionare su un server di produzione e di test!
Questa configurazione è scalabile su 2 server, ma dovrai trovare un altro modo per la replica MySQL se lo fai.
Nessun pannello di controllo come ISPConfig, CPanel, ecc…
Alcuni siti web possono rompere la replica MySQL Master to Master. È successo a me con Drupal, ma l’ho risolto disabilitando la cache o impostando una durata minima della cache. Ti prego di leggere questo prima di andare oltre:
A: La replica MySQL attualmente non supporta alcun protocollo di blocco tra master e slave per garantire l’atomicità di un aggiornamento distribuito (cross-server). In altre parole, è possibile che il client A faccia un aggiornamento al co-master 1, e nel frattempo, prima che si propaghi al co-master 2, il client B potrebbe fare un aggiornamento al co-master 2 che fa sì che l’aggiornamento del client A funzioni in modo diverso rispetto a come ha fatto su co-master 1. Pertanto, quando l’aggiornamento del client A arriva al co-master 2, produce tabelle che sono diverse da quelle che hai su co-master 1, anche dopo che tutti gli aggiornamenti da co-master 2 si sono propagati. Questo significa che non dovresti collegare due server insieme in una relazione di replica bidirezionale a meno che tu non sia sicuro che i tuoi aggiornamenti possano avvenire in qualsiasi ordine, o a meno che tu non gestisca in qualche modo gli aggiornamenti disordinati nel codice client.
1. Installazione di Ubuntu
Fai un’installazione di base di Ubuntu 8.04 LTS server edition.
Se vuoi installare con software RAID 1, ti prego di leggere questo howto che ho scritto:
Installa Ubuntu 8.04 con software raid 1
2. Installazione di Xen
Puoi eseguire Xen da file immagine o da partizione dedicata. Entrambi hanno pro e contro.
Da file immagine, l’I/O del disco è più lento, ma è più facile fare backup e gestire. È l’opposto quando si lavora su una partizione.
Quello che suggerisco di fare è iniziare con un file immagine e finire con una partizione quando la tua configurazione è completata. In questo modo puoi fare backup dei tuoi file immagine e ripristinare se necessario durante i test.
Per installare su file immagine, ti prego di fare riferimento a questo ottimo tutorial del maestro howto Falko:
Installazione di Xen su un server Ubuntu 8.04 (Hardy Heron) dai repository di Ubuntu
Per installare direttamente su una partizione (la mia versione modificata del howto di Falko):
XEN ad Alte Prestazioni su un Sistema Server Ubuntu Hardy Heron (8.04) AMD64 o i386
Devi creare 2 domini Xen su ciascun server (dom01 e dom02 sono Dom0 o controller VM):
server #1 - dom01.example.com
lb1.example.com (256MB RAM - 5GB HD è sufficiente)
ip : 192.168.1.102
web1.example.com
(quanto più RAM, meglio è, lascia 512MB per Dom0)
ip : 192.168.1.104
server #2 - dom02.example.com
lb2.example.com (256MB RAM - 5GB HD è sufficiente)
ip : 192.168.1.103
web2.example.com (quanto più RAM, meglio è, lascia 512MB per Dom0)
ip : 192.168.1.105
3. Creazione di Bridge Xen per trasferimenti di dati locali (opzionale)
Per impostazione predefinita, solo una scheda di rete è abilitata sulla macchina virtuale con Xen. Per trasferimenti locali come rsync, replica MySQL e backup, utilizzo un cavo incrociato gigabit tra i 2 server. Non è necessario, ma farà risparmiare costi di larghezza di banda e la replica sarà più veloce.
Ti prego di fare riferimento a questo howto per creare bridge xen:
Creazione di nuovi bridge xen su Ubuntu 8.04
In questo howto, gli IP utilizzati sulla seconda scheda di rete (incrociata) saranno i seguenti:
- dom01.example.com : 192.168.0.100
- dom02.example.com : 192.168.0.101
- lb1.example.com : 192.168.0.102
- lb2.example.com : 192.168.0.103
- web1.example.com : 192.168.0.104
- web2.example.com : 192.168.0.105
4. Preparazione dei nodi (dom01, dom02, lb1, lb2, web1, web2)
4.1 Installazione del server openssh e VIM
Esegui:
sudo su apt-get install vim ssh openssh-server
4.2 Aggiornamento dei repository
mv /etc/apt/sources.list /etc/apt/sources.list.bak
vi /etc/apt/sources.list
Fai in modo che sources.list appaia così:
#
# deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ - Release i386 (20080423.2)]/ hardy main restricted
#deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ - Release i386 (20080423.2)]/ hardy main restricted
# Vedi http://help.ubuntu.com/community/UpgradeNotes per come aggiornare a
# versioni più recenti della distribuzione.
deb http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
## Aggiornamenti di correzione bug principali prodotti dopo il rilascio finale della
## distribuzione.
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
## N.B. il software di questo repository è COMPLETAMENTE NON SUPPORTATO dal team di Ubuntu,
## e potrebbe non essere sotto una licenza libera. Ti preghiamo di soddisfare te stesso riguardo ai
## tuoi diritti di utilizzare il software. Inoltre, ti preghiamo di notare che il software in
## universe NON RICEVERÀ alcuna revisione o aggiornamenti dal team di sicurezza di Ubuntu.
deb http://de.archive.ubuntu.com/ubuntu/ hardy universe
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy universe
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates universe
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates universe
## N.B. il software di questo repository è COMPLETAMENTE NON SUPPORTATO dal team di Ubuntu,
## e potrebbe non essere sotto una licenza libera. Ti preghiamo di soddisfare te stesso riguardo ai
## tuoi diritti di utilizzare il software. Inoltre, ti preghiamo di notare che il software in
## multiverse NON RICEVERÀ alcuna revisione o aggiornamenti dal team di sicurezza di Ubuntu.
deb http://de.archive.ubuntu.com/ubuntu/ hardy multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy multiverse
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
## Decommenta le seguenti due righe per aggiungere software dal repository 'backports'
## N.B. il software di questo repository potrebbe non essere stato testato come
## ampiamente come quello contenuto nella versione principale, sebbene includa
## versioni più recenti di alcune applicazioni che potrebbero fornire funzionalità utili.
## Inoltre, ti preghiamo di notare che il software in backports NON RICEVERÀ alcuna revisione
## o aggiornamenti dal team di sicurezza di Ubuntu.
# deb http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
# deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
## Decommenta le seguenti due righe per aggiungere software dal repository 'partner' di Canonical.
## Questo software non fa parte di Ubuntu, ma è
## offerto da Canonical e dai rispettivi fornitori come servizio agli utenti di Ubuntu.
# deb http://archive.canonical.com/ubuntu hardy partner
# deb-src http://archive.canonical.com/ubuntu hardy partner
deb http://security.ubuntu.com/ubuntu hardy-security main restricted
deb-src http://security.ubuntu.com/ubuntu hardy-security main restricted
deb http://security.ubuntu.com/ubuntu hardy-security universe
deb-src http://security.ubuntu.com/ubuntu hardy-security universe
deb http://security.ubuntu.com/ubuntu hardy-security multiverse
deb-src http://security.ubuntu.com/ubuntu hardy-security multiverseOra fai:
apt-get update
apt-get upgrade
4.3 Modifiche
/bin/sh è un symlink a /bin/dash, tuttavia abbiamo bisogno di /bin/bash, non di /bin/dash. Pertanto facciamo questo:
ln -sf /bin/bash /bin/sh
Disabiliteremo AppArmor (su dom01 e dom02) facendo quanto segue:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
5. Configurazione di rete (dom01, dom02, lb1, lb2, web1, web2)
5.1 Impostazione degli IP
Per modificare la configurazione di rete sotto Ubuntu fai:
vi /etc/network/interfaces
Ora faremo ciascuna configurazione di rete una alla volta. Presumo che tu utilizzi 2 schede di rete, eth0 è quella connessa a Internet e eth1 quella con il cavo incrociato. Non scriverò il file di configurazione individualmente, solo per dom01.example.com, ti prego di modificare di conseguenza a questo elenco:
dom01.example.com
eth0 : 192.168.1.100
eth1 : 192.168.0.100
dom02.example.com
eth0 : 192.168.1.101
eth1 : 192.168.0.101
lb1.example.com
eth0 : 192.168.1.102
eth1 : 192.168.0.102
lb2.example.com
eth0 : 192.168.1.103
eth1 : 192.168.0.103
web1.example.com
eth0 : 192.168.1.104
eth1 : 192.168.0.104
web2.example.com
eth0 : 192.168.1.105
eth1 : 192.168.0.105
Esempio di configurazione di rete di dom01.example.com:
Fai in modo che il file /etc/network/interfaces appaia così:
# Questo file descrive le interfacce di rete disponibili sul tuo sistema
# e come attivarle. Per ulteriori informazioni, vedere interfaces(5).
# L'interfaccia di rete di loopback
auto lo
iface lo inet loopback
# L'interfaccia di rete principale connessa a Internet
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
# L'interfaccia di rete secondaria connessa tramite un cavo incrociato all'altro server
auto eth1
iface eth1 inet static
address 192.168.0.100
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255Ora salva il file e fai:
/etc/init.d/networking restart
5.2 Nome host
vi /etc/hosts
e fai in modo che appaia così, altrimenti avrai problemi con ldirectord più avanti:
dom01.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.102 lb1.example.com lb1
192.168.1.103 lb2.example.com lb2
192.168.1.104 web1.example.com web1
192.168.1.105 web2.example.com web2
# Le seguenti righe sono desiderabili per host compatibili con IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho dom01.example.com > /etc/hostname
/etc/init.d/hostname.sh start
dom02.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 dom02.example.com dom02
192.168.1.100 dom01.example.com dom01
192.168.1.102 lb1.example.com lb1
192.168.1.103 lb2.example.com lb2
192.168.1.104 web1.example.com web1
192.168.1.105 web2.example.com web2
# Le seguenti righe sono desiderabili per host compatibili con IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho dom02.example.com > /etc/hostname
/etc/init.d/hostname.sh start
lb1.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 lb1.example.com lb1
192.168.1.100 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.103 lb2.example.com lb2
192.168.1.104 web1.example.com web1
192.168.1.105 web2.example.com web2
# Le seguenti righe sono desiderabili per host compatibili con IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho lb1.example.com > /etc/hostname
/etc/init.d/hostname.sh start
lb2.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 lb2.example.com lb2
192.168.1.100 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.102 lb1.example.com lb1
192.168.1.104 web1.example.com web1
192.168.1.105 web2.example.com web2
# Le seguenti righe sono desiderabili per host compatibili con IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho lb2.example.com > /etc/hostname
/etc/init.d/hostname.sh start
web1.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 web1.example.com web1
192.168.1.100 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.102 lb1.example.com lb1
192.168.1.103 lb2.example.com lb2
192.168.1.105 web2.example.com web2
# Le seguenti righe sono desiderabili per host compatibili con IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho web1.example.com > /etc/hostname
/etc/init.d/hostname.sh start
web2.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 web2.example.com web2
192.168.1.100 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.102 lb1.example.com lb1
192.168.1.103 lb2.example.com lb2
192.168.1.104 web1.example.com web1
# Le seguenti righe sono desiderabili per host compatibili con IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho web2.example.com > /etc/hostname
/etc/init.d/hostname.sh start
6. Installazione del software (dom01, dom02, lb1, lb2, web1, web2)
Esegui:
apt-get install binutils cpp fetchmail flex gcc libarchive-zip-perl libc6-dev libcompress-zlib-perl libdb4.3-dev libpcre3 libpopt-dev lynx m4 make ncftp nmap openssl perl perl-modules unzip zip zlib1g-dev autoconf automake1.9 libtool bison autotools-dev g++ build-essential
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.