Topic在逻辑上可以被认为是一个在的queue,每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里。 为了使得Kafka的吞吐率可以水平扩展,物理上把topic分成一个或多个partition,每个partition在物理上对应一个文件夹,该文件 夹下存储这个partition的所有消息和索引文件。

每个日志文件都是“log entries”序列,每一个log entry包含一个4字节整型数(值为N),其后跟N个字节的消息体。每条消息都有一个当前partition下唯一的64字节的offset,它指明了这条消息的起始位置。磁盘上存储的消费格式如下:
message length : 4 bytes (value: 1+4+n)
“magic” value : 1 byte
crc : 4 bytes
payload : n bytes
这个“log entries”并非由一个文件构成,而是分成多个segment,每个segment名为该segment第一条消息的offset和“.kafka”组成。另外会有一个索引文件,它标明了每个segment下包含的log entry的offset范围,如下图所示。

因为每条消息都被append到该partition中,是顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。

每一条消息被发送到broker时,会根据paritition规则选择被存储到哪一个partition。如果partition规则设置的合理,所有 消息可以均匀分布到不同的partition里,这样就实现了水平扩展。(如果一个topic对应一个文件,那这个文件所在的机器I/O将会成为这个 topic的性能瓶颈,而partition解决了这个问题)。在创建topic时可以在$KAFKA_HOME/config/server.properties中指定这个partition的数量(如下所示),当然也可以在topic创建之后去修改parition数量。

  1. # The default number of log partitions per topic. More partitions allow greater
  2. # parallelism for consumption, but this will also result in more files across
  3. # the brokers.
  4. num.partitions=3

在发送一条消息时,可以指定这条消息的key,producer根据这个key和partition机制来判断将这条消息发送到哪个parition。

对于传统的message queue而言,一般会删除已经被消费的消息,而Kafka集群会保留所有的消息,无论其被消费与否。当然,因为磁盘限制,不可能永久保留所有数据(实际 上也没必要),因此Kafka提供两种策略去删除旧数据。一是基于时间,二是基于partition文件大小。例如可以通过配置$KAFKA_HOME/config/server.properties,让Kafka删除一周前的数据,也可通过配置让Kafka在partition文件超过1GB时删除旧数据.

摘自:http://lxw1234.com/archives/2015/09/504.htm

本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6892788.html,如需转载请自行联系原作者

kafka的topic和分区策略——log entry和消息id索引文件相关推荐

  1. Kafka生产者和消费者分区策略部分源码解析

    之前我在看其他的博客时,发现对于kafka consumer的RoundRobin的缺点分析中,有两种观点,一种认为缺点在于如果消费者组中消费者消费的主题不同,或者消费者线程数不同,那么会造成消费者消 ...

  2. JAVA多线程向kafka的topic各分区中写入本地数据

    kafka准备工作: 开启zookeeper服务和kafka服务 zkServer.sh startkafka-server-start.sh /opt/soft/kafka211/config/se ...

  3. kafka源码分析-consumer的分区策略

    kafka源码分析-consumer的分区策略 1.AbstractPartitionAssignor 2.RangeAssignor 3.RoundRobinAssignor 4.StickyAss ...

  4. kafka生产者消息分区策略

    前言 众所周知,kafka的topic具有分区的概念,生产者写入数据到kafka之后,涉及到数据到底写到哪个分区? 常用的分区写入策略 生产者写入消息到topic,Kafka将依据不同的策略将数据分配 ...

  5. kafka的分区策略

    kafka的分区策略 kafka produce端的分区策略 第一种分区策略:给定了分区号,直接将数据发送到指定的分区里面去第二种分区策略:没有给定分区号,给定数据的key值,通过key取上hashC ...

  6. kafka redis vs 发布订阅_发布订阅的消息系统 Kafka的深度解析

    背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐 ...

  7. 从17 个方面对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 等分布式消息队列

    Johny Sinn 读完需要 21 分钟 速读仅需 7 分钟 知乎答主,一位见多识广.智慧超凡的 IT 人 & AIoT 领跑者.原文首发于 zhihu.com/question/43557 ...

  8. kafka 原理及分区策略

    一.简介 Apache Kafka 是一个分布式的流处理平台(分布式的基于发布/订阅模式的消息队列[Message Queue]). 流处理平台有以下3个特性: 可以让你发布和订阅流式的记录.这一方面 ...

  9. kafka的分区策略(partition assignment strategy)

    概述 kafka的分区策略指的是producer端的 各个partition中的数据如何安排给consumer消费. Range(按范围) ange策略是对每个主题而言的,首先对同一个主题里面的分区按 ...

最新文章

  1. Java基础20:Java8新特性终极指南
  2. QT的QStorageInfo类的使用
  3. 反编译中内部类调用外部类成员问题
  4. python3 面向对象详解_Python3面向对象
  5. (六)jQuery选择器
  6. DelayQueue源码
  7. arm汇编指令集_1. 从0开始学ARM安装Keil MDK uVision集成开发环境
  8. mysql模糊查询LIKE、REGEXP(正则)的详解(在可视化工具navicat下)
  9. 4019-平衡二叉树的高度的计算(C++,附思路)
  10. 51CTO首页改版上线 欢迎大家拍砖!
  11. strcpy漏洞分析
  12. Tensorflow:tensor数据类型转换、计算和变换
  13. 晨风机器人成语接龙_使用晨风QQ机器人在群内玩成语接龙的方法
  14. RGB YUV XYZ HSL CIE1976L*a*b* LCH的色彩空间图 色彩空间 转换公式
  15. 笔记:图解网络(小林coding)
  16. 【初级篇】网页引入live2d
  17. darda oracle tfa_OSW - feiyun8616 - 博客园
  18. 人人都在谈的 “数据驱动” 到底是什么?你确认自己做的是数据驱动吗?
  19. 快速查询中通速递物流,查看未签收单号的最后站点
  20. 盛世昊通愿天下无拐,期待所有失孤家庭早日团圆

热门文章

  1. 华为鲲鹏高校行长沙启航,助力基础研究成果转化
  2. 简单使用SpringCloud的fegin和熔断hystrix
  3. 一不小心把win10的秘钥卸载了解决方法
  4. 第0周---python网络爬虫前奏
  5. springMVC--(讲解3)数据处理
  6. Linux常用命令汇总-cut
  7. 图像增强之拉普拉斯锐化---高斯一阶导二阶导数
  8. CBWFQ技术简介及应用配置事例
  9. 2009全国公共英语五级(PETS-5)考试大纲概述
  10. 《构建可扩展的Web站点》书评