DEV Community

Cover image for Construindo um serviço de log distribuido: Write-Ahead log
Guilherme Marcial
Guilherme Marcial

Posted on

Construindo um serviço de log distribuido: Write-Ahead log

Introdução

Sistemas distribuídos é um dos temas do qual tenho muito interesse, para começar uma trilha de estudos sobre, resolvi começar com uma abordagem prática, construindo algo real que proporcione uma visão geral e seja próximo da minha atual realidade, optei pelo livro Distributed Services with Go: Your Guide to Reliable, Scalable, and Maintainable Systems do Travis Jeffery, onde a proposta do livro é entender sistemas distribuídos ao construir um

Essa série faz parte do estudo prático sobre a jornada de construção do serviço de log distribuído proposto no livro, onde consiste em armazenar, compartilhar e processar dados ordenadamente, operações atômicas usando log.

Seguindo um caminho parecido do qual Travis Jeffery fez ao construir o jocko, uma implementação do Kafka em Go.

Repositório do projeto: gmarcial/gproglog

Logs

A ideia da construção do serviço é entender os conceitos essenciais por trás do sistemas distribuídos, como os logs.

Começaremos pelo core do serviço, o write-ahead log, solução utilizada em sistemas distribuídos para atomicidade e durabilidade, replicação/distribuição dos dados, backup, recuperação de falha, consenso e mais.

Alguns exemplos de sistemas que usam: Bancos de dados, filas, algoritmos de consenso como paxos e raft, storage engine, change data capture (cdc) e data-stream.

O Write-Ahead Log é uma abstração de armazenamento append-only de registros em sequência, ordenada pela ordem da ocorrência dos registros e cada registro recebe um identificador único e sequencial, indexando o registro a partir do deslocamento no momento que o registro ocorreu.

Novos registros são adicionados ao final e a leitura ocorre no início do log, seguindo a sequência e ordem que os registros aconteceram, do mais antigo para o mais novo.

Representação visual do log.

Para uma explicação profunda e detalhada sobre o conceito, sugiro a leitura do artigo The Log: What every software engineer should know about real-time data's unifying abstraction do Jay Kreps, um dos criadores do Kafka, precursor de muito do que temos hoje de event-stream, stream processing e real-time a partir das experiências da engenharia do Linkedin.

No artigo ele aborda não somente o conceito, mas que os logs são o coração dos sistemas distribuídos, uso, integração, real-time stream processing, surgimento do kafka e como esse conceito está presente no nosso dia a dia, sendo o kafka um log como serviço utilizado amplamente.

Outro artigo que recomendo, muito interessante e que é correlacionado, é o Stream processing, Event sourcing, Reactive, CEP… and making sense of it all do Martin Kleppmann.

Solução

Componentes

O serviço será cliente do Log para gerenciamento dos registros.

A solução consiste em uma API para operar o log, essencialmente a escrita e leitura dos registros que são estruturados em segmentos.

Para a escrita de um novo registro o Log irá delegar para o Segment ativo, onde o processo envolve armazenar o registro através da Store e o indexar através do Index para posterior leitura.

Da mesma forma, para a leitura de um registro o Log irá delegar para o Segment ativo, onde o processo envolve encontrar o registro no Index e caso ele exista o recuperar na Store através do seu deslocamento.

Conforme o limite do Segment atual é atingido, um novo é criado e indicado como ativo.

Visão de como o log é estruturado, sendo representado de verde o Segment ativo:

estrutura

Referência da implementação:

Próximos passos

Com a implementação do log os próximos passos na construção do serviço é prover e expor essas funcionalidades a na rede, para que possa operar.

Isso envolve vários passos até a distribuição e deploy propriamente dito no decorrer da série de estudos do livro.

Extras

Livro I Heart Logs: Event Data, Stream Processing, and Data Integration

Livro do Jay Kreps sobre logs, aparente evolução e continuação do seu post sobre logs, ainda não li, mas parece interessante.

Até o momento em que escrevo, é possível obter o livro gratuitamente através da Confluent nesse link, a alternativa é comprar.

Valencia: A Log-Structured On-Disk Hash

Valencia, implementação de um Log do Jay Kreps, muito parecida com a versão do Travis Jeffery.

Patterns of Distributed Systems por Unmesh Joshi

Unmesh Joshi tem um post no blog martinfowler sobre padrões de sistemas distribuídos, neles contém vários relacionados a log, onde vários são aplicados na solução do serviço do livro como:

Referências

Distributed Services with Go: Your Guide to Reliable, Scalable, and Maintainable Systems.

The Log: What every software engineer should know about real-time data's unifying abstraction.

Stream processing, Event sourcing, Reactive, CEP… and making sense of it all.

Patterns of Distributed Systems

Top comments (2)

Collapse
 
gilbertovgl profile image
Gilberto Lobo

Muito bom! Aguardando os próximos passos.

Collapse
 
gmarcial profile image
Guilherme Marcial

Muito obrigado Gil!