Construindo um serviço de log distribuido: Write-Ahead log
Guilherme Marcial
Posted on June 12, 2023
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.
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
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:
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.
Posted on June 12, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.