Kafka的数据生产——数据写入流程 & 提高kafka的消费速率

Kafka的工程流程中主要包括了三个阶段:数据生产、数据保存和数据消费

本篇博文主要整理Kafka的数据生产阶段实现原理。

目录

1. Kafka数据生产写入方式

2. Kafka分区原因和原则

首先说一下分区原因

然后说一下分区原则

3. kafka的副本机制

4. kafka写入数据流程

    ps:kafka的ack应答机制(request.requred.acks中修改ack值)

5. 提高kafka的消费速率


1. Kafka数据生产写入方式

对于生产者producer,producer采用推(push)模式将消息发布到broker,每条消息都被追加到同一topic的不同分区partition中,属于顺序写磁盘(顺序写磁盘是kafka独有的一种方式,比随机写内存效率要高,保障kafka的吞吐率,源于kafka做的一些内部优化)

kafka 高吞吐量性能揭秘

由于每个partition中消息有序追加,所以生产的每一个消息都被赋予了一个唯一的offset值,来标识该消息;

在消息消费完了后会把offset存起来,下次消费时,先读取offset,然后从当前offset再往后消费,避免了数据的重复消费。

 

2. Kafka分区原因和原则

首先说一下分区原因

(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。

 

3. kafka的副本机制

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上复制数据。

 

4. kafka写入数据流程

先上一张示意图

(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成功写入。


ps:kafka的ack应答机制(request.requred.acks中修改ack值)

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,数据一般不会丢失,延迟时间长但是可靠性高。

 

5. 提高kafka的消费速率

(1)consumer group不动的前提下,增加partition数;

(2)partition数不动的前提下,对consumer group增加多线程,实现多并行消费。

 

 

 

 

 

 

 

 

 

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值