51CTO:也就这么回事,Kafka架构原理( 二 )


Kafka集群将Record流存储在称为Topic的类别中 , 每个记录由一个键、一个值和一个时间戳组成 。
51CTO:也就这么回事,Kafka架构原理
文章图片
Kafka是一个分布式流平台 , 这到底是什么意思?
发布和订阅记录流 , 类似于消息队列或企业消息传递系统 。 以容错的持久方式存储记录流 。 处理记录流 。Kafka中消息是以Topic进行分类的 , 生产者生产消息 , 消费者消费消息 , 面向的都是同一个Topic 。
Topic是逻辑上的概念 , 而Partition是物理上的概念 , 每个Partition对应于一个log文件 , 该log文件中存储的就是Producer生产的数据 。
Producer生产的数据会不断追加到该log文件末端 , 且每条数据都有自己的Offset 。
消费者组中的每个消费者 , 都会实时记录自己消费到了哪个Offset , 以便出错恢复时 , 从上次的位置继续消费 。
存储机制
51CTO:也就这么回事,Kafka架构原理
文章图片
由于生产者生产的消息会不断追加到log文件末尾 , 为防止log文件过大导致数据定位效率低下 , Kafka采取了分片和索引机制 。
它将每个Partition分为多个Segment , 每个Segment对应两个文件:“.index”索引文件和“.log”数据文件 。
这些文件位于同一文件下 , 该文件夹的命名规则为:topic名-分区号 。 例如 , first这个topic有三分分区 , 则其对应的文件夹为first-0 , first-1 , first-2 。
#ls/root/data/kafka/first-000000000000000009014.index00000000000000009014.log00000000000000009014.timeindex00000000000000009014.snapshotleader-epoch-checkpointindex和log文件以当前Segment的第一条消息的Offset命名 。 下图为index文件和log文件的结构示意图:
51CTO:也就这么回事,Kafka架构原理
文章图片
“.index”文件存储大量的索引信息 , “.log”文件存储大量的数据 , 索引文件中的元数据指向对应数据文件中Message的物理偏移量 。
生产者
分区策略
分区原因:
方便在集群中扩展 , 每个Partition可以通过调整以适应它所在的机器 , 而一个Topic又可以有多个Partition组成 , 因此可以以Partition为单位读写了 。 可以提高并发 , 因此可以以Partition为单位读写了 。分区原则:我们需要将Producer发送的数据封装成一个ProducerRecord对象 。
该对象需要指定一些参数:
topic:string类型 , NotNull 。 partition:int类型 , 可选 。 timestamp:long类型 , 可选 。 key:string类型 , 可选 。 value:string类型 , 可选 。 headers:array类型 , Nullable 。①指明Partition的情况下 , 直接将给定的Value作为Partition的值 。
②没有指明Partition但有Key的情况下 , 将Key的Hash值与分区数取余得到Partition值 。
③既没有Partition有没有Key的情况下 , 第一次调用时随机生成一个整数(后面每次调用都在这个整数上自增) , 将这个值与可用的分区数取余 , 得到Partition值 , 也就是常说的Round-Robin轮询算法 。
数据可靠性保证
为保证Producer发送的数据 , 能可靠地发送到指定的Topic , Topic的每个Partition收到Producer发送的数据后 , 都需要向Producer发送ACK(ACKnowledge确认收到) 。
如果Producer收到ACK , 就会进行下一轮的发送 , 否则重新发送数据 。
51CTO:也就这么回事,Kafka架构原理
文章图片
①副本数据同步策略
何时发送ACK?确保有Follower与Leader同步完成 , Leader再发送ACK , 这样才能保证Leader挂掉之后 , 能在Follower中选举出新的Leader而不丢数据 。
多少个Follower同步完成后发送ACK?全部Follower同步完成 , 再发送ACK 。