Sistema de arquivos distribuídos com Raspberry Pi e Glusterfs 2

Nesse post vamos aprender sobre sistema de arquivos distribuídos com Raspberry Pi e Glusterfs. Se você, assim como eu, nasceu na década de 80, provavelmente conheceu o disquete de 3½ polegadas e sua hoje superada capacidade de 1.44 MB. Fato é que na época era comum possuir uma caixa de disquetes, e pelos menos eu, tinha o hábito de armazenar os arquivos mais importantes em pelo menos dois disquetes. Era a forma arcaica de manter os arquivos seguros e disponíveis. Os tempos são outros, hoje um disquete de 1.44 MB possivelmente não seria suficiente para armazenar um único arquivo de foto, por exemplo. Mas embora as grandezas tenham mudado com o tempo, a necessidade de manter os arquivos seguros e disponíveis ainda persiste. Surgiram então diferentes soluções para esse problema:

Algumas com escalabilidade e redundância limitadas e relativamente caras – como o NAS (Network-Attached Storage).

Imagem 1 - NAS

Outras podem trazer alguma desconfiança quanto a segurança e privacidade – como o armazenamento na nuvem.

Imagem 2 - Nuvem

Ou ainda serem possivelmente um ponto único de falha – como um pendrive ou disco rígido usb.

Imagem 3 - Pendrive

Neste post abordaremos uma outra solução. Lembra da história dos dois disquetes que mencionei a pouco? Pois bem, a ideia é a mesma, manter ao menos duas cópias dos arquivos. Não se preocupe, não usaremos disquetes e as cópias não serão manuais. Neste post usaremos um sistema de arquivo distribuído conhecido como GlusterFS (software livre e de código aberto). Ele basicamente agrega múltiplas unidades de armazenamento (nodes) e seus diretórios de exportação (bricks) em um único volume. No nosso caso mais especificamente, utilizaremos duas Raspberry Pi’s como nodes (node1 e node2), cada qual com um pendrive como brick (/data/brick1), formando um único volume (vol0). Dessa forma, mesmo que um node fique inativo, ainda será possível acessar os arquivos.

Imagem 4 - Sistema de arquivos distribuídos

Material necessário

Para realizar este projeto, vamos precisar de:

Nos cartões SD é necessário estar gravado o sistema operacional Raspbian, de preferência o Lite. Qualquer dúvida de como isso deve ser feito, você pode consultar este post.

O que é GlusterFS?

O GlusterFS é um sistema de arquivos distribuídos. Ele incorpora o failover automático como recurso principal, ou seja, mesmo que um node fique inativo, você não perderá o acesso aos arquivos. Ele é também uma maneira fácil e rápida de criar seu próprio NAS, usando praticamente qualquer hardware que você escolher – no nosso caso a Raspberry Pi. O GlusterFS suporta diferentes tipos de volumes, nesse post utilizaremos o volume replicado, que basicamente copia os arquivos para múltiplos bricks, fornecendo alta disponibilidade, quando falhas de nodes ocorrem.

Imagem 5 - GlusterFS

Instalar e configurar GlusterFS

Para começar, precisamos de algum tipo de acesso ao terminal, seja remoto via ssh ou local via teclado. Tudo certo? Então vamos lá!

A convenção seguida é que [TODOS] indica um comando que precisa ser executado em todas as Raspberry Pis. [NODE1] e [NODE2] indica um comando que precisa ser executado individualmente na respectiva Raspberry Pi.

Preparar os nodes

É uma boa prática atribuir manualmente o endereço IP dos nodes. Para isso, copiar e editar o arquivo /etc/dhcpcd.conf. [TODOS]

cp -p /etc/dhcpcd.conf /etc/dhcpcd.conf.default
vim /etc/dhcpcd.conf

Em seguida incluir o conteúdo abaixo no final (fique atento aos comentários). [TODOS]

interface eth0
# SUBSTITUA "192.168.0.1" PELO ENDEREÇO IP DO SEU RASPBERRY PI.
static ip_address=192.168.0.1/24
# SUBSTITUA "192.168.0.1" PELO ENDEREÇO IP DO SEU ROTEADOR.
static routers=192.168.0.1

É recomendado também que os nodes se conheçam pelo nome. Caso não tenha um Servidor DNS autoritativo configurado, será necessário copiar, limpar e editar o arquivo /etc/hosts.

cp -p /etc/hosts /etc/hosts.default
echo "" > /etc/hosts
vim /etc/hosts

Em seguida incluir o conteúdo abaixo (fique atento aos comentários). [TODOS]

127.0.0.1    localhost
# SUBSTITUA "192.168.0.1" PELO ENDEREÇO IP DO PRIMEIRO NODE.
192.168.0.1     node1
# SUBSTITUA "192.168.0.2" PELO ENDEREÇO IP DO SEGUNDO NODE.
192.168.0.2     node2

É essencial que os nodes estejam com a hora corretamente sincronizada. Mais informações podem ser encontradas no post Servidor NTP para manter a hora certa na Raspberry Pi. [TODOS]

Formatar e montar os bricks

Como mencionado anteriormente, cada Raspberry Pi (node) terá um pendrive como diretório de exportação (brick). Nesse post utilizaremos pendrives de 16 GB, que poderiam ser facilmente substituídos por pendrives de maior capacidade ou discos rígidos usb, caso disponíveis.

Antes de conectar os pendrives, verificar as partições do sistema. [TODOS]

lsblk

O resultado deverá ser algo como. [TODOS]

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0 14,9G  0 disk
├─mmcblk0p1 179:1    0 43,2M  0 part /boot
└─mmcblk0p2 179:2    0 14,8G  0 part /

Conectar os pendrives e verificar novamente. [TODOS]

lsblk

Agora é possível ver a partição relacionada ao pendrive. [TODOS]

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 14,9G  0 disk
└─sda1        8:1    1 14,9G  0 part
mmcblk0     179:0    0 14,9G  0 disk
├─mmcblk0p1 179:1    0 43,2M  0 part /boot
└─mmcblk0p2 179:2    0 14,8G  0 part /

O GlusterFS funciona com a maioria dos sistemas de arquivo Unix, sendo XFS e ext4 as escolhas mais populares.

Formatar a partição com ext4. [TODOS]

mkfs.ext4 /dev/sda1

Adicionar uma entrada ao /etc/fstab, para a partição ser montada automaticamente na inicialização do sistema. [TODOS]

echo '/dev/sda1 /data/brick1 ext4 defaults 1 2' >> /etc/fstab

E montar a partição. [TODOS]

mkdir -p /data/brick1 && mount -a && mkdir -p /data/brick1/gv0

Instalar GlusterFS

Instalar os pacotes. [TODOS]

apt-get update && apt-get install glusterfs-server -y

Adicionar nodes ao cluster (trusted pool)

Trusted pool é o termo usado para definir um cluster no GlusterFS.

Adicionar node2. [NODE1]

gluster peer probe node2

Verificar o status. [NODE1]

gluster peer status

O resultado deverá ser algo como.

Number of Peers: 1

Hostname: node2
Uuid: 4d057d07-3274-42e5-9ec9-87993d808a78
State: Peer in Cluster (Connected)

Verificar o status. [NODE2]

gluster peer status

O resultado deverá ser algo como.

Number of Peers: 1

Hostname: node1
Uuid: 720d9f18-34f1-4f38-8ab4-ad58b2321948
State: Peer in Cluster (Connected)

Configurar um volume GlusterFS

Configurar o volume replicado. [NODE1] ou [NODE2]

gluster volume create gv0 replica 2 node1:/data/brick1/gv0 node2:/data/brick1/gv0
gluster volume start gv0

Verificar os status. [NODE1] e [NODE2]

gluster volume info

O resultado deverá ser algo como.

Volume Name: gv0
Type: Replicate
Volume ID: 06fd9bc8-21ee-4ea9-bdbf-406340521b2b
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/brick1/gv0
Brick2: node2:/data/brick1/gv0
Options Reconfigured:
transport.address-family: inet
performance.readdir-ahead: on
nfs.disable: on

Testar o volume GlusterFS

Para acessar o volume, é possível usar NFS ou SMB/CIFS para clientes Windows ou o próprio GlusterFS para clientes Linux. Nesse post abordaremos o segundo método, que não exige configuração adicional, apenas a instalação de um pequeno pacote. Usarei um notebook com sistema operacional Ubuntu Linux como cliente, mas é possível usar um dos nodes para simular um cliente e testar o acesso ao volume, os passos são os mesmo.

Instalar o pacote.

apt-get install glusterfs-client

Montar o volume.

mount -t glusterfs node1:/gv0 /mnt

Gerar 100 arquivos de teste.

for i in `seq -w 1 100`; do cp -rp /var/log/btmp /mnt/copy-test-$i; done

Verificar o ponto de montagem no cliente.

ls /mnt/

Você deverá ver os 100 arquivos.

Imagem 6 - Arquivos GlusterFS

Verificar o ponto de montagem no node1. [NODE1]

ls /data/brick1/gv0/

Você deverá ver os mesmos 100 arquivos.

Imagem 7 - Arquivos GlusterFS

Verificar o ponto de montagem no node2. [NODE2]

ls /data/brick1/gv0/

Você deverá ver os mesmos 100 arquivos.

Imagem 8 - Arquivos GlusterFS

Como podemos observar, as alterações feitas no ponto de montagem do cliente (/mnt) serão replicadas para o ponto de montagem do node1 (/data/brick1/gv0) e do node2 (/data/brick1/gv0/).

Nesse ponto, se um dos nodes falhar o acesso aos arquivos ainda estará garantido, inclusive a criação ou remoção de arquivos será replicada para o node que falhou assim que ele se recuperar. Entretanto caso um node falhe e o node restante por algum motivo seja reiniciado, o acesso aos arquivos ficará indisponível. Essa é uma particularidade da configuração com apenas dois nodes, sendo recomendado quando possível a utilização de três nodes.

Curtiu criar um sistema de arquivo distribuído com Glusterfs e Raspberry Pi? Ajude-nos a melhorar o blog, participe com a sua sugestão, dúvida ou comentário aqui embaixo.

Até a próxima!

Faça seu comentário

Acesse sua conta e participe

2 Comentários

  1. Parabéns pelo artigo, vou fazer alguns testes,
    Seria possível colocar 2 Pendrives no em cada ?

    1. Leonardo,

      Acredito que não seja problema.

      Abraços!
      Diogo – Equipe MakerHero