Criando um Cluster de GFS2 com Pacemaker

A um tempo atrás eu tive a tarefa de criar um cluster de GFS2, que se trata de um sistema de arquivos compartilhado fornecido pela Red Hat (Só é pago nessa distro, mas é disponível de grátis nas demais). Esse post tem como intuito recriar um ambiente semelhante usando o CentOS 7, porém vale reforçar que ainda recomendo fortemente o uso do Ceph para casos aonde se necessita do compartilhamento de dados.

O que é o GFS2

GFS2 é um sistema de arquivos compartilhado desenvolvido pela Red Hat, na qual funciona através do conceito de que nenhum técnico de TI deveria fazer: montar o mesmo disco em N máquinas diferentes ao mesmo tempo.

Como já é de conhecimento da maioria, um sistema de arquivos possui uma tabela de inodes carregada na memória da máquina, com as posições livres e em uso no disco. Essa tabela de tempos em tempos é recarregada do disco, porém não é algo instantâneo. Agora pense que essa tabela está carregada na memória de cada máquina, e cada máquina possui sua versão. Imagine todas elas fazendo escrita. Qual seria o resultado? O que aparece no exemplo abaixo: um monte de pontos de interrogação quando tenta listar um diretório. Além disso toda vez que tentar abrir um arquivo é possível que o sistema reclame de que existem partes faltando dele. A solução é corrigir com o FSCK e rezar para que a maioria dos dados retorne.

deckard@tristram:/var/log$ ls -alh
ls: cannot access syslog: Input/output error
ls: cannot access security: Input/output error
total 0
drwxr-xr-x 5 root root 123 2009-08-19 16:33 .
drwxr-xr-x 3 root root  16 2009-08-14 17:15 ..
?????????? ? ?    ?      ?                ? syslog
drwxr-xr-x 3 root root  57 2009-08-19 16:58 audit
?????????? ? ?    ?      ?                ? security

O GFS2 resolve esse problema pois ele reconhece que o disco pode estar montado em outras máquinas, e sabe operar nessas situações – contanto que esteja acompanhado com o serviço do Pacemaker.

Pacemaker é um serviço que permite criar clusters de serviços que originalmente não seria possível clusterizar, por exemplo Filesystems. Existem outras soluções para isso, como por exemplo o Heartbeat, porém a Red Hat recomenda o uso do Pacemaker com o GFS2 e iremos seguir o projeto com a recomendação.

Preparando o Ambiente

Nosso ambiente será formado por 3 máquinas virtuais com cada uma contendo 10GB de disco interno (somente para o sistema operacional) e um segundo disco compartilhado com 10GB de espaço (pode ser mais, porém o intuito é somente mostrar o GFS2 operando e podemos adicionar mais discos posteriormente caso necessário). O ambiente final ficará conforme abaixo:

  • Sistema Operacional: CentOS 7 (GFS2 é pago no Red Hat Enterprise Linux)
  • Memória: 1 GB
  • Disco: 10 GB para o raiz + 10 GB compartilhado entre ambas as máquinas
  • CPU: 1 vCPU

Lembrando que o disco deve ser compartilhado! Se você não ativar essa função no virtualizador não irá conseguir fazer o GFS2 funcionar. Cada virtualizador tem sua maneira de ativar, sendo por exemplo no virtualbox através da opção “Shareable” dentro das configurações dos discos.

Faça o processo de instalação normal do CentOS 7 e depois, quando tiver acesso a console, atualize o sistema para a ultima versão de todos os pacotes.

# yum update -y

Instalando o Pacemaker

Próximo passo será instalar o Pacemaker e criar um cluster entre nossas máquinas. Primeiramente instale os pacotes pcs, pacemaker e o fence-agents-all em todas as máquinas. Pacemaker é o pacote responsável por criar meu cluster e o pcs seu CLI (Command Line Interface), enquanto o fence-agents-all é o serviço responsável por impedir que eu caia na situação do split-brain, aonde o cluster não consegue decidir qual máquina será eleita como Mestre com um quorum de máquinas com menos de 3 servidores.

# yum install pcs pacemaker fence-agents-all

Com os pacotes instalados, altere a senha do usuário hacluster por alguma outra (de preferência algo que posteriormente você se lembre, pois iremos usar bastante essa senha).

# passwd hacluster

Garanta também que o serviço do Pacemaker irá iniciar durante o boot e então teremos o serviço rodando e pronto para começarmos a criar nosso cluster.

Criando o Cluster

Próximo passo é criarmos nosso cluster através do comando pcs. Para iniciar o cluster, primeiramente execute o comando pcs cluster auth para que possamos nos autenticar em todas as máquinas. Esse comando pode ser executado em qualquer máquina, não é necessário executar em todas elas.

# pcs cluster auth cluster01.tristram.com.br cluster02.tristram.com.br cluster03.tristram.com.br
Username: hacluster
Password:
cluster01.tristram.com.br: Authorized
cluster02.tristram.com.br: Authorized
cluster03.tristram.com.br: Authorized

Com o cluster autenticado, agora inicie todas as máquinas como membros através do comando abaixo:

# pcs cluster setup --start --name gfs_cluster  cluster01.tristram.com.br cluster02.tristram.com.br cluster03.tristram.com.br

cluster01.tristram.com.br: Succeeded
cluster01.tristram.com.br: Starting Cluster...
cluster02.tristram.com.br: Succeeded
cluster02.tristram.com.br: Starting Cluster...
cluster03.tristram.com.br: Succeeded
cluster03.tristram.com.br: Starting Cluster...

Por ultimo, ative todos os membros do cluster através do comando pcs cluster enable:

# pcs cluster enable --all

Para validar se tudo está funcionando, basta executar o comando pcs status que o mesmo irá retornar uma tela contendo o status de todos os serviços em cluster, além dos membros. A ultima etapa é criar um serviço de STONITH (Shoot The Other Node In The Head) para decidir quem será o novo Master em caso do ambiente cair na situação do split brain que comentei acima. A criação é através do comando pcs stonith, porém o serviço deve ser configurado de acordo com o virtualizador que foi utilizado para configurar o GFS2. No rodapé da página existe a documentação da Red Hat para te apoiar em como configurar (o Virtualbox não possui suporte ao STONITH).

Instalando o CLVM e o GFS2

Somente o GFS2 e o Pacemaker não é o suficiente para criar um cluster de sistema de arquivos. Para que o Sistema Operacional reconheça que esse sistema de arquivos funciona em formato de cluster é necessário que seja configurado o CLVM (Cluster Logic Volume Manager), que é o LVM porém para trabalhar em cluster. Lado positivo é que não iremos precisar configurar mais nada do Pacemaker caso posteriormente o ambiente necessite ser expandido. O primeiro passo para criarmos nosso cluster de LVM é instalar os pacotes gfs2 e o clvm em todas as máquinas.

# yum install lvm2-cluster gfs2-utils

Próximo passo é informar para o Pacemaker que o cluster deve ser congelado em caso do ambiente ficar sem quorum de máquinas. Isso é feito por conta do GFS2 não saber trabalhar corretamente com o padrão, que é parar o serviço caso o quorum seja perdido.

# pcs property set no-quorum-policy=freeze

O clvm necessita que dois resources sejam criados dentro do Pacemaker, o primeiro sendo o dlm e o segundo o clvm. Iremos criar ambos através do comando “pcs resource create” passando como parâmetro o intervalo de checagens de saúde do ambiente, e o comportamento em caso de falha.

# pcs resource create clvmd ocf:heartbeat:clvm op monitor interval=30s on-fail=fence clone interleave=true ordered=true
# pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s on-fail=fence clone interleave=true ordered=true

Próximo passo é desativar o lock de disco do serviço de LVM em todas as máquinas através do comando:

# /sbin/lvmconf --enable-cluster

Feito isso, informe a ordem de inicialização dos serviços de clvm e do dlm para o Pacemaker. Vale lembrar que o DLM deve iniciar primeiro para então o CLVM poder iniciar.

# pcs constraint order start dlm-clone then clvmd-clone 
# pcs constraint colocation add clvmd-clone with dlm-clone

Agora é criarmos nossa LVM normalmente com os comandos pvcreate, vgcreate e lvcreate. Iremos inicialmente criar nossa LVM com um único disco, porém posteriormente poderão expandir ela para incluir mais discos sem necessidade de alterar a configuração do cluster.

# pvcreate /dev/sdb
# vgcreate gfslvm /dev/sdb
# lvcreate -l100%FREE -n srv gfslvm

Agora vamos formatar essa partição para usar o GFS2. Para formatar, basta usar mkfs.gfs2, passando o nome do cluster de vocês (no exemplo acima colocamos o nome gfs_cluster), o número de jornais que serão usados (GFS2 pede um jornal por nó), e o nome do arquivo de lock dessa partição.

# mkfs.gfs2 -j2 -p gfslock -t gfs_cluster:srv /dev/gfslvm/srv

Por ultimo precisamos garantir que esse disco seja montado durante o boot pelo Pacemaker. Normalmente iriamos colocar a montagem dentro do fstab, porém por se tratar de um sistema de arquivos em cluster, a montagem precisa ser feita em todas as máquinas, e a forma que deve ser montado deve ser gerenciado por um único serviço. Por isso crie um resource de sistema de arquivos dentro do Pacemaker conforme abaixo:

# pcs resource create gfs_srv Filesystem device="/dev/gfslvm/srv" directory="/srv" fstype="gfs2" "options=noatime" op monitor interval=10s on-fail=fence clone interleave=true

Por ultimo configure a montagem para ocorrer após o serviço do CLVM estar ativo e se tudo der certo você terá o GFS2 funcionando no seu servidor:

# pcs constraint order start clvmd-clone then gfs_srv-clone 
# pcs constraint colocation add gfs_srv-clone with clvmd-clone

Para validar, execute o comando df -h em todas as máquinas, ou o mount e veja se a partição aparece montada. Para esse material foi utilizado inteiramente a documentação da Red Hat, na qual poderá usar também para consulta através dos links abaixo. E até o próximo post!

  • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/global_file_system_2/ch-clustsetup-gfs2
  • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/high_availability_add-on_administration/ch-startup-haaa

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *