Armazenamento · 10 min read · Nov 29, 2025
Armazenamento de Alta Disponibilidade com GlusterFS no CentOS 7 - Espelho entre dois servidores de armazenamento
Este tutorial mostra como configurar um armazenamento de alta disponibilidade com dois servidores de armazenamento (CentOS 7.2) que usam GlusterFS. Cada servidor de armazenamento será um espelho do outro servidor de armazenamento, e os arquivos serão replicados automaticamente entre os dois servidores de armazenamento. O sistema cliente (CentOS 7.2 também) poderá acessar o armazenamento como se fosse um sistema de arquivos local. GlusterFS é um sistema de arquivos em cluster capaz de escalar para vários petabytes. Ele agrega vários blocos de armazenamento sobre Infiniband RDMA ou TCP/IP em um grande sistema de arquivos de rede paralelo. Os blocos de armazenamento podem ser feitos de qualquer hardware comum, como servidores x86_64 com RAID SATA-II e HBA Infiniband.
1 Nota Preliminar
Neste tutorial, uso três sistemas, dois servidores e um cliente:
- server1.example.com: endereço IP 192.168.0.100 (servidor)
- server2.example.com: endereço IP 192.168.0.101 (servidor)
- client1.example.com: endereço IP 192.168.0.102 (cliente)
Todos os três sistemas devem ser capazes de resolver os nomes dos outros sistemas. Se isso não puder ser feito através do DNS, você deve editar o arquivo /etc/hosts para que fique da seguinte forma em todos os três sistemas:
nano /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.100 server1.example.com server1
192.168.0.101 server2.example.com server2
192.168.0.102 client1.example.com client1
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6(Também é possível usar endereços IP em vez de nomes de host na configuração a seguir. Se você preferir usar endereços IP, não precisa se preocupar se os nomes de host podem ser resolvidos ou não.)
2 Habilitar Repositórios Adicionais
server1.example.com/server2.example.com/client1.example.com:
Primeiro, importamos as chaves GPG para pacotes de software:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*Em seguida, habilitamos o repositório EPEL 7 em nossos sistemas CentOS:
yum -y install epel-releaseyum -y install yum-prioritiesEdite /etc/yum.repos.d/epel.repo…
nano /etc/yum.repos.d/epel.repo… e adicione a linha priority=10 à seção [epel]:
[epel]
name=Pacotes Extras para Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]Em seguida, atualizamos nossos pacotes existentes no sistema:
yum -y update3 Configurando os Servidores GlusterFS
server1.example.com/server2.example.com:
GlusterFS está disponível no repositório do grupo de interesse especial de armazenamento do CentOS. Instale o repositório com este comando:
yum -y install centos-release-glusterEm seguida, instale o servidor GlusterFS da seguinte forma:
yum -y install glusterfs-serverCrie os links de inicialização do sistema para o daemon Gluster e inicie-o:
systemctl enable glusterd.service
systemctl start glusterd.serviceO comando
glusterfsd --versiondeve agora mostrar a versão do GlusterFS que você acabou de instalar (3.7.12 neste caso):
[root@server1 ~]# glusterfsd --version
glusterfs 3.7.12 built on Jun 24 2016 14:11:19
Repository revision: git://git.gluster.com/glusterfs.git
Copyright (c) 2006-2013 Red Hat, Inc.
GlusterFS vem com ABSOLUTAMENTE NENHUMA GARANTIA.
É licenciado para você sob sua escolha da GNU Lesser
General Public License, versão 3 ou qualquer versão posterior (LGPLv3
ou posterior), ou da GNU General Public License, versão 2 (GPLv2),
em todos os casos conforme publicado pela Free Software Foundation.Se você usar um firewall, certifique-se de que as portas TCP 111, 24007, 24008, 24009-(24009 + número de blocos em todos os volumes) estejam abertas em server1.example.com e server2.example.com.
Em seguida, devemos adicionar server2.example.com ao pool de armazenamento confiável (observe que estou executando todos os comandos de configuração do GlusterFS a partir de server1.example.com, mas você também pode executá-los a partir de server2.example.com porque a configuração é replicada entre os nós do GlusterFS - apenas certifique-se de usar os nomes de host ou endereços IP corretos):
server1.example.com:
Em server1.example.com, execute
gluster peer probe server2.example.com[root@server1 ~]# gluster peer probe server2.example.com
peer probe: success.O status do pool de armazenamento confiável deve agora ser semelhante a isto:
gluster peer status[root@server1 ~]# gluster peer statusNumber of Peers: 1Hostname: server2.example.com
Uuid: 582e10da-aa1b-40b8-908c-213f16f57fe5
State: Peer in Cluster (Connected)Em seguida, criamos o compartilhamento chamado testvol com duas réplicas (observe que o número de réplicas é igual ao número de servidores neste caso porque queremos configurar o espelhamento) em server1.example.com e server2.example.com no diretório /data (este será criado se não existir):
gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data force[root@server1 ~]# gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data force
volume create: testvol: success: please start the volume to access data
[root@server1 ~]#Inicie o volume:
gluster volume start testvolO resultado deve ser:
[root@server1 ~]# gluster volume start testvol
volume start: testvol: success
[root@server1 ~]#É possível que o comando acima informe que a ação não foi bem-sucedida:
[root@server1 ~]# gluster volume start testvol
Starting volume testvol has been unsuccessful
[root@server1 ~]#Nesse caso, você deve verificar a saída de…
server1.example.com/server2.example.com:
netstat -tap | grep glusterfsdem ambos os servidores.
Se você obtiver uma saída como esta…
[root@server1 ~]# netstat -tap | grep glusterfsd
tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 22880/glusterfsd
tcp 0 0 server1.example.c:49152 server2.example.c:49148 ESTABLISHED 22880/glusterfsd
tcp 0 0 server1.example.c:49152 server1.example.c:49148 ESTABLISHED 22880/glusterfsd
tcp 0 0 server1.example.c:49150 server1.example.c:24007 ESTABLISHED 22880/glusterfsd
tcp 0 0 server1.example.c:49152 server2.example.c:49142 ESTABLISHED 22880/glusterfsd
tcp 0 0 server1.example.c:49152 server1.example.c:49149 ESTABLISHED 22880/glusterfsd
[root@server1 ~]#… tudo está bem, mas se você não obtiver nenhuma saída…
[root@server2 ~]# netstat -tap | grep glusterfsd
[root@server2 ~]#… reinicie o daemon GlusterFS no servidor correspondente (server2.example.com neste caso):
server2.example.com:
systemctl restart glusterd.serviceEm seguida, verifique a saída de…
netstat -tap | grep glusterfsd… novamente nesse servidor - agora deve parecer assim:
[root@server2 ~]# netstat -tap | grep glusterfsd
tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 10971/glusterfsd
tcp 0 0 server2.example.c:49152 server1.example.c:49140 ESTABLISHED 10971/glusterfsd
tcp 0 0 server2.example.c:49152 server2.example.c:49149 ESTABLISHED 10971/glusterfsd
tcp 0 0 server2.example.c:49152 server2.example.c:49143 ESTABLISHED 10971/glusterfsd
tcp 0 0 server2.example.c:49152 server1.example.c:49142 ESTABLISHED 10971/glusterfsd
tcp 0 0 server2.example.c:49150 server2.example.c:24007 ESTABLISHED 10971/glusterfsd
[root@server2 ~]#Agora, de volta a server1.example.com:
server1.example.com:
Você pode verificar o status do volume com o comando
gluster volume info[root@server1 ~]# gluster volume info
Volume Name: testvol
Type: Replicate
Volume ID: e1f825ca-c9d9-4eeb-b6c5-d62c4aa02376
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1.example.com:/data
Brick2: server2.example.com:/data
Options Reconfigured:
performance.readdir-ahead: on
[root@server1 ~]#Por padrão, todos os clientes podem se conectar ao volume. Se você quiser conceder acesso apenas a client1.example.com (= 192.168.1.102), execute:
gluster volume set testvol auth.allow 192.168.1.102Observe que é possível usar curingas para os endereços IP (como 192.168.*) e que você pode especificar vários endereços IP separados por vírgula (por exemplo, 192.168.1.102,192.168.1.103).
As informações do volume agora devem mostrar o status atualizado:
gluster volume info[root@server1 ~]# gluster volume infoVolume Name: testvol
Type: Replicate
Volume ID: e1f825ca-c9d9-4eeb-b6c5-d62c4aa02376
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1.example.com:/data
Brick2: server2.example.com:/data
Options Reconfigured:
auth.allow: 192.168.1.102
performance.readdir-ahead: on
[root@server1 ~]#4 Configurando o Cliente GlusterFS
client1.example.com:
No cliente, podemos instalar o cliente GlusterFS da seguinte forma:
yum -y install glusterfs-clientEm seguida, criamos o seguinte diretório:
mkdir /mnt/glusterfsÉ isso! Agora podemos montar o sistema de arquivos GlusterFS em /mnt/glusterfs com o seguinte comando:
mount.glusterfs server1.example.com:/testvol /mnt/glusterfs(Em vez de server1.example.com, você também pode usar server2.example.com no comando acima!)
Agora você deve ver o novo compartilhamento nas saídas de…
mount[root@client1 ~]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=930336k,nr_inodes=232584,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=188060k,mode=700)
server1.example.com:/testvol on /mnt/glusterfs type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
[root@client1 ~]#… e…
df -h[root@client1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.3G 27G 5% /
devtmpfs 909M 0 909M 0% /dev
tmpfs 919M 0 919M 0% /dev/shm
tmpfs 919M 8.6M 910M 1% /run
tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/sda1 497M 192M 306M 39% /boot
tmpfs 184M 0 184M 0% /run/user/0
server1.example.com:/testvol 28G 12G 17G 41% /mnt/glusterfs
[root@client1 ~]#Em vez de montar o compartilhamento GlusterFS manualmente no cliente, você pode adicionar o comando de montagem ao arquivo /etc/rc.local. Não o adicionarei ao /etc/fstab, pois o rc.local é sempre executado após a rede estar ativa, o que é necessário para um sistema de arquivos de rede.
Abra /etc/rc.local e adicione a seguinte linha:
nano /etc/rc.local[...]
/usr/sbin/mount.glusterfs server1.example.com:/testvol /mnt/glusterfs(Novamente, em vez de server1.example.com, você também pode usar server2.example.com!)
Para testar se seu /etc/rc.local modificado está funcionando, reinicie o cliente:
rebootApós a reinicialização, você deve encontrar o compartilhamento nas saídas de…
df -h… e…
mount5 Testando
Agora vamos criar alguns arquivos de teste no compartilhamento GlusterFS:
client1.example.com:
touch /mnt/glusterfs/test1
touch /mnt/glusterfs/test2Agora vamos verificar o diretório /data em server1.example.com e server2.example.com. Os arquivos test1 e test2 devem estar presentes em cada nó:
server1.example.com/server2.example.com:
ls -l /data[root@server1 ~]# ls -l /data
total 0
-rw-r--r--. 2 root root 0 Jul 1 2016 test1
-rw-r--r--. 2 root root 0 Jul 1 2016 test2
[root@server1 ~]Agora desligamos server1.example.com e adicionamos/removemos alguns arquivos no compartilhamento GlusterFS em client1.example.com.
server1.example.com:
shutdown -h nowclient1.example.com:
touch /mnt/glusterfs/test3
touch /mnt/glusterfs/test4
rm -f /mnt/glusterfs/test2Os comandos podem levar algum tempo para serem executados, pois o Glusterfs muda para server2 após não conseguir mais alcançar server1. Podemos ver aqui a tolerância a falhas do sistema, pois ainda podemos trabalhar em nosso compartilhamento de armazenamento de dados quando server1 está offline. As alterações devem ser visíveis no diretório /data em server2.example.com:
server2.example.com:
ls -l /data[root@server2 ~]# ls -l /data
total 8
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4Vamos reiniciar server1.example.com e dar uma olhada no diretório /data:
server1.example.com:
ls -l /data[root@server1 ~]# ls -l /data
total 8
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1
-rw-r--r--. 2 root root 0 Jul 1 15:19 test2
[root@server1 ~]#Como você vê, server1.example.com sincronizou automaticamente as alterações. Caso a alteração ainda não tenha sido sincronizada, isso é fácil de corrigir, tudo o que precisamos fazer é invocar um comando de leitura no compartilhamento GlusterFS em client1.example.com, por exemplo:
client1.example.com:
ls -l /mnt/glusterfs/[root@client1 ~]# ls -l /data
total 8
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4
[root@server1 ~]#Agora dê uma olhada no diretório /data em server1.example.com novamente, e você deve ver que as alterações foram replicadas para aquele nó:
server1.example.com:
ls -l /data[root@server1 ~]# ls -l /data
total 8
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4
[root@server1 ~]#6 Links
- GlusterFS: http://www.gluster.org/
- Documentação do GlusterFS 3.2: http://download.gluster.com/pub/gluster/glusterfs/3.2/Documentation/AG/html/index.html
- CentOS: http://www.centos.org/
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.