文章目录
- 1:kafka集群的配置如何
- 2:kafka的吞吐量为什么高
- 2.1生产者方面
- 2.2消费者方面
- 3:Kafka(幂等性和事务性)中的消息是否会丢失和重复消费?
- 4:producer如何优化速度
- 5:kafka的优点
- 6:kafka和zookeeper关系
- 7:Kafka消费者提交消费位移时提交的是当前消费到的最新消息的 offset 还是 offset+1?
1:kafka集群的配置如何
数据盘:6块8T的固态数据盘,由12块raid1组成。
内存256G。
2:kafka的吞吐量为什么高
包括生产者和消费者两面优势
2.1生产者方面
1:顺序读写
topic以分区partition存放,每条消息都有一个偏移量,每个partition是一个文件存放在硬盘上。所以写入时消息是根据偏移量不断追加到文件中的。不需要硬盘磁头的寻道时间,所以速度远快于随机读写,甚至和内存读写媲美。缺点就是不允许删除消息。
所以为了避免存储压力:Kakfa提供了两种策略来删除数据。一是基于时间,二是基于partition文件大小。具体配置可以参看它的配置文档。
2:内存mmap技术和异步(async)发送
操作系统会在程序主动调用flush的时候才把数据真正的写到硬盘。Kafka提供了一个参数——producer.type来控制是不是主动flush,如果Kafka写入到mmap之后就立即flush然后再返回Producer叫同步(sync);写入mmap之后立即返回Producer不调用flush叫异步(async)
3:数据压缩
Kafka还支持对消息集合进行压缩,Producer可以通过GZIP或Snappy格式对消息集合进行压缩。 压缩的好处就是减少传输的数据量,减轻对网络传输的压力,但是增加了消费端的cpu压力,但是对于kafka,cpu压力高不值一提。
4:零拷贝(zero-copy)
写到bytebuffer后,发送producerRequest到broker,broker直接把bytebuffer数据拉过来
5:批次发送,而不是每条消息都发送,默认批次大小16k,和linger.ms默认=0满足其一即可发送。
2.2消费者方面
1:零拷贝(zero-copy)
调用系统的sendfile函数,根据消费者传递过来的偏移量读取指定内容的数据返回给消费者,大大减少数据复制。
3:Kafka(幂等性和事务性)中的消息是否会丢失和重复消费?
为了实现EOS(exactly once semantics,精确一次处理语义)karka从0.11.0.0版本开始引入了幂等性和事务两个特性来支撑。
kafka的幂等性: 确保了单分区的消息的一次处理语义,即只发送一次,不会重复存储和单分区数据的有序性。它通过pid 和消息序列号来实现,当客户端发送到broker端的消息序列号小于等于broker端缓存的pid对应的seq的时候,忽略这个消息并保持,保证了消息不会被重复消费,同时幂等性的设置保证了kafka的客户端重试=-1,也保证了消息肯定能到达,这样就满足了 exactly once的语义。
开启幂等性功能的方式很简单,只需要显示地将生产者客户端参数enable.idempotence设置为true就可以(默认位false)
不过如果要确保幂等性功能正常,还需要确保生产者客户端的retries、acks、max.in.filght.request.per.connection这几个参数不被配置错。如果用户没用自定义过上面参数,那么幂等性功能可以完全被保证。
kafka的事务性:事务可以保证对多个分区写入操作的原子性,通过transactionalId(事物id)实现
,保证同一批消息要么成功要么失败。
要确定Kafka的消息是否丢失或重复,从两个方面分析入手:生产和消费。
1、生产
配置request.required.acks属性来确认消息的生产方式:
0---表示不进行消息接收是否成功的确认;不和Kafka集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失;
1---表示当Leader接收成功时确认;同步模式下,只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;
-1---表示Leader和Follower都接收成功时确认;不会丢失
2、消费
消息丢失:消息偏移量提交但是还没有消费就失败了
消息重复:消费成功了但是偏移量提交失败
4:producer如何优化速度
增加线程
提高 batch.size
增加更多 producer 实例
增加 partition 数
增加log.dir数据写入路径,多磁盘写入
数据不怕丢失可以acks=0
设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(follower 同步数据的线程数)来调解;
5:kafka的优点
易扩展
高吞吐量
消息易于消费管理
6:kafka和zookeeper关系
主要在producer生产,consumer消费和broker管理三个方面,但是逐渐在弱化zk的作用,减少负载
生产时:通过zk寻找broker节点,并进行生产者均衡负载
broker管理:通过心跳感知判断Broker节点是否丢失,记录broker节点;存储topic的元数据操作,比如删除,新建,修改以及isr信息,选举partition的leader
consumer消费:这些消费者组,记录消费的偏移量
7:Kafka消费者提交消费位移时提交的是当前消费到的最新消息的 offset 还是 offset+1?
消费者需要提交的消费位移并不是x,而是x+1,对应于上图中的 position,它表示下一条需要拉取的消息的位置,消费者再次消费读取的也是x+1(该条消息未被消费)