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. django之CORS跨域请求

    对于想要利用django框架实现前后端分离,首要的问题是解决跨域请求的问题,什么是跨域请求?简单来说就是当前发起的请求的域与该请求指向的资源所在的域不一致.当协议+域名+端口号均相同,那么就是同一个域 ...

  2. stm32实现DMX512协议发送与接收(非标)

    最近把玩了一下485,期间也接触了dmx512通信协议,该协议主要用于各种舞台灯光的控制当中,进而实现各种光效以及色彩变化.根据标准的512协议,其物理连接与传统上的RS485是完全一致的,并没有什么 ...

  3. wannafly挑战赛4树的距离 离线处理,dfs序

    时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 wyf非常喜欢树.一棵有根数树上有N个节点, ...

  4. CF948B Primal Sport

    题目链接:http://codeforces.com/contest/948/problem/B 知识点: 素数 解题思路: \(f(x)\) 表示 \(x\) 的最大素因子.不难想到:\(X_1 \ ...

  5. 【Nginx】centos7 yum命令安装nginx

    安装nginx 首先我们需要使用root用户进行操作 第一步:添加nginx存储库 sudo yum install epel-release 出现如下图说明成功: 第二步:安装nginx sudo ...

  6. 抛开 Spring ,你知道 MyBatis 加载 Mapper 的底层原理吗?

    原文链接:抛开 Spring ,你知道 MyBatis 加载 Mapper 的底层原理吗? 大家都知道,利用 Spring 整合 MyBatis,我们可以直接利用 @MapperScan 注解或者 @ ...

  7. [256个管理学理论]003.鳄鱼法则(Alligator Principle)

    鳄鱼法则(Alligator Principle) 来自于大洋彼岸的让你看不懂的解释: 这是经济学交易技术法则之一,也叫“鳄鱼效应”,它的意思是:假定一只鳄鱼咬住你的脚,如果你用手去试图挣脱你的脚,鳄 ...

  8. 获取Class实例的方式与类加载器

    1. java.lang.Class:   是反射的源头 2.如何获取Class的实例(3种) 3.关于类的加载器 TestReflection2 package com.aff.reflection ...

  9. [leetcode] 并查集(Ⅲ)

    婴儿名字 题目[Interview-1707]:典型并查集题目. 解题思路 首先对 names 这种傻 X 字符串结构进行预处理,转换为一个 map,key 是名字,val 是名字出现的次数. 然后是 ...

  10. 公司如何通过电脑监控来规范员工行为-iis7服务器管理功能教程

    现在员工办公基本都用电脑,而电脑不仅仅可以用来处理工作,还可以上网.娱乐等.往往很多员工的自制能力比较差,在工作时间和人聊天,浏览购物网站,看新闻,炒股等休闲娱乐上花费大量的时间,导致工作效率降低,影 ...