10 de junho de 2016

GlusterFS como sistema de arquivos distribuído

 

Diego Adalberto Martins Santana


O GlusterFS é um sistema de arquivos de rede escalável. Utilizando hardware comum, é possível criar um sistema de armazenamento de dados grande, distribuído e que suporte grandes quantidades de transferências de dados. O GlusterFS é software livre.

O objetivo deste artigo é descrever a montagem de uma estrutura utilizando esse sistema de arquivos, e verificar como é o desempenho no uso de cliente nativo, de NFS ou quando há aumento na quantidade de servidores ou estações em uso simultâneo.
O GlusterFS é um software utilizado para gerenciar armazenamentos em cluster, sistemas que relaciona dois ou mais computadores para que estes trabalhem de maneira conjunta. Pode ser utilizado por empresas que requerem confiabilidade, alta disponibilidade de dados e facilidade no gerenciamento de sistemas de armazenamento distribuídos. Com o GlusterFS, montar uma estrutura de armazenamento utilizando servidores distintos se torna fácil. Utilizando comandos simples é possível distribuir, replicar, ou até mesmo rebalancear a carga no armazenamento.

O GlusterFS trabalha com volumes, onde os mais comuns são os replicados e distribuídos. Existem variações destes tipos, o que adiciona mais flexibilidade na hora de implementar um sistema de acordo com a necessidade.

Em volumes distribuídos, o GlusterFS distribui os arquivos em diversos servidores. Num sistema que opera com esse tipo de configuração, caso um servidor falhe, haverá perda parcial das informações, e o sistema continuará operando. Em volumes replicados, o gluster faz uma réplica do volume de cada "brick" em um servidor denominado "replica". Caso ocorra alguma falha nos bricks, as informações são mantidas, porém a falha do servidor réplica deixa o sistema vulnerável à perda de informações.

O GlusterFS trabalha da seguinte forma:
  • GlusterFS seleciona um volume, e envia um pedido utilizando uma chave hash do nome do arquivo.
  • Se for um volume replicado, o pedido é encaminhado para cada subvolume da réplica do cluster, todos os servidores devem responder. Essa resposta informa se o arquivo foi encontrado, ou se possuem pendências no servidor, tais como incompatibilidade, ou caso uma operação de "Self Heal [1]" seja necessária para restauração dos arquivos.
  • Caso o arquivo apontado pelo hash não exista (caso tenha sido renomeado) os mesmos passos devem ser feitos para todos subvolumes [2].
  • Se o arquivo for encontrado, é criado um arquivo de ligação entre o subvolume e o arquivo, apontando para o lugar onde realmente ele se encontra, isso fará com que encontrá-lo seja mais rápido da próxima vez.
  • Para o equipamento que faz acesso ao volume GlusterFS, ao ler muitos arquivos pequenos o cliente NFS terá um desempenho melhor. Porém, se a carga de trabalho é a escrita, o cliente nativo terá um desempenho melhor. Na próxima seção há uma série de resultados dos testes realizados, deixando isto mais claro.
  • Para a conclusão dos resultados que serão mostrados foram feitos diversos testes individuais. Ao final de cada bateria de testes individuais foram calculados a média e a variação dos resultados.
    Antes descreverei brevemente o procedimento adotado para a conclusão desses resultados. Foram simulados diferentes ambientes de testes, utilizando servidores físicos (3 no total) com um volume distribuído pelo gluster. Foi feita uma recarga do sistema operacional após a conclusão de cada teste, a fim de evitar a leitura de dados armazenado em memória cache [3].

    Para os testes foram utilizadas as ferramentas iperf e hdparm (ambas disponíveis para instalação nas distribuições Debian e Red Hat através do apt-get ou yum). O objetivo da instalação dessas ferramentas é verificar se haveria algum tipo de limitação em nível de hardware que impediss resultados consistentes. A rede disponível para a realização dos testes foi de 100 Mbps.

    Testes de bandwidth[4] com o iperf

    O procedimento de testes de conexão foi feito em cada servidor, e todos se mantiveram a uma taxa média de 98 a 99Mbps, compatível com a rede de 100Mbps.

    O software transmite uma determinada quantidade de dados entre o cliente e o servidor, e calcula a taxa de transferência para determinar a largura de banda.

    Comandos utilizados:

    iperf -s (executado no servidor, que por sua vez fica aguardando uma conexão).

    Iperf -c <server> (executado no cliente passando como parâmetro um servidor)

    Testes de leitura de disco com hdparm

    O hdparm é um software para realização de benchmark [5] de leitura e escrita de discos rígidos. O procedimento, assim como o anterior, também foi realizado individualmente. Ele oferece a opção para teste de leitura de cache, porém esse não é o foco nesse momento. O procedimento para verificar a velocidade de leitura é simples, o resultado pode ser obtido com apenas um comando, como segue abaixo.

    hdparm -t /dev/sda


    Testes de transferência de arquivos

    O primeiro passo foi determinar a velocidade de transferência dentro da própria máquina. O teste foi feito individualmente.

    Neste ponto foram realizados testes de transferência de arquivos entre servidor e cliente. Para realizar tal procedimento foi utilizada uma ferramenta para monitoramento chamada pv disponível para download via rpm.

    Foram utilizados milhares de arquivos pequenos, divididos em arquivos de 100k de tamanho, somando um total de 3Gb de arquivos.

    Para evitar gargalos causados pela escrita durante a transferência, foi utilizada uma técnica que redireciona a saída para um arquivo chamado como null no Linux (/dev/null), onde a escrita em disco não é feita.

    Comandos utilizados:

    pv -pta folder_files/* > /dev/null

    Abaixo segue resultado dos testes por ambiente.
    Conclusão

    O GlusterFS demonstrou ser um sistema sólido, cumpriu o que já era esperado, oferecendo um sistema que garante a disponibilidade dos seus recursos,. Mesmo com a ocorrência de falhas causadas propositalmente, todo o esquema de storages continuou operando. O único problema perceptível foi o pequeno delay [6], que ocorre quando o servidor principal perde a conexão com o cliente. Isso pode ser corrigido, diminuindo o tempo de time out no processo de montagem do volume.

    De um modo geral, o GlusterFS se saiu bem, embora ainda esteja em desenvolvimento. A facilidade de expansão do sistema é extremamente simples, isso é uma qualidade notável, principalmente para empresas que expandem seu armazenamento em um curto espaço de tempo.

    Durante os testes foi possível perceber uma tendência de diminuição da taxa de throughput com o aumento dos servidores em cluster e com o aumento da quantide de clientes simultâneos. Entretanto, a real extensão dessa diminuição de desempenho não pôde ser totalmente mensurada, e deve ser objeto de estudos futuros.

    A diversidade de protocolos para conexão fornece flexibilidade ao administrador de sistemas. Mesmo não sendo um dos mais velozes sistemas de distribuição, o sistema GlusterFS mostrou ser um forte concorrente nesse crescente mercado de sistemas distribuídos.


    Instalação e criação de volumes

    Foram utilizados os seguintes passos para instalação do glusterfs-server utilizando o sistema operacional CentOS 7.

    1. Atualizar o sistema

    yum update

    2. Desativar o firewall

    systemctl stop firewalld
    systemctl disable firewalld

    3. Instalar o glusterfs

    yum install -y epel-release
    wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/glusterfs-epel.repo
    yum -y install glusterfs-server

    4. Iniciar o serviço do gluster

    systemctl start glusterd
    systemctl enable glusterd

    5. Criar o volume distribuido

    gluster volume create vol_name server1:/path server2:/path force

    5.2 Configurar as permissões do volume

    gluster volume set vol_name auth.allow 192.168.1.* (Permitir conexão da rede 192.168.1.0)
    gluster volume start vol_name  (Inicia o volume)

    6. Instalar o NFS

    yum -y install nfs-utils
    systemctl start rpcbind nfs-server

    6.1 Configurar o serviço de RPC

    cp /usr/lib/systemd/system/rpcbind.service /etc/systemd/system/
    editar /etc/systemd/system/rpcbind.service e remover a opção "-w"
    systemctl daemon-reload
    systemctl restart rpcbind.service
    systemctl restart glusterd.service


    Instalação do cliente e montagem dos volumes

    Para a instalação e configuração da versão cliente do gluster foi utilizado o procedimento abaixo.

    1. Instalação do cliente no CentOS 7

    yum -y install glusterfs glusterfs-fuse

    2. Instalação do cliente no Ubuntu 14.04 LTS

    Adicionar as seguintes linhas no arquivo do source list (/etc/apt/source.list)

    deb http://ppa.launchpad.net/gluster/glusterfs-3.6/ubuntu trusty main   deb-src
    http://ppa.launchpad.net/gluster/glusterfs-3.6/ubuntu trusty main

    2.1 Adicionar chave de registro para o repositório do glusterfs

    gpg --keyserver subkeys.pgp.net --recv 3FE869A9
    gpg --export --armor 3FE869A9 | sudo apt-key add

    2.2. Instalação do cliente

    apt-get install glusterfs-client

    Montagem dos volumes no cliente

    Para a montagem do sistema de arquivos forma seguidos os procedimentos a seguir.

    1. Utilizando o protocolo glusterfs

    mount -t glusterfs server1:/vol_name /mount_path

    2. Para o protocolo NFS do kernel, adicionar a seguinte linha no arquivo export. Encontrado no caminho /etc/exports.

    /path *(rw,sync,no_subtree_check,no_root_squash)

    2.1 Utilizando o protocolo NFS
    mount -o mountproto=tcp,vers=3 -t nfs server1:/vol_name /mount_path

    Obs: É recomendado utilizar a versão 3 do protocolo NFS. Isso pode ser feito passando o parâmetro direto no comando de montagem, ou através de arquivo de configuração.

    2.2 Adicionar a versão 3 como padrão para montagem no arquivo /etc/nfsmount.conf

    nfsvers=3




    [1] Self Heal é uma técnica utilizada para recuperar dados de um servidor que voltou à operar

    [2] Subvolumes são volumes criados nas máquinas que serão gerenciadas por um volume único, chamado de Unified Global Namespace, que virtualiza e centraliza os volumes em um único volume compartilhado.

    [3] Memória cache é uma pequena quantidade de memória de alto desempenho localizada próxima ao processador

    [4] Bandwidth é a capacidade de transmissão de dados de uma conexão

    [5] Benchmark é a ação de comparar performance e desempenho relativo de um objeto ou produto por meio da execução de um programa de computador

    [6] Delay é o termo técnico usado para designar o retardo de sinais em circuitos eléctronicos

    Nenhum comentário:

    Postar um comentário