kafka的topic和分区策略——log entry和消息id索引文件
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数量。
- # The default number of log partitions per topic. More partitions allow greater
- # parallelism for consumption, but this will also result in more files across
- # the brokers.
- 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索引文件相关推荐
- Kafka生产者和消费者分区策略部分源码解析
之前我在看其他的博客时,发现对于kafka consumer的RoundRobin的缺点分析中,有两种观点,一种认为缺点在于如果消费者组中消费者消费的主题不同,或者消费者线程数不同,那么会造成消费者消 ...
- JAVA多线程向kafka的topic各分区中写入本地数据
kafka准备工作: 开启zookeeper服务和kafka服务 zkServer.sh startkafka-server-start.sh /opt/soft/kafka211/config/se ...
- kafka源码分析-consumer的分区策略
kafka源码分析-consumer的分区策略 1.AbstractPartitionAssignor 2.RangeAssignor 3.RoundRobinAssignor 4.StickyAss ...
- kafka生产者消息分区策略
前言 众所周知,kafka的topic具有分区的概念,生产者写入数据到kafka之后,涉及到数据到底写到哪个分区? 常用的分区写入策略 生产者写入消息到topic,Kafka将依据不同的策略将数据分配 ...
- kafka的分区策略
kafka的分区策略 kafka produce端的分区策略 第一种分区策略:给定了分区号,直接将数据发送到指定的分区里面去第二种分区策略:没有给定分区号,给定数据的key值,通过key取上hashC ...
- kafka redis vs 发布订阅_发布订阅的消息系统 Kafka的深度解析
背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐 ...
- 从17 个方面对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 等分布式消息队列
Johny Sinn 读完需要 21 分钟 速读仅需 7 分钟 知乎答主,一位见多识广.智慧超凡的 IT 人 & AIoT 领跑者.原文首发于 zhihu.com/question/43557 ...
- kafka 原理及分区策略
一.简介 Apache Kafka 是一个分布式的流处理平台(分布式的基于发布/订阅模式的消息队列[Message Queue]). 流处理平台有以下3个特性: 可以让你发布和订阅流式的记录.这一方面 ...
- kafka的分区策略(partition assignment strategy)
概述 kafka的分区策略指的是producer端的 各个partition中的数据如何安排给consumer消费. Range(按范围) ange策略是对每个主题而言的,首先对同一个主题里面的分区按 ...
最新文章
- Java基础20:Java8新特性终极指南
- QT的QStorageInfo类的使用
- 反编译中内部类调用外部类成员问题
- python3 面向对象详解_Python3面向对象
- (六)jQuery选择器
- DelayQueue源码
- arm汇编指令集_1. 从0开始学ARM安装Keil MDK uVision集成开发环境
- mysql模糊查询LIKE、REGEXP(正则)的详解(在可视化工具navicat下)
- 4019-平衡二叉树的高度的计算(C++,附思路)
- 51CTO首页改版上线 欢迎大家拍砖!
- strcpy漏洞分析
- Tensorflow:tensor数据类型转换、计算和变换
- 晨风机器人成语接龙_使用晨风QQ机器人在群内玩成语接龙的方法
- RGB YUV XYZ HSL CIE1976L*a*b* LCH的色彩空间图 色彩空间 转换公式
- 笔记:图解网络(小林coding)
- 【初级篇】网页引入live2d
- darda oracle tfa_OSW - feiyun8616 - 博客园
- 人人都在谈的 “数据驱动” 到底是什么?你确认自己做的是数据驱动吗?
- 快速查询中通速递物流,查看未签收单号的最后站点
- 盛世昊通愿天下无拐,期待所有失孤家庭早日团圆