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

gmarcial

Guilherme Marcial

Posted on June 12, 2023

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

💖 💪 🙅 🚩
gmarcial
Guilherme Marcial

Posted on June 12, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related