Apache Kafka – популярная распределенная потоковая платформа, известная своей масштабируемостью и отказоустойчивостью. В Кафке есть две важные роли, которые играют решающую роль в работе системы: лидер и последователь. В этой статье мы углубимся в роли лидера и последователя в Apache Kafka и поймем их значение в обеспечении надежной обработки сообщений.
Понимание ролей лидера и последователя.
В Kafka темы разделены на разделы, и каждый раздел реплицируется на нескольких брокерах для обеспечения отказоустойчивости. Давайте рассмотрим роли лидера и последователя в этом контексте:
-
Лидер:
Лидер отвечает за обработку всех запросов на чтение и запись для определенного раздела. Он получает сообщения от производителей, добавляет их в журнал раздела и реплицирует их последователям. Лидер также контролирует процесс синхронизации с подписчиками, гарантируя, что они будут в курсе последних сообщений. В случае провала лидера новым лидером избирается один из последователей. -
Подписчик:
Подписчики копируют журнал лидера и синхронизируются, получая сообщения от лидера. Они действуют как резервные копии, обеспечивая высокую доступность и отказоустойчивость. Каждый ведомый поддерживает копию раздела лидера и может взять на себя роль нового лидера, если текущий лидер потерпит неудачу. Последователи также обслуживают запросы на чтение, обеспечивая возможности масштабирования и балансировки нагрузки.
Методы работы с лидером и последователем в Kafka:
- Проверка лидерства раздела.
Чтобы определить, является ли конкретный раздел лидером или последователем, вы можете использовать KafkaAdminClient API:
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.AdminClientConfig;
import org.apache.kafka.clients.admin.DescribeTopicsOptions;
import org.apache.kafka.clients.admin.DescribeTopicsResult;
import org.apache.kafka.clients.admin.TopicDescription;
import org.apache.kafka.common.KafkaFuture;
import java.util.Collections;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
public class KafkaPartitionLeadershipExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Properties properties = new Properties();
properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
AdminClient adminClient = AdminClient.create(properties);
DescribeTopicsOptions options = new DescribeTopicsOptions().timeoutMs(5000);
DescribeTopicsResult topicsResult = adminClient.describeTopics(Collections.singletonList("my_topic"), options);
TopicDescription topicDescription = topicsResult.values().get("my_topic").get();
System.out.println("Leader: " + topicDescription.partitions().get(0).leader());
System.out.println("Followers: " + topicDescription.partitions().get(0).replicas().stream()
.filter(replica -> replica.id() != topicDescription.partitions().get(0).leader().id())
.map(Object::toString)
.collect(Collectors.joining(", ")));
adminClient.close();
}
}
- Мониторинг состояния лидера и последователей.
Вы можете использовать Kafka Controller API для мониторинга состояния здоровья и статуса лидеров и последователей:
import kafka.controller.KafkaController;
import kafka.controller.ReplicaState;
import kafka.utils.ZkUtils;
public class KafkaLeaderFollowerMonitoringExample {
public static void main(String[] args) {
String zkConnect = "localhost:2181";
ZkUtils zkUtils = ZkUtils.apply(zkConnect, 30000, 30000, false);
KafkaController kafkaController = new KafkaController(zkUtils);
Map<TopicAndPartition, ReplicaState> replicaStates = kafkaController.replicaStates();
for (Map.Entry<TopicAndPartition, ReplicaState> entry : replicaStates.entrySet()) {
System.out.println("Topic: " + entry.getKey().topic() + ", Partition: " + entry.getKey().partition() +
", State: " + entry.getValue().name());
}
zkUtils.close();
}
}
Роли лидера и последователя в Apache Kafka имеют основополагающее значение для его распределенной архитектуры. Лидеры обрабатывают запросы на чтение и запись, а последователи реплицируют журнал лидера и обеспечивают отказоустойчивость. Понимая эти роли и используя соответствующие методы, вы можете эффективно отслеживать лидеров и последователей в вашем кластере Kafka и управлять ими, обеспечивая надежную и масштабируемую обработку сообщений.