O GFS é um dos sistemas de arquivos compartilhados que testei nos últimos dias. Ele é mantido hoje pela Red Hat e é uma das “features” que impulsionam a venda do RHEL (Red Hat Enterprise Linux). Mas não é necessário comprar o caro Red Hat, é possível fazê-lo funcionar no Centos, que é gratuito.
Para o GFS funcionar, é necessário configurar o Cluster do Linux e confesso que sofri muito para conseguir fazer tudo funcionar. Primeiro porque não achei documentação decente, com exceção das que cito como fontes deste procedimento. Segundo porque não achei os pacotes necessários para fazer o Cluster do Linux e o GFS funcionarem no Centos 5. Sendo assim tive que optar pelo Centos 4.8.
Pré-requisitos
- Pelo menos 2 servidores com 2 ou mais processadores ou cores. (Os pacotes do cluster e GFS são compilados para kernels SMP). Importante: Este tutorial não funciona em kernel mono-processado.
- Centos 4.8 x86_64 bits mínimo instalado. Não é necessário instalar nenhum pacote na hora da instalação, instalaremos os pacotes necessários em seguida. Baixe o ISO do CentOS aqui. Note que você vai precisar de uma máquina com instruções 64 bits. Todos os processadores lançados nos últimos 3 anos devem ser compatíveis.
- Ter a mão os pacotes do Cluster para instalar. Como eu sou um cara legal, criei um arquivo compactado com todos eles que você pode baixar aqui.
- Ter um volume de acesso compartilhado via SCSI. Isso é possível via Storage (apontando uma LUN para 2 ou mais hosts) ou via VMware (usando este procedimento)
- Configurar o acesso a rede no Centos e nomear as máquinas. Não esqueça de colocar todos os servidores membros do cluster no arquivo /etc/hosts
- Deve haver conectividade de rede entre todos os servidores membros do cluster.
Legenda
A maior parte das operações precisam ser executadas em todos os servidores membros do cluster mas algumas somente uma vez. Para facilitar convencionei o seguinte:
- Operações que devem ser executadas em todos os nós estão escritas em azul.
- Operações que precisam ser executadas em somente um dos servidores estão escritas em verde.
Procedimento
Instalado o Cluster
Baixe e descompacte os pacotes do Cluster do Linux no diretório /tmp com os comandos:
cd /tmp
wget http://blogdovicente.com/wp-content/uploads/2009/12/clustertar.bz2
tar -xvjf clustertar.bz2
Caso não tenha acesso direto a internet e precise utilizar um servidor proxy, execute este procedimento.
Será criada um diretório chamado cluster. Acesse este diretório e instale todos os pacotes com os comandos:
cd cluster
rpm -hiv * – -nodeps
Agora será necessário instalar alguns pacotes para resolver as dependências dos pacotes recém instalados.
Renomeie o arquivo /etc/yum.repos.d/CentOS-Base.repo para /etc/yum.repos.d/CentOS-Base.repo.old
Edite o arquivo /etc/yum.repos.d/CentOS-Media.repo e altere a linha enabled=0 para enabled=1
Insira novamente o DVD de instalação do CentOS e monte-o com o comando:
mount /dev/cdrom
Instale as dependências necessárias com o comando:
yum install nss.x86_64 perl-XML-LibXML pexpect fonts-xorg-base gnome-python2-canvas pygtk2-libglade
Aceite todas as confirmações e serão instalados todos os pacotes necessários.
Configurando o Cluster
Será necessário um utilitário gráfico para executar o configurador do cluster. Como não há interface gráfica instalada no servidor, é preciso exportar a tela para algum outro servidor ou estação que tenha o X instalado e rodando. Se você está rodando Windows na sua estação de trabalho, siga este procedimento. Se você está rodando o Linux na sua estação, é possível exportar a tela do configurador do Cluster para ela usando executando os seguintes passos:
No servidor, execute o comando:
export DISPLAY=ip_da_estacao_linux:0.0
Na estação, execute o comando:
xhost +
Com isso qualquer janela que for iniciado no servidor será mostrada na estação.
Execute no servidor o comando:
system-config-cluster
Será iniciada a configuração do cluster. Na primeira vez vai dar um erro, mas na segunda execução será exibida a tela abaixo.
1 ) Clique no botão Create New Configuration
2 ) Dê um nome para o cluster e clique em OK. Este nome será usado a frente na formatação do volume GFS:
3 ) Na tela seguinte clique em Fence Devices, Add a Fence Device
4 ) Na tela seguinte, selecione Manual Fencing, dê um nome a ele e clique em OK
5 ) Clique em Cluster Nodes e em Add a Cluster Node
6 ) Na tela seguinte, coloque o nome do servidor e preencha 1 no campo Quorum Votes e clique em OK
7 ) Clique no host recém adicionado e clique no botão Manage Fencing For This Node
8 ) Na tela seguinte clique no host e no botão Add a New Fence Level
9 ) Clique em Fence-Level-1 e em Add New Fence to this Level. Na tela seguinte, selecione o Fence device que você criou anteriormente e clique em OK e depois em Close.
Repita os passos de 5 a 9 para todos os outros nós do Cluster. Para salvar clique em File, Save e OK para salvar a configuração no arquivo /etc/cluster/cluster.conf e clique em OK para concluir.
Clique em File, Quit para sair da configuração do cluster.
Copie o arquivo /etc/cluster/cluster.conf para todos os nós do cluster. Pode ser usado sftp ou scp.
Acertando os módulos do kernel
Execute os comandos abaixo para copiar os módulos do kernel para os locais corretos:
mkdir /lib/modules/2.6.9-89.ELsmp/kernel/cluster
cp -Rp /lib/modules/2.6.9-89.0.11.ELsmp/kernel/fs/gfs_locking/ /lib/modules/2.6.9-89.ELsmp/kernel/fs/
cp -Rp /lib/modules/2.6.9-89.0.11.ELsmp/kernel/fs/gfs/ /lib/modules/2.6.9-89.ELsmp/kernel/fs/
cp -Rp /lib/modules/2.6.9-89.0.11.ELsmp/kernel/cluster/ /lib/modules/2.6.9-89.ELsmp/kernel/
depmod
Alterando as opções de lock e criando o LVM
A criação do LVM pode ser feita da mesma maneira que criaria para um volume normal. O procedimento abaixo se refere a criação de um volume usando somente um disco. Partido do princípio que o disco que será usado pelo GFS é o dispositivo /dev/sdb, execute os passos abaixo:
pvcreate /dev/sdb
vgcreate vg0 /dev/sdb
vgchange -a y
lvcreate -L 1000MB -n lv0 vg0
O comando anterior contempla um disco de 1 GB. Altere este comando caso seu disco tenha tamanho diferente.
Altere no arquivo /etc/lvm/lvm.conf as linhas abaixo:
locking_type = 2
locking_library = “/usr/lib/liblvm2clusterlock.so”
Iniciando os serviços necessários para o Cluster
Os serviços do cluster deverão ser iniciados na ordem abaixo em todos os nós do cluster para que seja possível montar volumes GFS:
service ccsd start
service cman start
Depois disso os seguintes serviços devem ser iniciados em todos os nós do cluster:
service fenced start
service clvmd start
service gfs start
Criando e montando o volume GFS
Execute os comandos abaixo para formatar e montar o disco como GFS:
gfs_mkfs -p lock_dlm -t nome_do_cluster:nome_desejado_para_o_volume -j numero_de_nos_do_cluster /dev/vg0/lv0
mkdir /mnt/gfs
mount -t gfs /dev/vg0/lv0 /mnt/gfs
Tornando a montagem automática no boot
Para isso você precisará editar o arquivo /etc/fstab. Insira no final dele a seguinte linha:
/dev/vg0/lv0 /mnt/gfs gfs defaults,noquota,noatime,nodiratime 0 0
Conclusão
Ter um disco compartilhado é muito bom para muitas aplicações e pode aumentar muito a performance em comparação a um acesso feito via NFS. O GFS funciona bem mas eu tive alguns problemas, como algumas máquinas sairem fora do cluster, quando executei uma aplicação que faz acesso massivo de disco e usava muita CPU. Eu não consegui chegar a conclusão de qual foi a causa. Como o lock entre os servidores é feito via rede, pode ter sido uma perda de comunicação ou mesmo o acesso a disco que não foi rápido o suficiente. Antes de implantar em ambiente de produção, sugiro fortemente que você faça testes e avalie a solucão para seu ambiente.
Caso tenha algum problema, primeiro veja se você não pulou algum passo. Tutoriais como este são bem extensos e é fácil de esquecer alguma coisa. Se este não for seu caso ou tiver alguma sugestão para deixar o texto mais claro, deixe um comentário.
Fontes
Red Hat Documentation: Oracle RAC GFS
GFS Wiki
Red Hat Knowledgebase: How do you set up GFS on Red Hat Enterprise Linux 4 Update 2 or later?
Pacotes do Red Hat Cluster para o Centos 4.X
Red Hat GFS 6.1: Administrator’s Guide
Red Hat Knowledgebase: How can I improve the performance of my GFS filesystem or prevent processes from hanging while accessing it?