Kafka的工程流程中主要包括了三个阶段:数据生产、数据保存和数据消费
本篇博文主要整理Kafka的数据生产阶段实现原理。
目录
1. Kafka数据生产写入方式
2. Kafka分区原因和原则
首先说一下分区原因
然后说一下分区原则
3. kafka的副本机制
4. kafka写入数据流程
ps:kafka的ack应答机制(request.requred.acks中修改ack值)
5. 提高kafka的消费速率
对于生产者producer,producer采用推(push)模式将消息发布到broker,每条消息都被追加到同一topic的不同分区partition中,属于顺序写磁盘(顺序写磁盘是kafka独有的一种方式,比随机写内存效率要高,保障kafka的吞吐率,源于kafka做的一些内部优化)
kafka 高吞吐量性能揭秘
由于每个partition中消息有序追加,所以生产的每一个消息都被赋予了一个唯一的offset值,来标识该消息;
在消息消费完了后会把offset存起来,下次消费时,先读取offset,然后从当前offset再往后消费,避免了数据的重复消费。
(1)从producer角度来看,kafka分区更便于在集群中扩展,一个topic可以有多个partition组成,不同partition存放在不同的broker物理节点上,如果往kafka上放大量数据,则只需要增加节点就行,整个kafka集群就可以适应任意大小的数据。
(2)从consumer来看,如果没有分区,一个consumer只能消费一个topic的数据;分区后可以提高并发,多个consumer共同构成一个consumer group,不同consumer对一个topic下的不同partition进行消费,这样可以实现并发消费,消费效率大大提高。
(1)若指定了partition,则直接使用;
(2)若未指定partition但指定了key,通过key的value进行hash出一个partition;
(3)若partition和key都未指定,则使用轮询RoundRobin的方式选出一个partition。
kafka的副本机制实现了很好的容灾性,依托于zookeeper。
在kafka中,一个topic下有多个partition,存放在不同的broker上;
而一个partition又有多个replication副本,对应在server.properties配置中的default.replication.factor=N设置;
若没有replication,当broker节点宕机后,其上的partition数据将不能再被消费,同时也不能再存数据;
有了replication后,有了副本备份机制,一个partition所在broker宕机后,多个replication中会选出一个leader(依赖于zookeeper的选举机制),producer和consumer只与这个leader进行交互,其他的replication则作为副本继续从leader上复制数据。
先上一张示意图
(1)producer先从broker-list的节点中找到该partition的leader;
(2)然后producer将消息发送给作为leader的partition;
(3)leader收到消息后,将消息写入本地log;
(4)followers从leader中pull消息,实现replication的副本备份机制,同样写入本地log;
(5)replication写入本地log后向leader发送ack(确认);
(6)leader收到所有的replication的ack之后,向producer发送ack;
(7)producer收到leader的ack,证明生产的数据已被kafka成功写入。
ack = 0:producer不等待broker中leader的ack;broker接收消息后如果还没写入本地log,broker就发生故障,可能会丢失数据;
ack = 1:producer等待leader的ack,但是不等待replication的ack;这样partition的leader消息落盘成功后返回ack,但是在follwer备份成功之前若leader发生故障,也会丢失数据;延迟时间短但是可靠性低;
ack = -1:producer等待leader和replication的ack,这样只有等leader中partition消息落盘成功,并且follower中replication消息备份落盘成功,才会给producer返回ack,数据一般不会丢失,延迟时间长但是可靠性高。
(1)consumer group不动的前提下,增加partition数;
(2)partition数不动的前提下,对consumer group增加多线程,实现多并行消费。