Как работает масштабирование Kafka: репликация и шардирование
Что проверяют
Различаете ли вы две оси масштабирования: партиции дают параллелизм и пропускную способность, реплики дают отказоустойчивость, и одно не заменяет другое. Следом обычно спрашивают, что будет при падении брокера и можно ли потом добавить партиций.
Как отвечать
- партиции (шардирование): топик делится на партиции, каждая это упорядоченный лог. Порядок гарантирован только внутри партиции. Продюсер выбирает партицию по хэшу ключа, поэтому сообщения с одним ключом попадают в одну партицию и читаются по порядку;
- параллелизм чтения: в группе консьюмеров одну партицию читает один консьюмер, так что число партиций это потолок параллелизма группы;
- реплики:
replication.factorзадаётся на топик, обычно 3. Лидер есть у каждой партиции, а не у топика: он принимает запись, фолловеры копируют его лог. Лидеры разных партиций разнесены по брокерам, так и делится нагрузка; - ISR: реплики, которые успевают за лидером. Продюсер с
acks=allполучает подтверждение, когда запись есть во всех ISR, аmin.insync.replicas=2при факторе 3 запрещает запись, если в строю остался один лидер; - метаданные кластера: в Kafka 4.0 ZooKeeper удалён, кластер работает на KRaft.
Со стороны Go назовите клиент, с которым работали: franz-go, segmentio/kafka-go, IBM/sarama или confluent-kafka-go поверх librdkafka через cgo. У Java-продюсера acks=all стоит по умолчанию с Kafka 3.0, а у Go-клиентов умолчания разные, поэтому значение лучше задавать явно.
Где спотыкаются
Говорят, что у топика один лидер. Лидер свой у каждой партиции, иначе весь топик упирался бы в один брокер.
Увеличивают число партиций на живом топике и удивляются нарушению порядка. Партиции можно только добавить, уменьшить нельзя, а после добавления ключ начинает попадать в другую партицию: номер считается как хэш по модулю числа партиций.
Смешивают продюсеры на разных языках без проверки партиционера. У части Go-клиентов хэш по умолчанию не совпадает с murmur2 из Java-клиента, и одинаковый ключ из двух сервисов уходит в разные партиции.