1.kafka架构

kafka处理消息大概流程

  • 生产者发送消息给kafka服务器
  • 消费者从kafka服务器(broker)读取消息
  • kafka服务器依靠zookeeper集群进行服务协调管理

2.kafka基本术语

  • message (消息)

    生产消费的基本单位。

  • topic(主题)

    代表逻辑上的一类消息,类似于其它消息队列中间件中的消息队列名称。

  • partition (分区)

    topic的下一级,kafka为了提高吞吐量和可用性,会把一类消息分成多个区存储。topic、partition、message之间的关系如下图:

  • broker

    代表一个kafka服务器节点

  • offset (消息位移值)

    消息位移值一共有两种

    a.第一种是分区内的每条消息都有一个位移值,代表每条消息在文件中的位置,offset从0到消息数量-1,就好比数组的下标。

    b.第二种相对于kafka消费端而言的offset,代表了消费端当前的读取进度,比如消费端offset为3,代表消费者已经消费到了第四条消息。

  • replica (副本)

    kafka为了实现高可用,会对partition(分区)保存多个replica(副本),存在的唯一理由就是为了实现消息的高可靠存储,不让消息丢失。

    其中又分leader 副本和follower副本,follower同步leader副本,leader副本宕机时,从剩余follower副本中选出一个作为新的leader 副本,实现高可用(一个partition的多个副本一定不会在同一个broker上)。

  • ISR (in-sync replica,与leader replica保持同步的replica集合)

    kafka会为每一个partition动态维护一个replica集合,该集合中的replica存储的所有消息日志与leader replica保持同步状态,如果因为网络延迟等原因部分ISR中的replica消息同步进度落后leader replica太多,则会将该replica踢出ISR,等后续追上进度时kafka再将其自动加入ISR。

3.kafka消息存储格式

  • 上文提到topic是消息逻辑上的分类,类似于消息队列的队列名,为了解决消息的高可用和高可靠存储问题引入了partition,将一个partition生成多个副本分散在多台节点上实现高可用。topic是逻辑上的分类,partition是物理上的副本,如图,P1有多个副本分散在broker 1、broker 2、broker 3上,即使其中一台宕机,剩下的两个broker依然可以提供服务(broker 2 和 broker 3的P1_follower会不断从P1_leader进行消息同步,即使主节点宕机也能选举出一个节点为主节点继续服务,并保留截止到高水位的消息,高水位概念在下一篇关于kafka的高可靠存储会提到)。

  • broker的partition还可以继续细分为segement,每个partition在磁盘上对应着一个目录,目录名为topic名称+有序序号,例如名为test的topic下创建了三个partition,三个分区在/tmp/kafka-logs下的目录名分别为test-01、test-02、test-03。

  • 如果进入test-01目录,会发现如下文件列表:

00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log

以上是segement文件列表,segement文件由索引文件(.index)和日志文件(.log)组成,大家会发现文件名是一个整数编号,20个整数数值组成,不足位数补零。第一个segement文件名从0开始,当log文件消息数量达到阈值,就会新建另一个segement文件,这个segement文件的名称是上一个segement log文件最后一条消息的offset位移值。

kafka为什么要这样设计segement文件?

假如我们把所有消息都存在一个文件里,查找一条offset为00000012564868789012的消息需要从头遍历岂不是等到黄花菜都凉了,可以看到这里用到二分查找进行优化,将需要查找的offset和segement的文件名进行二分查找就可以快速定位到我要找的消息在哪个文件里面,然后再从,index文件中获取到消息是在.log文件的哪个位置开始,哪个位置截止,将查找的时间复杂度从O(n)变为O(logn)。

partition目录下segement文件的设计,和mysql的b+树查找数据页、数据页内根据页目录进一步二分查找原理很相似,segement文件名相当于mysql的目录项页(枝干节点),而index文件相当于页内的页目录。

kafka架构、基本术语、消息存储结构的更多相关文章

  1. kafka架构,消息存储和生成消费模型,Kafka与其他队列对比,零拷贝,Kafka基本介绍

    kafka架构,消息存储和生成消费模型,Kafka与其他队列对比,零拷贝,Kafka基本介绍 一.初识kafka 1.1SparkStreaming+Kafka好处: 1.2Kafka的架构: 二.k ...

  2. 分布式发布订阅消息系统 Kafka 架构设计[转]

    分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...

  3. 分布式公布订阅消息系统 Kafka 架构设计

    我们为什么要搭建该系统 Kafka是一个消息系统,原本开发自LinkedIn,用作LinkedIn的活动流(activity stream)和运营数据处理管道(pipeline)的基础. 如今它已为多 ...

  4. kafka架构浅显理解

    Kafka的概念: 1. AMQP协议 Advanced Message Queuing Protocol (高级消息队列协议) The Advanced Message Queuing Protoc ...

  5. .Net机试题——编写一个BS架构的多层表结构的信息管理模块

      要求: 编写一个BS架构的多层表结构的信息管理模块,用户体验需要注意.包含错误处理,需要最终能完整的跑起来.页面可以不美化,但是整洁还是必须的.在不能完成详细功能需求的情况下优先保证基本功能. 1 ...

  6. kafka 中的术语

    出处:https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html table th:first-of-type { width: 7 ...

  7. 转 kafka架构简介

    kafka架构 转 http://www.cnblogs.com/chushiyaoyue/p/5612298.html 相关文章: https://www.jianshu.com/p/6233d53 ...

  8. Kafka架构与原理

    前言 kafka是一个分布式消息队列.具有高性能.持久化.多副本备份.横向扩展能力.生产者往队列里写消息,消费者从队列里取消息进行业务逻辑.一般在架构设计中起到解耦.削峰.异步处理的作用. kafka ...

  9. Kafka架构和原理深度剖析

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

随机推荐

  1. 愉快地使用Open Live Writer写博客

    想要坚持写博客的习惯,却又无法忍受网页编辑器的各种不方便?open live writer是一个不错的选择.对我来说最有诱惑的就是能够快速的黏贴图片.代码.使用过程遇到不少坑,最坑的就是不能使用163 ...

  2. php IE中文乱码

    echo mb_convert_encoding("你是我的朋友", "big5", "GB2312"); 详细出处参考:http://ww ...

  3. 基于Hdl Coder实现卡尔曼滤波算法

    总所周知,FPGA极其不擅长复杂算法的运算,但是如果项目中又涉及一些高级算法的实现,在没有可封装IP核调用的形式下,我们应该如何进行程序开发呢?今夕已经是2020年,我们一味依赖于用verilog写代 ...

  4. poj3683 2-SAT 同上一道

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10151   Accep ...

  5. python 格式化输出(% VS format)

    提到Python中的格式化输出方法,一般来说有以下两种方式: 1)% 格式说明由%和格式字符组成,如%f,%s,%d,它的作用是将数据按照指定的格式输出.格式说明是由“%”字符开始的. #1.输出字符 ...

  6. Ubuntu 安装 rabbitmq

    第一步:安装 erlang 官网:https://www.erlang-solutions.com/resources/download.html 然后在终端输入:erl 显示如下,说明安装成功! E ...

  7. URL特殊字符转义

    在URL中,某些特殊字符会被转义成其它项,为了使这些特殊字符能正确表达,需用%加该字符的ASCII码在URL中显示.

  8. channelartlist标签的使用

    用来获取当前频道的下级栏目的内容列表标签 . type=“top”表示顶级栏目 ,typeid='top' 限制上级栏目ID:如果只要调用其中几个频道的内容可以用{dede:channelartlis ...

  9. JAVA定义变量和基础的数据类型和关键字

      标识符语法 1)java中定义标识符格式以字母,数字,下划线,$符合组成,不能以数字开头,且不能为  java中的关键字.         2)标识符意义要明确,不要乱起         3)标识 ...

  10. multipart_formdata

    import requests def sendImg(img_path, img_name, img_type='image/jpeg'): """ :param im ...