1. 关系
主题(Topic)可以分为多个分区(Partition),每个分区有多个副本(Replica),其中一个为Leader副本,其余为Follower副本。在Kafka集群中,每个Broker可以同时作为生产者和消费者。当生产者向某个主题的分区发送消息时,消息首先写入Leader副本,然后同步到Follower副本。这样,如果Leader副本宕机,Follower副本会自动接替,确保集群持续可用。
Broker是Kafka集群中的服务器,负责存储和管理消息,处理消费者请求,并管理主题、分区和消费者组等信息,是Kafka架构的关键角色。
2. 举个例子
使用命令创建主题:
kafka-topics.sh --create --topic ods_mall_log --partitions 4 --replication-factor 2 --bootstrap-server bigdata1:9092
-
--topic ods_mall_log
:主题名称为ods_mall_log。
-
--partitions 4
:分区数为4。
-
--replication-factor 2
:副本数为2(1个主副本(Leader)和1个备份副本(Follower))。
-
--bootstrap-server bigdata1:9092
:指定Kafka集群的Broker地址和端口号
为了确保数据冗余,至少需要3个Broker。若主副本和备份副本在同一Broker上,Broker损坏会导致数据丢失。建议分配副本时,确保主副本和备份副本分布在不同的Broker上,以提高可用性和容错性。
这将创建一个名为ods_mall_log的Topic,其中包含4个分区和2个副本,那么至少需要在3个broker里开启kafka服务
3.解释原因
那么为什么至少需要3个副本呢???
如果副本只有两个,即一个主副本和一个备份副本,且它们在同一个Broker上,当该Broker损坏时,包含这些副本的分区会出现故障,导致数据丢失。
有人可能会建议如下分配:
-
第一个分区的主副本在Broker1,备份副本在Broker2;
-
第二个分区的主副本在Broker1,备份副本在Broker2;
-
第三个分区的主副本在Broker1,备份副本在Broker2;
-
第四个分区的主副本在Broker1,备份副本在Broker2。
但这样仍然存在问题:如果Broker1损坏,Broker2上的备份副本变为主副本,Kafka会在Broker2上重新建立备份副本。此时,Broker2同时存在一个主副本和一个备份副本,无法实现数据冗余和故障转移,导致可用性和容错性降低。而我们使用Kafka的目的是提高工作效率,所以就需要考虑到borker出现故障的情况。
4. 总结
-
建议使用3、5、7等奇数个Broker。
-
创建Topic时,副本数需大于或等于可用Broker数量,以避免数据丢失或不可用。