1、Kafka集群工作进程
下面了解一下Kafka的工作流程,Kafka集群会将消息存储在Topic中,每条记录会由一个Key、一个Value和一个Timestamp组成。
Kafka中的消息是以Topic进行分类的,生产者生产消息,消费者消费消息,读取和消费的都是同一个Topic。Topic是逻辑上的概念,Partition是物理上的概念,每个Partition对应一个log文件,该log文件中存储的就是Producer生产的数据。Producer生产的消息会不断的顺序追加到该log文件末尾,并且每条消息都会记录自己的Offset。而消费者组中的每个消费者也都会实时记录当前自己消费到了那个Offset,方便在崩溃恢复时可以继续从上次的Offset位置消费。
2、Kafka集群存储机制
Producer端生产的消息会不断的追加到log文件末尾,这样文件就会越来越大,为了防止log文件过大导致数据定位效率低下,那么kafka采取了分片和索引机制。它将每个Partition分为多个Segment,每个Segment对应4个文件,如下
- .index:索引文件,存储大量的索引信息;
- .log:数据文件,存储大量的数据;
- .snapshot:快照文件;
- .timeindex:时间索引文件;
这些文件都位于同一文件夹下面,该文件夹的名命规则为:topic名称-分区号。这些文件以当前Segment的第一条消息的Offset名命。
索引文件中的元数据指向对应数据文件中消息的物理偏移量,下面为index文件和log文件的示意图:
3、Kafka集群Replica副本
Kafka中的Partition为了保证数据安全,每个Partition可以设置多个副本,如对分区0,1,2分别设置3个副本(设置两个副本较为合适),而且每个副本都是有“角色”之分的,它们会选取一个副本作为Leader副本,而其他的作为Follower副本。Producer端在发送数据的时候,只能发送到Leader Partition里面,然后Follwer Partition回去Leader Partition那自行同步,Consumer消费数据时也只能从Leader副本那去消费数据。
4、Kafka集群Controller
Kafka Controller其实就是一个Kafka集群中一台Broker,它除了具有普通Broker的消息发送、消费、同步功能外,还需承担一些额外的工作。Kafka使用公平竞选的方式来确定Controller,最先在Zookeeper成功创建临时节点(/controller)的Broker会成为Controller,一般而言,Kafka集群中的第一台启动的Broker会成为Controller,并将自身Broker编号等信息写入Zookeeper临时节点(/Controller)。
5、Kafka集群Offset维护
Consumer在消费过程中可能会出现断电宕机等故障,在Consumer恢复后,需要哦测那个故障前的Offset位置继续消费,所以Consumer需要实时记录自己消费到了那个Offset,以便故障恢复后继续消费。在Kafka0.9版本之前,Consumer默认将Offset保存在Zookeeper中,但从0.9版本开始,Consumer默认将Offset保存在Kafka的一个内置的Topic中,该Topic为_consumer_offsets,以支持高并发的读写。
若有不当或错误之处,欢迎大家留言指正。