kafka消息中间件的数据一致性

kafka之理解

  • 分区

kafka是一种分布式的基于发布/订阅模式的消息中间件。相对于其他的消息中间件,其最大的优势在于它的吞吐量很大。那么kafka是如何保证他的高吞吐呢?

分区

kafka使用若干机器作为broker服务器,当消息到来时,多个broker都可以对消息进行处理,这样就可以确保其高负载能力。每个broker上都有若干分区,生产者在生产消息时需要制定分区或者k值(如果以上两者都没有,kafka会随机生成一个序列,发送的消息按照上述序列发送到不同分区)kafka是将消息存储在磁盘中的,kafka按照topic对消息进行分类。
按理说,在大吞吐量生产消费消息时,采用磁盘存储消息慢很多。spark正是由于将中间结果放在了内存中计算速度比mapreduce快了很多。那么为什么kafka在使用内存其读写速度依然很快呢
#顺序IO和index文件
正常情况下,磁盘的写速度会比内存慢,但是如果是向磁盘文件追加数据,那么这个速度就会很快。之前的hdfs在存储data的元数据信息时,也是采用这种方式将元数据信息追加到editlog中。kafka采用的是将消息数据根据生产者的指令追加到分区的log文件(实际内部是消息数据)中。一旦该log文件超过默认数据量,那么就需要将新产生的消息放入一个新的log文件。那么就需要使用index的文件来记录消息的偏移量和长度来加速查询。所以通过上述方法可以确保消息的快速写入和快速查询。

#消息数据安全

那么在高速大吞吐量的生产消费时,如何确保消息不丢失,消费不重复呢?

  1. 内存映射文件 通过内存映射关系,在内存中的操作也会同步到指定的磁盘上,确保数据在意外事故中数据不丢失。
  2. 数据分区备份 kafka是由多个broker组成的,每个分区有若干备份,数据的写入和读取都是从leader中进行。
  3. 选举机制 从每个分区的备份进行选取(根据时间限制)进入ISR,同时将这些信息(时间延迟和消息条数)写入zookper(0.9之后保存在kafka中)。一旦分区的leader不再进行工作,根据各follower的信息进行选举,选举一个leader出来。
  4. ACK机制消息可以消费一次或者若干次。怎么保证消息只被消费一次?kafka设置了3中安全模式,当设置为0时,生产者发送消息之后就不会在再理会kafka,这种数据只能确保最多消费一次。当设置为1时,生产者发送完消息之后需要等待leader给确认反馈,如果leader接收失败,生产者需要再发送一次。当设置为-1时,生产者需要将等待ISR中的副本都进行了落盘的ACK,失败则重发。这种方式可以确保消息不丢失,但是会引入消息重复的问题。为了解决这个问题,kafka引入了幂等的概念,默认设置生产者消息模式为-1,当kafka中消息已经存在时,不再将消息进行落盘,确保消息只消费一次。

你可能感兴趣的:(大数据)