深入浅出理解kafka原理系列之:主题、分区和副本

一、分区的概念

通过partition将一个topic中的消息分区来存储。

  • 分区存储,可以解决统一存储文件过大的问题
  • 提供了读写的吞吐量:读和写可以同时在多个分区中进行
  • 可以分布式存储
  • 可以并行写

二、创建多分区和多副本的主题

kafka-topics.sh --create --zookeeper bigdata1:2181 --replication-factor 2 --partitions 3 --topic test
Created topic test.

三、kafka中消息日志文件中保存的内容

  • 00000.log:这个文件保存的就是消息
  • _consumer_offsets-49:kafka内部创建了__consumer_offsets主题包含了50个分区。因为__consumer_offsets可能会接收高并发的请求,kafka默认给其分配50个分区(可以通过offsets.topic.num.partitions设置),可以通过加机器的方式扩大并发
  • 定期将自己消费分区的offset提交给kafka内部topic:__consumer_offsets,提交过去的时候,key是consumerGroupId+topic+分区号,value是当前offset的值,kafka会定期清理topic里的消息,最后就保留最新的那条数据。
  • 通过如下公式可以选出consumer消费的offset要提交到__consumer_offset的哪个分区
  • 公式:hash(consumerGroupId) % __consumer_offsets主题的分区数

四、副本的概念

副本是对分区的备份。在集群中,不同的副本会被部署在不同的broker上。

./kafka-topics.sh --describe --topic first --zookeeper bigdata1:2181
  • leader:kafka的读和写的操作,都发生在leader上。leader负责把数据同步给follower。当leader挂了,经过主从选举,从多个follower中选举产生一个新的leader。
  • follower:接收leader的同步的数据
  • isr:可以同步和已同步的节点会被存入到isr集合中。isr中的节点性能较差,会被踢出isr集合。

集群中有多个broker,创建主题时可以指明主题有多个分区(把消息拆分到不同的分区中存储),可以为分区创建多个副本,不同的副本放在不同的broker里。


版权声明:本文为zhengzaifeidelushang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。