接下来的这些博客,主要内容来自《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. window10下安装linux虚拟机

    一.准备工具 虚拟机.镜像.putty 1.安装虚拟机 VMware Workstation Pro 安装成功之后需要输入密钥,请点击以下链接 http://www.360doc.com/conten ...

  2. Django框架之虚拟环境搭建

    创建虚拟环境篇 今天小编就来讲一下在Ubantu下如何搭建Django环境,希望能帮助那些不会搭建的童鞋^o^ 0.首先要先安装好Python环境,至于安装过程,小编就不讲了,百度一下,你懂得.. 1 ...

  3. hibernate--CRUD初体验

    hibernate的crud操作初体验. 看具体实例 package com.fuwh.model; import javax.persistence.Column; import javax.per ...

  4. [HNOI 2001]产品加工

    Description 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机 ...

  5. [TJOI2017]可乐

    题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...

  6. Windows、Unix、Linux是什么类型的操作系统?

    Windows:具有图形用户界面的视窗操作系统. Unix:多用户分时操作系统. Linux:类似Unix操作系统,用于个人计算机.

  7. 实现鼠标双击(OnGUI)

    void OnGUI()//实现鼠标双击 { Event Mouse = Event.current; if (Mouse.isMouse && Mouse.type == Event ...

  8. 春招实习面经分享(已拿到腾讯春招Offer)

    十分幸运地收到了腾讯的Offer..回来报答一下各位牛客网的战友们,说起来也是有点运气成分,最后通过腾讯的内推收到了offer!之前也屡遭重创,阿里的内推一面挂了(寒假过早地投简历,电话面试应对地不太 ...

  9. MySql查询不区分大小写解决方案(两种)

    当我们输入不管大小写都能查询到数据,例如:输入 aaa 或者aaA ,AAA都能查询同样的结果,说明查询条件对大小写不敏感. 解决方案一: 于是怀疑Mysql的问题.做个实验:直接使用客户端用sql查 ...

  10. Python开发——利用正则表达式实现计算器算法

    Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...