接下来的这些博客,主要内容来自《Learning Apache Kafka Second Edition》这本书,书不厚,200多页。接下来摘录出本书中的重要知识点,偶尔参考一些网络资料,并伴随着一些动手实践,算是一篇读书笔记吧。

  本文是第一篇,主要从整体上梳理Kafka的基本架构和原理。  

一、什么是Kafka

  Kafka是一个开源的,分布式的消息发布和订阅系统,它由Producer, Consumer和Broker组成。使用Kafka可以实时传递和处理一些Message。总的来说,Kafka有以下几个特点:

1. 消息存储

  为了保证数据的完整性,Kafka将数据保存在硬盘上,并且对数据还有备份。Kafka可以在O(1)的时间复杂度内访问高达TB级别的数据。

2. 高吞吐率

  Kafka本身就是为大数据的场景设计的,在一些简单的硬件上也可以实现高达几百MB的读写。

3. 分布式

  Kafka可以分布的安装在多个节点上,Message以分区的形式保存在集群中。

4. 支持多client

  Kafka系统可以支持多种形式的Client,包括Java,.NET, PHP, Ruby以及Python。

5. 实时

  Producer产生的消息可以很快的被Consumer进行消费。

二、Kafka概览

  Kafka实质上是一个生产者-消费者系统。在Kafka中,Producer产生Message并发送到Kafka Topic中。Consumer则会从Kafka Topic中订阅并消费Message。Kafka集群中的各个节点被称为Broker,Topic都是保存在Broker上的。在Kafka系统中还会用到ZooKeeper,主要是Broker使用ZooKeeper记录一些状态信息,Consumer则通过ZooKeeper记录Message消费的Offset。整体架构如下图所示,其中涉及到的概念和组件,会在后续章节中进一步分析。



  每个Partition对应一个物理log文件,这个log文件由一系列大小相等的segment组成。每一个Partition是一个有序的,可扩展的Message队列。当有message发送到partition中时,broker会将该message追加到最新的segment末尾。当接收到若干条message,或者经过若干时间后,这个segment就会flush到磁盘上。接下来Consumer才能去磁盘上消费其中的message。所有的Pattition都有一个标识message位置的序列号offset.

  并且每个partition也可以配置若干replication,以保证其容错能力。根据replication的个数,每个partition有一个leader状态的replication,以及0个或多个follower状态的partition。有关message的读写操作,都由leader状态的replication来完成。follower会从leader同步数据,这些活跃的follower就被称为in-sync replicas(ISR),ZooKeeper中会记录每个partition的最新的ISR,当leader出现故障时,ZooKeeper会从ISR中选举出新的leader。

  一个Topic中的message只能被同一Consumer Group中唯一一个Consumer进行消费,能同时消费某一Topic的Consumer只能分属于不同的Consumer Group。Consumer从一个Partition中顺序的消费message,并且会维持一个offset标记message的消费位置。Message虽然存储在Broker中,但是Broker并不会存储Message的消费状态,每个Consumer自行管理自己的Message消费信息。

三、Kafka消息机制

  这里主要涉及三个概念,Topic,Partition,Replication。

  在Kafka中,Message都有一个属于的Topic,Message只能发送到指定的Topic中。Topic是一个逻辑上的概念,每个Topic有一个或多个Parititon,这些Partition分布在Broker上,并且是真正的Message存储组件,Topic的每一个Partition对应一个磁盘上的Log文件。



  Message发送到哪个Partition是由Producer来决定的。上图中所示的Topic有4个Partition,Producer产生一条Message时,便决定了该Message应该发送到Partition-1。同时,为了保证Kafka集群的容错能力,对应该Partition有3个Replication,其中一个为Lead状态,如Broker-1,有两个Follower状态,如上图中的Broker-3和Broker-4所示。由于Kafka有了Replication机制,所以当前Partition-1,可以允许失败两次,当有Replication失败时,会由ZooKeeper很快选举出新的Lead状态的Replication。Consumer只从Lead状态的那个Replication读取Message。

  在这里,我们并不能说Kafka集群中的某个Broker是Leader,某个Broker是Follower,因为Leader和Follower都是针对Replication来说的。对于Partition-1,可能当前的Leader Replication位于Broker-1上,但是对于Partition-2,Leader的Replication就可能位于Broker-2上了。

  Kafka中的读写操作,都是由Leader来完成的。其他in-sync replicas(ISR)与Leader进行数据备份。备份方式有以下两种:

1、同步Replication

  在这种模式下,Producer计算出对应的Partition后便从ZooKeeper获取Leader状态的Replication,并把Message发送到该Replication。当这条Message写入到Log文件后,所有的Follower开始pull该Message到自己的Log文件中,这个过程完成后Follower会向Leader发送一条确认消息,表示当前Message已经正确备份。当备份过程完成,并且Leader获取到所有期望的确认消息后,Leader再向Producer发送一条确认消息,表示当前Message已经正确的写入了。

2、异步Replication

  异步模式与同伴模式唯一的不同在于,当Leader将Message写入自己的Log文件后,就马上向Producer发送一条确认消息,而不会等待接收到所有Follower发送的确认消息才进行该操作。

  当任何一个Follower失败时,Leader会将该该Follower从ISR中移除。当失败的Follower恢复正常后,该Follower首先会把失败时的offset之后的数据都清除掉,任何从此次开始对Leader进行数据同步,直到追上最新的message,这个Follower才会从新加入到ISR中。

  当Leader失败时,会由ZooKeeper从所有的Follower中选举出某个Follower为新的Leader。

  

  Kafka中最重要的两个组件,Producer和Consumer会在接下来的博客中进行分析。由于Producer和Consumer都提供了API接口,所以,接下来的博客也会根据这些接口实现一些简单的代码。

Kafka系列之-Kafka入门的更多相关文章

  1. Kafka系列之-Kafka Protocol实例分析

    本文基于A Guide To The Kafka Protocol文档,以及Spark Streaming中实现的org.apache.spark.streaming.kafka.KafkaClust ...

  2. Kafka系列之-Kafka监控工具KafkaOffsetMonitor配置及使用

    KafkaOffsetMonitor是一个可以用于监控Kafka的Topic及Consumer消费状况的工具,其配置和使用特别的方便.源项目Github地址为:https://github.com/q ...

  3. Kafka系列二 kafka相关问题理解

    1.kafka是什么 类JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者主动拉取数据. kafka是一个生产-消费模型. producer:生产 ...

  4. Apache Kafka系列(七)Kafka Repartition操作

    Kafka提供了重新分区的命令,但是只能增加,不能减少 我的kafka安装在/usr/local/kafka_2.12-1.0.2目录下面, [root@i-zk1 kafka_2.-]# bin/k ...

  5. Apache Kafka系列(五) Kafka Connect及FileConnector示例

    Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程 ...

  6. Kafka系列文章

    Kafka系列文章 Kafka设计解析(一)- Kafka背景及架构介绍 Kafka设计解析(二)- Kafka High Availability (上) Kafka设计解析(三)- Kafka H ...

  7. Kafka 系列(五)—— 深入理解 Kafka 副本机制

    一.Kafka集群 Kafka 使用 Zookeeper 来维护集群成员 (brokers) 的信息.每个 broker 都有一个唯一标识 broker.id,用于标识自己在集群中的身份,可以在配置文 ...

  8. 分布式系列九: kafka

    分布式系列九: kafka概念 官网上的介绍是kafka是apache的一种分布式流处理平台. 最初由Linkedin开发, 使用Scala编写. 具有高性能,高吞吐量的特定. 包含三个关键能力: 发 ...

  9. apache kafka系列之Producer处理逻辑

     最近研究producer的负载均衡策略,,,,我在librdkafka里边用代码实现了partition 值的轮询方法,,,但是在现场验证时,他的负载均衡不起作用,,,所以来找找原因: 下文是一篇描 ...

随机推荐

  1. 用js来实现那些数据结构09(集合01-集合的实现)

    说到集合,第一个想到的就是中学学到的那个数学概念:集合.在我们开始集合相关的js实现前,我们有必要来了解一下什么是集合以及集合的数学概念. 好吧,我们一起来复习一下早就被我们遗忘的集合. 集合是由一组 ...

  2. TOMCAT下的JNDI的配置

    一.第一种配置局部JNDI 1.在tomcat的conf目录下的server.xml的<host>标签内,添加: <Context path="/TestMvcMode&q ...

  3. ●BZOJ 3879 SvT

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3879 题解: 后缀数组,单调栈,RMQ 其实类似 BZOJ 3238 [Ahoi2013]差 ...

  4. 【Codeforces Round 431 (Div. 2) A B C D E五个题】

    先给出比赛地址啦,感觉这场比赛思维考察非常灵活而美妙. A. Odds and Ends ·述大意:      输入n(n<=100)表示长度为n的序列,接下来输入这个序列.询问是否可以将序列划 ...

  5. 8.QT-对话框(模态与非模态)

    对话框介绍 对话框是于用户进行简易交互的顶层窗口 QDialog是Qt中所有对话框窗口的父类,是一种容器类型的组件 QDialog继承于QWidget类,如下图所示: QWidget和QDialog有 ...

  6. 谷歌发布 TensorFlow Serving

    TensorFlow服务是一个灵活的,高性能的机器学习模型的服务系统,专为生产环境而设计. TensorFlow服务可以轻松部署新的算法和实验,同时保持相同的服务器体系结构和API. TensorFl ...

  7. GNS3 1.4.0b3 MSTP多生成树配置实验

    一.实验目标 掌握MSTP多生成树配置,VLAN配置,trunk配置,etherchannel配置 二.实验平台 系统:WIN7以上windows,X64版本.CPU支持虚拟化,并在BIOS中开启虚拟 ...

  8. 重新设置Eclipse的workspace路径

    有3中方法可以更改workspace的路径设置: 1. 启动Eclipse/MyEclipse后, 打开"Window -> Preferences -> General -&g ...

  9. 算法二叉搜索树之AVL树

    最近学习了二叉搜索树中的AVL树,特在此写一篇博客小结. 1.引言 对于二叉搜索树而言,其插入查找删除等性能直接和树的高度有关,因此我们发明了平衡二叉搜索树.在计算机科学中,AVL树是最先发明的自平衡 ...

  10. 基于PHP的快递查询免费开放平台案例-快宝开放平台

    快递查询是快递业务中极其重要的业务,免费的快递查询开放平台:快宝开放平台. 快宝开放平台:http://open.kuaidihelp.com/home,已经对接100多家快递公司,实现快递物流信息实 ...