Compartilhamento de disco com Gluster

Joao Vitorino
Feb 8 · 6 min read
Photo by Tanner Boriack on Unsplash

Procurando uma solução para persistência de dados para o docker, me deparei com o Gluster como uma possível solução.

Gluster é um software de sistemas de arquivos em rede que garante escalabilidade, confiabilidade e alta disponibilidade de dados.

Meu objetivo com o Gluster era fornecer replicação de dados entre nós de um cluster Swarm, assim caso um worker do Swarm ficasse offline, o container subiria em outro worker utilizando o mesmo volume, mas não é muito difícil imaginar outras situações em que um Gluster é útil.


Mãos a obra

Ingredientes necessários:

  • 3 servidores linux ( eu usei Oacle Linux 7), aqui referenciados como srv1, srv2 e srv3.
  • 1 partição não montada e disponível para uso em cada um desses servidores

É necessário realizar essa configuração com 3 servidores para evitar split-brain. Dessa forma, um dos 3 servidores é escolhido como arbiter-volume.

Instalação

Realizar a instalação dos pacotes abaixo em todos os servidores (o nome do pacote pode variar de acordo com sua distro, na dúvida, execute yum search gluster, apt-cache search gluster ou algum comando compatível com sua distro).

yum install glusterfs-server glusterfs-cli glusterfs-libs gluster-client -y

Em cada um dos servidores crie um local para montagem dos bricks.

  • srv1: mkdir -p /gluster/brick/1
  • srv2: mkdir -p /gluster/brick/2
  • srv3: mkdir -p /gluster/brick/3

Brick é a unidade básica de storage no gluster, é o que vai ser utilizado pelo Gluster como ponto de montagem.

Adicione as pastas criadas como configuração de ponto de montagem no /etc/fstab.

  • srv1: echo "/dev/sdb1 /gluster/bricks/1 xfs defaults 0 0" >> /etc/fstab
  • srv2: echo "/dev/sdb1 /gluster/bricks/2 xfs defaults 0 0" >> /etc/fstab
  • srv3: echo "/dev/sdb1 /gluster/bricks/3 xfs defaults 0 0" >> /etc/fstab

Inicie o serviço em todos os servidores

systemctl enable glusterd && systemctl start glusterd

Configuração do volume

Antes de prosseguir, tenha certeza que todos os servidores conseguem se comunicar, resolver o nome dos outros nós do gluster — coloque no /etc/hosts se achar necessário. Certifique-se também que as portas 24007/tcp e 49152+/tcp estão abertas no firewall.

Crie um pool de storage (os comandos abaixo devem ser executados em apenas um servidor).

gluster peer probe srv1
gluster peer probe srv2
gluster peer probe srv3

Um pool é um rede confiável de servidores Gluster, basicamente está dizendo aos servidores que eles podem se comunicar entre si para criarem volumes.

Verifique se todos estão no pool

gluster pool list
Gluster Pool list

Chegou a hora de criar o volume, que pode ser de um dos seguintes tipo:

  1. Distributed (default): O arquivo é gravado no brick1 ou brick2 ou brick 3, mas nunca em mais de 1. Não há redundância de dados.
  2. Replicated: O arquivo é gravado em todos os bricks, uma cópia em cada brick.
  3. Distributed Replicated: De maneira simplificada, é uma junção dos dois anteriores. É possível ter escalabilidade e redundância nesse tipo de volume.
  4. Striped [descontinuado]: O arquivo é dividido em partes — mesma quantidade de bricks — para melhorar o desempenho no acesso ao arquivo (um load balancer).
  5. Distributed Striped [descontinuado]: O arquivo pode ser dividido e gravado em uma quantidade maior por brick desde que seja dividido em uma quantidade múltipla do numero de bricks.
  6. Dispersed: O arquivo é divido em fragmentos e esses fragmentos são gravados no bricks de forma que, utilizando apenas parte desses fragmentos, já é o suficiente para recuperar todo o arquivo em caso de falha em algum brick.
  7. Distributed Dispersed : É a junção do Distributed replicated com o Dispersed, permite escalabilidade com alta tolerância a falhas.

Nesse exemplo vamos utilizar o modo Replicated.

Comando para criar o volume (executar em apenas um nó).

gluster volume create gfsData replica 3 \ srv1:/gluster/bricks/1/brick \ 
srv2:/gluster/bricks/2/brick \
srv3:/gluster/bricks/3/brick

Verificando o volume criado (comando pode ser executado em qualquer srv)

gluster volume list

E iniciando o volume criado (executar em apenas um servidor)

gluster volume start gfData

Para informações mais detalhadas do volume execute gluster volume gfsData

Com o volume criado e iniciado, para usar basta realizar a montagem e configurar no /etc/fstab para deixa-lo persistente, fazer isso em todos os servidores. Costumo criar uma pasta no / para fazer isso mas o padrão é em /mnt.

mkdir /data 
echo "localhost:/gfsData /data glusterfs \ defaults,_netdev,backupvolfile-server=localhost 0 0" >> /etc/fstab mount.glusterfs localhost:/gfsData /data

Usei uma partição de 90 G em cada servidor para criar esse volume, repare que o volume final ficou +- 90 G pois use o modo replicated, se tivesse utilizado o distributed, o tamanho final seria +- 270 G.

A configuração nos servidores acabou. Para testar, crie um arquivo na pasta /data no srv1, depois verifique se o mesmo arquivo aparece também em srv2 e srv3. Se ainda estiver cético, pare o serviço do gluster em um dos servidores e veja se a replicação continua funcionando nos outros dois.


Clientes

Configuramos 3 servidores, cada um contendo uma partição que foi utilizada na criação do volume, entretanto, podemos fazer com que outras máquinas (clientes) acessem esse volume sem a necessidade de adicionar mais partições ou brick. Fazendo com que o Gluster funcione como se fosse um compartilhamento NFS robusto.

Permissão

https://www.gluster.org/O primeiro passo para adicionar clientes é liberar nos servidores o ip do cliente.

gluster volume set gfsData auth.allow IP_DO_SRV_CLIENTE

Para uma lista de ip’s a serem autorizados, basta separar por virgula. Para inverter a lógica, ou seja, bloquear o acesso por ip, basta trocar auth.allow por auth.reject.

O valor padrão do gluster é permitir a conexão de qualquer cliente, o que pode ser feito usando um wildcard (*), exemplo:

gluster volume set gfsData auth.allow *

Configuração no cliente

Verifique se o modulo do fuse está instalado e habilitado com o comando modprobe fuse, se o comando exibir uma mensagem de erro, providencie a instalação/configuração desse módulo.

Instalação dos pacotes

yum install glusterfs glusterfs-fuse glusterfs-rdma -y

Crie uma pasta para realizar a montagem e e execute o comando mount.

mkdir /mnt/gluster
mount -t glusterfs srv1:/gfsData /mnt/glusterClient/https://www.gluster.org/

O comando para a montagem pode apontar para qualquer servidor, após a montagem, o cliente recebe dele as informações dos demais membros do pool. Sendo assim, mesmo no /etc/fstab apontado para o srv1, caso o srv1 caia, o ponto de montagem no cliente continuará funcionado.

Configuração do /etc/fstab para o cliente.

mount -t glusterfs srv1:/gfsData /mnt/glusterClient/

Conclusão

Um cluster de disco feito com Gluster é simples de ser configurado, se comparado com outros sistemas semelhantes como o OCFS (já tive muita dor de cabeça com esse), de fácil escalabilidade, devido ao uso dos bricks e resiliente a falhas (desde que não seja usado o modo distributed), mesmo na utilização de clientes.

Este texto utilizou como base o artigo no site Ruan Bekker’s blog com adição de observações pessoais.

Referências:

Use o tutorial/howto mas leia a documentação. O que foi descrito é o básico para criar um compartilhamento de disco com alta disponibilidade, porém quando o primeiro problema acontecer, será a documentação que irá te ajudar.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade