O RaftFS consiste em um sistema de armazenamento distribuído tolerante a falhas, desenvolvido nativamente na linguagem Python. O núcleo da aplicação compreende a implementação do algoritmo de consenso Raft, empregando sockets TCP brutos para a coordenação e replicação de estado em um cluster de nós.
- Linguagem Base: Python 3.9
- Comunicação Inter-nós: Sockets TCP brutos (Protocolo de Consenso Raft)
- API e Interface Web: Flask e Werkzeug
- Persistência de Metadados: Banco de dados relacional SQLite3
- Persistência de Arquivos: Sistema de arquivos local (I/O de disco)
- Orquestração e Containerização: Docker e Docker Compose
- Eleição de Líder Automática: Os nós são inicializados no estado de seguidores. Na ocorrência de falha do líder ativo, os seguidores detectam a expiração do tempo limite de manutenção (heartbeat) e deflagram uma nova eleição automaticamente.
- Replicação de Log: Toda alteração de estado no sistema (ex: submissão ou exclusão de arquivos) é registrada como uma entrada de log e replicada para a maioria absoluta dos nós previamente à sua consolidação (commit).
- Prevenção contra Path Traversal: O gerenciador de armazenamento emprega funções de sanitização nativas (
secure_filename) para a limpeza de entradas de texto, bloqueando tentativas de navegação maliciosa de diretórios. - Autenticação de Cliente (API): O acesso às rotas de manipulação de estado do cluster (
/upload_block,/delete_block) exige a validação de um cabeçalho de autenticação (x-api-key). - Autenticação Intra-Cluster: A comunicação trafegada via socket entre os nós (mensagens RequestVote e AppendEntries) é condicionada à validação de um segredo compartilhado (Cluster Token). Conexões não autorizadas são sumariamente rejeitadas.
- Dashboard Local: Interface web nativa para a visualização do estado atual de cada nó (Líder/Seguidor/Candidato) em tempo real.
- API RESTful: Exposição de endpoints para a listagem e transferência de blocos armazenados.
A implantação do sistema é orquestrada via Docker Compose, responsável por instanciar um cluster padrão composto por três nós interconectados.
- Instalação das ferramentas Docker e Docker Compose no ambiente hospedeiro.
É requerida a criação de um arquivo denominado .env no diretório raiz do projeto, contendo as seguintes definições de segurança:
# Chave exigida no cabeçalho 'x-api-key' para autorizar escritas e exclusões
API_SECRET=minha-senha-mestra-apiRAFT_CLUSTER_TOKEN=segredo-interno-raft-2026 2. Inicialização do Cluster A partir do diretório raiz, deve-se executar o comando de construção e inicialização no terminal:
Bash
docker-compose up --build
O processo efetuará o provisionamento das redes virtuais internas, a instalação das dependências do ambiente Python e a inicialização simultânea dos contêineres node1, node2 e node3.
- Acesso à Interface de Monitoramento Após a estabilização do cluster, os painéis de controle individuais podem ser acessados via navegador através dos seguintes endereços locais:
Node 1: http://localhost:6001/
Node 2: http://localhost:6002/
Node 3: http://localhost:6003/
Interação via API REST A interação de clientes ou aplicações com o RaftFS é realizada por meio de requisições HTTP direcionadas à porta da API de qualquer nó ativo. O algoritmo de consenso encarrega-se do roteamento interno e da replicação da operação.
Abaixo são apresentados exemplos de execução utilizando a interface de linha de comando PowerShell.
Submissão de Arquivos (Requer Autenticação) Operação de escrita enviada via método POST.
$headers = @{ "x-api-key" = "minha-senha-mestra-api" }
Invoke-RestMethod -Uri "http://localhost:6001/upload_block/meu_documento.txt" -Method Post -Body "Conteudo do arquivo armazenado" -Headers $headersExclusão de Arquivos (Requer Autenticação) Operação de deleção enviada via método DELETE.
$headers = @{ "x-api-key" = "minha-senha-mestra-api" }
Invoke-RestMethod -Uri "http://localhost:6001/delete_block/meu_documento.txt" -Method Delete -Headers $headersConsulta de Diretório (Leitura Pública) Operação de listagem do mapa de arquivos consolidado no cluster.
Invoke-RestMethod -Uri "http://localhost:6001/files" -Method GetEstrutura de Volumes Gerada Para garantir a integridade do estado em cenários de reinicialização dos contêineres, o sistema mapeará as seguintes estruturas de diretórios no hospedeiro:
/raft_data: Alocação dos bancos de dados SQLite contendo os metadados do protocolo (termos, logs e votos).