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).
Outras podem trazer alguma desconfiança quanto a segurança e privacidade – como o armazenamento na nuvem.
Ou ainda serem possivelmente um ponto único de falha – como um pendrive ou disco rígido usb.
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.
Material necessário
Para realizar este projeto, vamos precisar de:
- 2 x Raspberry Pi 3 Modelo B+
- 2 x Cartão SD
- 2 x Fonte 5 V
- 2 x Pendrive 16 GB
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.
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.
Verificar o ponto de montagem no node1. [NODE1]
ls /data/brick1/gv0/
Você deverá ver os mesmos 100 arquivos.
Verificar o ponto de montagem no node2. [NODE2]
ls /data/brick1/gv0/
Você deverá ver os mesmos 100 arquivos.
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!
Parabéns pelo artigo, vou fazer alguns testes,
Seria possível colocar 2 Pendrives no em cada ?
Leonardo,
Acredito que não seja problema.
Abraços!
Diogo – Equipe MakerHero