基本概念的总结

在基本的Kafka架构中,producer将消息发布到Kafka话题中,一个Kafka话题通常指消息的类别或者名称,Kafka话题被集群中一个充当Kafka server角色的

broker创建。Kafka broker用来存储消息,consumer可以订阅一个或者多个话题来获取话题中的消息。其中Kafka brokers用Zookeeper来获取消息状态,

而Kafka consumers则利用Zookeeper来跟踪消息的offset。具体如下图所示:

上图是一个只有一个Kafka broker的架构,其中包含一个topic,该topic包含4个partition,上图包含了Kafka中最重要的5个组件:Zookeeper, Broker, Topic, Producer, and Consumer。

在Kafka话题中,每一个partition都被映射到一个逻辑日志文件中,日志文件呈现为一组大小相等的段文件。每一个partition是一个有序的,不可变的消息序列;每一次当有消息被发布到这个partition,负责该partition的broker将新来的消息追加到该partition最后一个段文件中。在存储的消息的条数达到配置的消息条数或者当过了一段时间后,这些段文件将刷写到磁盘中。一旦段文件被刷写到磁盘,这些消息就可以被Kafka consumer消费。

每个消息在partition中都有一个称为offset的标记,该标记是有序,唯一的序号。每个partition可以有选择的冗余多份,以保证可用性。在多个partition存在的情况下,有一个称为leader的partition,其他partition都称为follower。其中leader负责该partition所有的读写请求,而follower则异步的更新本地来和leader保持一致,所以在消息的一致性上,follower是要延迟于leader的。

Kafka动态维护一组同步副本(ISR),该副本紧跟leader与其内容保持一致,并将最新的ISR同步给Zookeeper。如果leader挂了,一个follower(在ISR同步副本中)将自动成为新的leader。在Kafka集群中,每个server都扮演双重角色,它作为一些partition的leader的同时,也作为其他partition的follower,这确保了Kafka集群内的负载平衡。

在Kafka中有一个consumer group的概念,每个consumer只是consumer group中的一个进程。一个话题中的一条消息只能被consumer group中的一个consumer进程消费,也就是说,如果要求该话题中的某消息被多个consumer消费,则这些consumer必须在不同的consumer group中。

consumer总是从一个特定的partition顺序地消费消息,并应答消费了的消息的offset,已经应答的offset意味着consumer已经消费了这些信息。consumer发出了一个包含消息offset的异步请求给broker,并得到字节的缓冲区。

在Kafka的设计中,broker是无状态的,也就是说,在broker中不存储哪些消息被哪些consumer消费了,这些消费记录被设计存储在consumer中,也就是说,broker根本不知道哪些消息被消费了。在Kafka中,给消息定义了一个SLA (service level agreement),SLA表示消息的保留时间,一旦消息保留时间超过SLA,则会被删除,这种设计有意无意的提示了consumer去消费旧消息,不然就会被删除。

Kafka设计的一些重点总结:

1. Kafka最重要的基石是消息在文件系统上的缓冲和存储。在Kafka中,消息是立即写到操作系统内核页的,数据的缓冲和刷写到磁盘都是可配置的。

2. Kafka提供消息的长时间存储,即使消息已经被消费过,它支持consumer再消费。

3. Kafka利用消息集合来group消息,从而减小网络带宽的消耗。消息被消费的元数据不是存储在server上,而是在consumer上。这可以避免“消息的丢失”和“同一消息的多次传输”。

4. consumers将状态信息储存在Zookeeper上,Kafka也允许将这些信息存储到其他存储系统上。

5. 在Kafka中,producer和consumer以一种推-拉的模式工作,其中producer将信息推到Kafka broker上,然后consumer则从broker上拉取信息。

6. Kafka的设计中没有master的概念,所有的broker都是对等的。这种设计使得broker的添加和删除变得简便,因为broker的元数据信息被Zookeeper维护着并被所有的consumer共享。producer在发送数据给broker时也可以在同步和异步的模式中作选择。

消息压缩

在Kafka中,支持对消息分组压缩,以获得更高效的信息传输,这种压缩一次压缩多个消息,而不是一个消息。一组消息压缩后然后在发送给broker,这能有效减少网络带宽的消耗。

在Kafka0.8中,每个分区的leader broker在消息追加到日志上前,需要给每一个消息赋予一个独一无二的逻辑offset,所以如果消息是压缩的,broker需要解压缩,然后才能给每条消息赋予offset,对于压缩的数据,在赋予完offset后,broker还需要再压缩这些数据然后再刷写到磁盘上。所以,数据的压缩对broker的CPU的负载是一大挑战。

消息最初的压缩是发生在producer端的,可支持的压缩协议包括GZIP和Snappy,具体配置如下:

Property name

Description

Default value

compression.codec

This parameter specifies the compression codec for all data generated by this producer. Valid values are none, gzip, and snappy.

none

compressed.topics

This parameter allows you to set whether compression should be turned on for particular topics. If the compression codec is anything other than none, enable compression only compressed.topics for specified topics, if any. If the list of compressed topics is empty, then enable the null specified compression codec for all topics. If the compression codec is none, compression is disabled for all topics.

null

消息partition

对消息如何partition由producer决定,broker按照消息来的先后顺序存储,在Kafka broker可以为每一个topic配置partition数目。

partition冗余

冗余是Kafka0.8的新特性,冗余可以提高Kafka的可用性,其中producer和consumer都是可感知冗余的。下图形象展示了冗余的特性:

在冗余机制下,每个拥有n个冗余的partition可以容忍n-1个冗余的不可用,在这n个冗余中,其中有一个担任leader的冗余,其余的冗余称为follower,这些可用的follower构成一个ISR集合,Zookeeper维护着每个partition的leader的信息和ISR的信息。

partition冗余方式

1. 同步冗余:消息在producer端分成了不同的partition,对于每一个partition,producer首先同Zookeeper确定该partition的lead broker,然后将消息发布到该broker上,当消息都发布完了,消息将刷写到lead broker的log上,然后关于该partition的所有follower都在该lead broker拉取该partition,通过单一通道来保证消息的顺序。每个follower拉取完毕partition并存储到本地log后,会返回一个应答给lead broker。当收到所有follower的应答后,lead broker则返回一个应答给producer。此时,该partition可以被consumer消费。

2. 异步冗余:异步冗余则不会等待所有的follower的应该就应答producer,这种机制如果lead broker挂掉的话则不能保证消息的正常消费。

对于某个ISR集合中的follower挂掉后,leader则将该follower从ISR集合中剔除,其他的follower继续同步信息;
如果是leader挂掉了,就算失败发生在最后的应答前,producer还是会再次发布该partition到新的leader上。

leader挂掉会经历如下几个过程:

1)从ISR集合中,所有follower中最早注册的replica称为新的leader,其他的依然为follower;

2)新leader的log end offset(LEO)成为该partition的最终提交消息;

3)新leader在配置时间过了后或者所有的replica都同步好了后,将新的ISR同步给Zookeeper,并启动读写服务。

Kafka学习刚入门,如有理解错误请给位指正!

【Kafka入门】Kafka基础结构和知识的更多相关文章

  1. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  2. 《OD大数据实战》Kafka入门实例

    官网: 参考文档: Kafka入门经典教程 Kafka工作原理详解 一.安装zookeeper 1. 下载zookeeper-3.4.5-cdh5.3.6.tar.gz 下载地址为: http://a ...

  3. kafka 入门笔记 #1

    kafka 入门笔记(#1) 单机测试 下载版本,解压 tar -xzf kafka_2.11-0.10.1.1.tgz cd kafka_2.11-0.10.1.1 启动服务 Kafka用到了Zoo ...

  4. Kafka入门介绍

    1. Kafka入门介绍 1.1 Apache Kafka是一个分布式的流平台.这到底意味着什么? 我们认为,一个流平台具有三个关键能力: ① 发布和订阅消息.在这方面,它类似一个消息队列或企业消息系 ...

  5. 超详细“零”基础kafka入门篇

    1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1)流媒体平台有三个关键功能: 发布和订阅记录流,类 ...

  6. Kafka入门 --安装和简单实用

    一.安装Zookeeper 参考: Zookeeper的下载.安装和启动 Zookeeper 集群搭建--单机伪分布式集群 二.下载Kafka 进入http://kafka.apache.org/do ...

  7. 项目17-超详细“零”基础kafka入门篇

    分类: Linux服务篇,Linux架构篇   1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1) ...

  8. 转 Kafka入门经典教程

    Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1.html 问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic. ...

  9. Kafka 入门和 Spring Boot 集成

    目录 Kafka 入门和 Spring Boot 集成 标签:博客 概述 应用场景 基本概念 基本结构 和Spring Boot 集成 集成概述 集成环境 kafka 环境搭建 Spring Boot ...

  10. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

随机推荐

  1. 团体程序设计天梯赛-练习集L1-004. 计算摄氏温度

    L1-004. 计算摄氏温度 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈建海 给定一个华氏温度F,本题要求编写程序,计算对应的 ...

  2. 快速排序(quicksort)算法实现

    快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序).然后以这个X在变换后数组的位 ...

  3. 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下-复制代码 代码如下:    #ifndef USE_H_     ...

  4. POJ1905Expanding Rods(二分)

    http://poj.org/problem?id=1905 题意 :在两堵实心墙中间有一根杆,长度为L,然后给它加热,温度是n,则两墙之间的杆会弯曲,长度会变为L'=(1+n*C)*L,求前后两个状 ...

  5. Servlet课程0425(六) 不经过验证直接跳转---session实现不同页面之间共享数据

    在地址栏直接输入http://localhost:8080/myWebSite/wel 会发现页面也能跳转,只不过用户名和密码都为空,这是不可以的,因为没有经过验证非法登录了 Welcome,hell ...

  6. Git教程之标签管理

    发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照.Git的 ...

  7. fedora

    http://blog.chinaunix.net/uid-14735472-id-3486501.html 使用 http://blog.csdn.net/crystony/article/deta ...

  8. DSP6455 DSP/BIOS中断配置问题(是否需要ECM-事件组合以及实例)

    2013-06-20 21:08:48 中断的配置有两种常用的方式: 一是通过CSL提供的API进行配置,这种方法相对DSP/BIOS偏底层,也比较麻烦:这种方法要求对中断系统的工作方式很清楚. 二是 ...

  9. A simple json-rpc case for bitcoin blockchains

    #!/usr/bin/env python import json import jsonrpc import requests #url = "http://user:password@i ...

  10. WinForm实现简单的拖拽文件到出题的功能(C#)(3)

    string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString(); textBox1. ...