Dois pacotes saem juntos: v1.5 — Armazenamento e ciclo de vida e v1.6 — Operação, controlador e quotas. Juntos trazem ao Kafka Simulator 19 novos cenários, o currículo chega a 74 de 122, e o modo livre termina a escada de formas de cluster começada na v1.3.
Desta vez começamos pelo modo livre, porque são estes dois desbloqueios os mais pedidos.
Modo livre: a escada de topologias está completa
Desde a v1.3 o sandbox crescia uma forma de cluster por pacote: primeiro ativo/passivo, depois ativo/ativo. Ambos são dois clusters ligados por um mirror assíncrono. As duas formas que chegam agora são de outro tipo: um só cluster esticado entre datacenters, onde a replicação é síncrona e o próprio ISR atravessa a WAN.
A diferença aparece assim que algo falha:
- Num par espelhado, perder uma região é um failover: promoves o outro lado e aceitas o que o mirror ainda não tinha copiado.
- Num cluster esticado, perder um DC é um evento de replicação: o ISR encolhe, e se ainda podes escrever depende apenas de
min.insync.replicas.
3-DC esticado (novo na v1.5)
Três datacenters, um cluster. O sandbox por omissão dá-te um broker e um controlador em cada um de dc-a, dc-b e dc-c, com os brokers intercalados para que a colocação round-robin espalhe as réplicas de cada partição pelos três sítios. Três partições, por isso cada DC abre com um líder natural, por isso a disposição mostra liderança equilibrada entre DCs em vez de uma partição solitária.
Há um quórum KRaft distribuído pelos três sítios, não um por região. Mata um DC e perdes um votante em três; os dois restantes continuam a formar maioria e o cluster continua a decidir.
2,5-DC esticado (novo na v1.6)
O último degrau: dois datacenters de dados mais um terceiro sítio testemunha que detém um voto de controlador e nenhuns dados.
É a forma MRC da Confluent. Cada DC de dados recebe 2 réplicas síncronas e 1 observador — RF 4 no conjunto síncrono, com min.insync.replicas a 3. Duas coisas sobre os observadores:
- Não contam para o ISR, por isso não seguram uma escrita
acks=all. Uma réplica através da WAN que condicionasse cada commit seria um desastre de latência; um observador é como manténs uma cópia remota sem a pagar no caminho de escrita. - Quando o ISR cai abaixo de
min.insync.replicas, um observador pode ser promovido automaticamente para restaurar a durabilidade. Por omissão o sandbox promove na queda do ISR e despromove de novo quando o DC recupera; também pode ficar promovido, ou desligas o automatismo e fazes à mão.
A testemunha encaixa diretamente nos cenários de controlador desta entrega. Um quórum quer um número ímpar de votantes, e comprar um terceiro datacenter completo para o obter é caro — por isso compras meio. O cenário 06.0.2 («quórum KRaft») termina exatamente na falha que a testemunha existe para evitar; agora podes montar as duas configurações no sandbox e compará-las.
Com isto, as cinco formas de cluster estão disponíveis: DC único, ativo/passivo, ativo/ativo, 3-DC esticado e 2,5-DC esticado. Cada desbloqueio restante do modo livre — o laboratório de falhas na v1.7, o terminal CLI do Kafka na v1.8, a governança na v1.9 — é uma capacidade nova, não uma forma nova.
A mesma ressalva da v1.3: o currículo de DR que narra estas topologias continua a chegar na v1.8. As formas aterram primeiro de propósito, para que haja onde experimentar as ideias antes de os cenários as explicarem.
Se entretanto quiseres ler mais sobre arquiteturas multirregião, o guia da SoftwareMill sobre recuperação de desastres e arquiteturas multirregião no Apache Kafka é um tratamento aprofundado dos compromissos que estas formas codificam. Vale a pena tê-lo aberto noutro separador enquanto brincas com o sandbox.
Os cenários
v1.5 — Armazenamento e ciclo de vida (9 cenários)
Um log do Kafka não é uma fita infinita. Este módulo cobre em três grupos o que acontece aos registos depois de escritos.
Retenção — retention.ms e retention.bytes a avançar o log start offset, e o que recebe um consumidor que pede um offset já apagado pela retenção (OFFSET_OUT_OF_RANGE, e o reset que se segue).
Compactação — cleanup.policy=compact a guardar o último valor por chave preservando offsets e deixando buracos; tombstones a apagar uma chave, com delete.retention.ms como janela de graça para um consumidor observar a eliminação antes de ser purgada; e compact,delete a correr ambas as políticas juntas.
Armazenamento em camadas — descarregar um prefixo envelhecido do log para a camada remota, lê-lo de volta, e a diferença entre retenção local e total. É o grupo que mais muda o dimensionamento de um cluster: a retenção local deixa de ser o que limita até onde atrás um consumidor pode ler.
v1.6 — o plano de controlo (kraft, 4 cenários)
O que o controlador faz, e o que para quando ele não está:
- O trabalho do controlador e o quórum KRaft — o controlador mantém consistentes os metadados, não os dados. Perde a maioria do quórum e não há controlador: os líderes ficam onde estão e nada de novo é decidido até que um votante volte.
- Failover do controlador e recuperação de metadados — um novo controlador ativo tem de alcançar o offset de metadados confirmado antes de poder servir, e é por isso que as eleições congelam por um momento após um failover.
- ZooKeeper contra KRaft — o mesmo cluster sob dois planos de controlo, lado a lado.
v1.6 — operação (operations, 6 cenários)
O que um operador muda num cluster em produção, e o que cada mudança custa:
- Escalar para fora e o rebalanceamento que se segue; escalar para dentro, drenando um broker antes de o remover.
- Reatribuição manual de partições, e a mesma reatribuição limitada sob carga — onde vês uma réplica nova entrar tarde no ISR porque puseste um teto ao seu ritmo de recuperação para proteger o tráfego vivo.
- Alterações de configuração a quente e quotas de cliente que estrangulam um produtor atrasando as respostas em vez de descartar dados.
O que vem a seguir
74 de 122 cenários, sete pacotes entregues e um sandbox de modo livre que já consegue modelar todas as formas de cluster a que o resto do currículo se vai referir. A seguir vem a v1.7 e o laboratório de falhas: injetar mortes de brokers e partições de rede em qualquer uma dessas cinco formas, a pedido.
Abre o simulador, arranca um sandbox de 2,5-DC e mata um DC de dados, e depois vê um observador ser promovido para te manter acima de min.insync.replicas.