Skip to content

rozendox/distributed_fs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RaftFS - Sistema de Arquivos Distribuído

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.

Arquitetura e Stack Tecnológico

  • 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

Funcionalidades Implementadas

1. Protocolo Raft (Consenso)

  • 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).

2. Segurança em Profundidade

  • 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.

3. Monitoramento e Telemetria

  • 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.

Procedimentos de Execução

A implantação do sistema é orquestrada via Docker Compose, responsável por instanciar um cluster padrão composto por três nós interconectados.

Pré-requisitos

  • Instalação das ferramentas Docker e Docker Compose no ambiente hospedeiro.

1. Configuração de Variáveis de Ambiente

É 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-api

Token criptográfico interno exigido para a comunicação inter-nós

RAFT_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.

  1. 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 $headers

Exclusã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 $headers

Consulta 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 Get

Estrutura 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).

About

Repositorio destinado ao projeto de implementacao do algoritmo raft que usa a logica de consensus, que tem o proposito de ser utilizado no projeto de termino de conclusao de curso do bacharel de Ciencia da Computacao

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors