Kafka-backup: Apoie backups pontuais

Criado em 8 abr. 2020  ·  13Comentários  ·  Fonte: itadventurer/kafka-backup

Esta é uma ferramenta única (significa que não precisa ser executada em segundo plano depois que o backup é feito), portanto, a dependência do processo daemon em segundo plano é engraçada. Não há necessidade de executar o kafka-connect como um daemon.

enhancement help wanted

Todos 13 comentários

Você está certo quanto ao procedimento de restauração. Restaurar é uma atividade única.
O backup é uma atividade em execução contínua. Não há nenhum "Terminei de fazer um backup" no Kafka, pois os dados do Kafka são um fluxo e não há fim para isso. Claro, você pode supor que, se não obtiver nenhum dado novo por x segundos, você está "pronto", mas não pode generalizar isso.
Dê uma olhada nos números 46 e 54 para mais

56: então:

@itadventurer

O backup é uma atividade em execução contínua.

Isso pressupõe um fluxo contínuo de dados 24x7x365, o que não se aplica a todos os casos. Em nosso caso, o fluxo é executado por X horas por dia apenas, o backup só acontece depois disso e na verdade é planejado como um backup / instantâneo diário de dados.

Acho que deve haver uma maneira de detectar (internamente) que não houve nenhuma mensagem nova por um período de X (possivelmente intervalo configurável) após o qual o processo de backup seria encerrado normalmente e, assim, encerraria o processo.

Outra alternativa (possivelmente mais simples) para isso seria apenas fazer backup das mensagens até a data e hora de quando o backup foi iniciado. Não tenho certeza de como isso funcionaria junto com o backup dos offsets. Talvez primeiro faça backup dos offsets, então saberemos o timestamp em que fizemos backup dos offsets e podemos fazer o backup das mensagens até aquele timestamp.

Eu vejo seu ponto. Sim, provavelmente seria bom ter uma maneira de fazer backups pontuais: pensando:
Porém, isso não é trivial, pois não há uma maneira fácil de decidir se um fluxo "terminou".

O que você pode fazer no seu caso:

  • Deixe o Kafka Backup rodando em segundo plano
  • O Kafka Backup grava dados continuamente em segundo plano no sistema de arquivos
  • kill -9 Kafka Backup assim que "terminar", ou seja, terminar de gravar seus dados. Isso deve ser feito imediatamente após você terminar de produzir os dados
  • mova os dados do Kafka Backup para seu novo destino.

Eu entendo que este é um caso de uso bastante comum e irei fornecer mais documentação para isso com o # 2. Para v0.1, a documentação é o último grande problema, então espero que isso aconteça logo;)


Eu vejo a seguinte abordagem

  • # 54 apresenta uma nova ferramenta CLI autônoma. A ferramenta CLI deve oferecer suporte a isso.
  • Adicionamos um novo sinalizador --snapshot à ferramenta CLI (ou adicionamos uma nova ferramenta chamada backup-snapshot.sh )

Como detectar quando um backup está "concluído" (aplicável apenas se o sinalizador --snapshot estiver definido):

  • Lembramos o momento em que o backup é iniciado. Todos os registros que possuem um carimbo de data / hora mais recente são ignorados durante o backup
  • Quando uma partição não produz novos dados por algum tempo (por exemplo, 20s), assumimos que não há novos dados

O que você acha?

Deixe o Kafka Backup rodando em segundo plano

O problema é exatamente com esta etapa. Não podemos mantê-lo funcionando em segundo plano. Só temos uma janela específica para fazer o instantâneo. Não cabe a nós decidir quando podemos fazer o backup, é um requisito regulamentar externo.

Lembramos o momento em que o backup é iniciado. Todos os registros que possuem um carimbo de data / hora mais recente são ignorados durante o backup

Sim, é exatamente isso que eu quis dizer e acho que isso removeria a necessidade de tê-lo rodando em segundo plano (e tentar capturar o momento em que todos os produtores terminaram).

Quando uma partição não produz novos dados por algum tempo (por exemplo, 20s), assumimos que não há novos dados

Acho que essa opção é exclusiva mútua com a outra. E acho que o primeiro é melhor, pois fornece um ponto de referência específico e não depende de encontrar uma janela quando não há mensagens.

Na verdade, eu queria escrever que isso é quase impossível com Kafka, mas enquanto escrevia, tive uma ideia para uma solução:

O kafka-consumer-groups retorna a posição atual do consumidor na partição, mas mais interessante, ele retorna o deslocamento final atual de cada partição particular. Isso significa que há uma maneira de obter o deslocamento mais recente para uma partição em um determinado momento. Atualmente, não tenho ideia de como isso é feito (preciso verificar o código).

Portanto, agora há um caminho claro para fazer um backup pontual (mais ou menos):

  1. Obtenha o deslocamento de fim de partição para cada partição a ser copiada (em algum lugar aqui: https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink /BackupSinkTask.java#L81)
  2. Consumir cada partição
  3. Assim que um registro consumido tiver um deslocamento >= aquele salvo para aquela partição, lembre-se disso. Ignore todos os registros do backup. (Veja https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink/BackupSinkTask.java#L63)
  4. Assim que todas as partições estiverem atualizadas imprima uma mensagem para STDOUT
  5. Use o script de wrapper para detectar essa mensagem e eliminar a conexão do kafka normalmente. Semelhante a como é resolvido durante a restauração: https://github.com/itadventurer/kafka-backup/blob/master/bin/restore-standalone.sh#L232 -L252

Você vê que isso realmente não é tão trivial.

Meu foco atual é melhorar o conjunto de testes e estabilizar o Kafka Backup para uma primeira versão (consulte https://github.com/itadventurer/kafka-backup/milestone/1). Não posso fornecer um ETA para esse recurso. Eu ficaria mais do que feliz em revisar um PR para isso (e também estou procurando por mantenedores adicionais;)) Fico feliz em ajudar se houver alguma dúvida

Você vê que isso realmente não é tão trivial.

Estou mais voltado para operações (como configurar, monitorar clusters Kafka, etc.). Então, eu confio em você nesta parte. O que quero dizer é que, do meu lado do trabalho, isso é algo que eu (e quase todos os outros) precisamos.

Eu ficaria mais do que feliz em revisar um PR para isso (e também estou procurando por mantenedores adicionais;))

Não sou muito bom com Java / Scala para ajudar muito aqui. Se fosse Python, C / C ++ ou pelo menos Go eu poderia ajudar: P

Olá!
em primeiro lugar - estou feliz por encontrar sua solução, porque eu tenho que fazer backup dos dados do tópico kafka
na segunda - infelizmente não consegui escrever nada em Java / Scala, então preparei 'wrapper' para você 'backup-standalone.sh' com python para solução de backup completo
https://gist.github.com/FloMko/7adf2e00cd80fe7cc88bb587cde999ce
Será bom ver todas as atualizações sobre qualquer suporte integrado para backup pontual

Ei,
Obrigado por seu trabalho! Como uma solução temporária, eu poderia imaginar adicionar isso como um script adicional a este repo e substituí-lo posteriormente por uma solução integrada. Sinta-se à vontade para adicionar isso como uma solicitação Pull :) (para ./bin/kafka-backup-point-in-time.py ou outra coisa;))

Estou prestes a publicar uma implementação completamente separada escrita em Go que não depende da API de conexão. Apenas para sua informação. Já estamos usando em nosso ambiente de produção.

@akamensky você poderia compartilhar sua solução? desde que você tenha testado sua solução, vai ficar tudo bem

@FloMko acabamos de publicá-lo. Você pode encontrá-lo (bem como um binário reconstruído) aqui

Obrigado @WesselVS pelo seu PR # 99! Acabei de mesclá-lo com o master. Faremos um lançamento com este aprimoramento e algumas outras correções em breve.

@akamensky Cool! Ótimo ver mais trabalho em relação aos backups do Kafka;)

Esta página foi útil?
0 / 5 - 0 avaliações