Questo tutorial mostra come configurare uno storage ad alta disponibilità con due server di storage (Ubuntu 12.10) che utilizzano GlusterFS. Ciascun server di archiviazione sarà un mirror dell'altro server di archiviazione e i file verranno replicati automaticamente su entrambi i server di archiviazione. Il sistema client (anche Ubuntu 12.10) sarà in grado di accedere allo storage come se fosse un filesystem locale. GlusterFS è un file system in cluster in grado di scalare a diversi peta-byte. Aggrega vari blocchi di archiviazione su Infiniband RDMA o interconnessione TCP/IP in un unico file system di rete parallelo di grandi dimensioni. I mattoni di archiviazione possono essere realizzati con qualsiasi hardware di consumo come server x86_64 con RAID SATA-II e HBA Infiniband.
Non garantisco che questo funzionerà per te!
1 Nota preliminare
In questo tutorial utilizzo tre sistemi, due server e un client:
- server1.example.com:indirizzo IP 192.168.0.100 (server)
- server2.example.com:indirizzo IP 192.168.0.101 (server)
- client1.example.com:indirizzo IP 192.168.0.102 (client)
Poiché eseguiremo tutti i passaggi di questo tutorial con i privilegi di root, possiamo anteporre tutti i comandi in questo tutorial con la stringa sudo, oppure diventare root in questo momento digitando
sudo su
Tutti e tre i sistemi dovrebbero essere in grado di risolvere i nomi host degli altri sistemi. Se ciò non può essere fatto tramite DNS, dovresti modificare il file /etc/hosts in modo che appaia come segue su tutti e tre i sistemi:
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost 192.168.0.100 server1.example.com server1 192.168.0.101 server2.example.com server2 192.168.0.102 client1.example.com client1 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts |
(È anche possibile utilizzare indirizzi IP invece di nomi host nella configurazione seguente. Se preferisci utilizzare indirizzi IP, non devi preoccuparti se i nomi host possono essere risolti o meno.)
2 Configurazione dei server GlusterFS
server1.example.com/server2.example.com:
GlusterFS è disponibile come pacchetto per Ubuntu 12.10, quindi possiamo installarlo come segue:
apt-get install glusterfs-server
Il comando
glusterfsd --version
ora dovrebbe mostrare la versione GlusterFS che hai appena installato (3.2.5 in questo caso):
[email protected]:~# glusterfsd --version
glusterfs 3.2.5 built on Jan 31 2012 07:39:58
Repository revision: git://git.gluster.com/glusterfs.git
Copyright (c) 2006-2011 Gluster Inc. <http://www.gluster.com>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.
[email protected]:~#
Se utilizzi un firewall, assicurati che le porte TCP 111, 24007, 24008, 24009-(24009 + numero di mattoni su tutti i volumi) siano aperte su server1.example.com e server2.example.com.
Successivamente dobbiamo aggiungere server2.example.com al pool di archiviazione attendibile (si noti che sto eseguendo tutti i comandi di configurazione GlusterFS da server1.example.com, ma puoi anche eseguirli da server2.example.com perché la configurazione è replicato tra i nodi GlusterFS - assicurati solo di utilizzare i nomi host o gli indirizzi IP corretti):
server1.example.com:
Su server1.example.com, esegui
gluster peer probe server2.example.com
[email protected]:~# gluster peer probe server2.example.com
Probe successful
[email protected]:~#
Lo stato del pool di archiviazione attendibile dovrebbe ora essere simile a questo:
gluster peer status
[email protected]:~# gluster peer status
Number of Peers: 1
Hostname: server2.example.com
Uuid: 7cd93007-fccb-4fcb-8063-133e6ba81cd9
State: Peer in Cluster (Connected)
[email protected]:~#
Quindi creiamo la condivisione denominata testvol con due repliche (si noti che il numero di repliche è uguale al numero di server in questo caso perché vogliamo impostare il mirroring) su server1.example.com e server2.example.com nel /data directory (verrà creata se non esiste):
gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data
[email protected]:~# gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data
Creation of volume testvol has been successful. Please start the volume to access data.
[email protected]:~#
Avvia il volume:
gluster volume start testvol
È possibile che il comando precedente ti dica che l'azione non è andata a buon fine:
[email protected]:~# gluster volume start testvol
Starting volume testvol has been unsuccessful
[email protected]:~#
In questo caso dovresti controllare l'output di...
server1.example.com/server2.example.com:
netstat -tap | grep glusterfsd
su entrambi i server.
Se ottieni un output in questo modo...
[email protected]:~# netstat -tap | grep glusterfsd
tcp 0 0 *:24009 *:* LISTEN 1548/glusterfsd
tcp 0 0 localhost.localdom:1019 localhost.localdo:24007 ESTABLISHED 1548/glusterfsd
[email protected]:~#
... va tutto bene, ma se non ottieni alcun output...
[email protected]:~# netstat -tap | grep glusterfsd
[email protected]:~#
... riavvia il demone GlusterFS sul server corrispondente (server2.example.com in questo caso):
server2.example.com:
/etc/init.d/glusterfs-server restart
Quindi controlla l'output di...
netstat -tap | grep glusterfsd
... di nuovo su quel server - ora dovrebbe apparire così:
[email protected]:~# netstat -tap | grep glusterfsd
tcp 0 0 *:24010 *:* LISTEN 1458/glusterfsd
tcp 0 0 localhost.localdom:1021 localhost.localdo:24007 ESTABLISHED 1458/glusterfsd
[email protected]:~#
Ora torniamo a server1.example.com:
server1.example.com:
Puoi controllare lo stato del volume con il comando
gluster volume info
[email protected]:~# gluster volume info
Volume Name: testvol
Type: Replicate
Status: Started
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: server1.example.com:/data
Brick2: server2.example.com:/data
[email protected]:~#
Per impostazione predefinita, tutti i client possono connettersi al volume. Se desideri concedere l'accesso solo a client1.example.com (=192.168.0.102), esegui:
gluster volume set testvol auth.allow 192.168.0.102
Tieni presente che è possibile utilizzare caratteri jolly per gli indirizzi IP (come 192.168.*) e che puoi specificare più indirizzi IP separati da virgole (es. 192.168.0.102,192.168.0.103).
Le informazioni sul volume dovrebbero ora mostrare lo stato aggiornato:
gluster volume info
[email protected]:~# gluster volume info
Volume Name: testvol
Type: Replicate
Status: Started
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: server1.example.com:/data
Brick2: server2.example.com:/data
Options Reconfigured:
auth.allow: 192.168.0.102
[email protected]:~#
3 Configurazione del client GlusterFS
client1.example.com:
Sul client, possiamo installare il client GlusterFS come segue:
apt-get install glusterfs-client
Quindi creiamo la seguente directory:
mkdir /mnt/glusterfs
Questo è tutto! Ora possiamo montare il filesystem GlusterFS su /mnt/glusterfs con il seguente comando:
mount.glusterfs server1.example.com:/testvol /mnt/glusterfs
(Invece di server1.example.com puoi anche usare server2.example.com nel comando sopra!)
Ora dovresti vedere la nuova condivisione negli output di...
mount
[email protected]:~# mount
/dev/mapper/server3-root on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext2 (rw)
server1.example.com:/testvol on /mnt/glusterfs type fuse.glusterfs (rw,allow_other,default_permissions,max_read=131072)
[email protected]:~#
... e...
df -h
[email protected]:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/server3-root
29G 1.1G 27G 4% /
udev 238M 4.0K 238M 1% /dev
tmpfs 99M 212K 99M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 247M 0 247M 0% /run/shm
/dev/sda1 228M 24M 193M 11% /boot
server1.example.com:/testvol
29G 1.1G 27G 4% /mnt/glusterfs
[email protected]:~#
Invece di montare manualmente la condivisione GlusterFS sul client, puoi modificare /etc/fstab in modo che la condivisione venga montata automaticamente all'avvio del client.
Apri /etc/fstab e aggiungi la seguente riga:
vi /etc/fstab
[...] server1.example.com:/testvol /mnt/glusterfs glusterfs defaults,_netdev 0 0 |
(Di nuovo, invece di server1.example.com puoi anche usare server2.example.com!)
Per verificare se il tuo /etc/fstab modificato funziona, riavvia il client:
reboot
Dopo il riavvio, dovresti trovare la condivisione negli output di...
df -h
... e...
mount
4 Test
Ora creiamo alcuni file di prova sulla condivisione GlusterFS:
client1.example.com:
touch /mnt/glusterfs/test1
touch /mnt/glusterfs/test2
Ora controlliamo la directory /data su server1.example.com e server2.example.com. I file test1 e test2 dovrebbero essere presenti su ogni nodo:
server1.example.com/server2.example.com:
ls -l /data
[email protected]:~# ls -l /data
total 8
-rw-r--r-- 1 root root 0 2012-12-17 11:17 test1
-rw-r--r-- 1 root root 0 2012-12-17 11:17 test2
[email protected]:~#
Ora chiudiamo server1.example.com e aggiungiamo/eliminiamo alcuni file sulla condivisione GlusterFS su client1.example.com.
server1.example.com:
shutdown -h now
client1.example.com:
touch /mnt/glusterfs/test3
touch /mnt/glusterfs/test4
rm -f /mnt/glusterfs/test2
Le modifiche dovrebbero essere visibili nella directory /data su server2.example.com:
server2.example.com:
ls -l /data
[email protected]:~# ls -l /data
total 8
-rw-r--r-- 1 root root 0 2012-12-17 11:17 test1
-rw-r--r-- 1 root root 0 2012-12-17 11:38 test3
-rw-r--r-- 1 root root 0 2012-12-17 11:38 test4
[email protected]:~#
Avviamo nuovamente server1.example.com e diamo un'occhiata alla directory /data:
server1.example.com:
ls -l /data
[email protected]:~# ls -l /data
total 8
-rw-r--r-- 1 root root 0 2012-12-17 11:17 test1
-rw-r--r-- 1 root root 0 2012-12-17 11:17 test2
[email protected]:~#
Come vedi, server1.example.com non ha notato le modifiche avvenute mentre era inattivo. Questo è facile da risolvere, tutto ciò che dobbiamo fare è invocare un comando di lettura sulla condivisione GlusterFS su client1.example.com, ad esempio:
client1.example.com:
ls -l /mnt/glusterfs/
[email protected]:~# ls -l /mnt/glusterfs/
total 8
-rw-r--r-- 1 root root 0 2012-12-17 11:17 test1
-rw-r--r-- 1 root root 0 2012-12-17 11:38 test3
-rw-r--r-- 1 root root 0 2012-12-17 11:38 test4
[email protected]:~#
Ora dai un'occhiata alla directory /data su server1.example.com e dovresti vedere che le modifiche sono state replicate su quel nodo:
server1.example.com:
ls -l /data
[email protected]:~# ls -l /data
total 4
-rw-r--r-- 1 root root 0 2012-12-17 11:17 test1
-rw-r--r-- 1 root root 0 2012-12-17 11:38 test3
-rw-r--r-- 1 root root 0 2012-12-17 11:38 test4
[email protected]:~#
5 link
- GlusterFS:http://www.gluster.org/
- Documentazione di GlusterFS 3.2:http://download.gluster.com/pub/gluster/glusterfs/3.2/Documentation/AG/html/index.html
- Ubuntu:http://www.ubuntu.com/