Kafka学习笔记

一、Kafka介绍

    1.1简介

Apache Kafka 是分布式发布-订阅消息系统(消息中间件)。它最初由 LinkedIn 公司开发,之后成为 Apache 项目的一部分。Kafka 是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。

Apache Kafka 与传统消息系统相比,有以下不同:

  1. 它是分布式系统,易于向外扩展;
  2. 它同时为发布和订阅提供高吞吐量;
  3. 它支持多订阅者,当失败时能自动平衡消费者;
  4. 它将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。

 1.2术语

Broker

Kafka 集群包含一个或多个服务器,这种服务器被称为 broker

Topic

每条发布到 Kafka 集群的消息都有一个类别,这个类别被称为 Topic。(物 理上不同 Topic 的消息分开存储,逻辑上一个 Topic 的消息虽然保存于一个或多个 broker 上但用户只需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处)

Partition

Partition 是物理上的概念,每个 Topic 包含一个或多个 Partition.

Producer

负责发布消息到 Kafka broker

Consumer

消息消费者,向 Kafka broker 读取消息的客户端

Consumer Group

每个 Consumer 属于一个特定的 Consumer Group(可为每个 Consumer 指定 group name,若不指定 group name 则属于默认的 group)

replica

partition  的副本,保障 partition  的高可用

leader

replica  中的一个角色, producer  和 consumer  只跟 leader  交互

follower

replica  中的一个角色,从 leader  中复制数据

controller

Kafka  集群中的其中一个服务器,用来进行 leader election  以及各种 failover

二、Kafka安装

        (*)kafka的安装             解压:tar -zxvf kafka_2.11-0.10.2.1.tgz -C /opt/modules/             核心配置文件: config/server.propertis

broker.id=0
listeners=PLAINTEXT://bigdata01:9092
log.dirs=/opt/modules/kafka_2.11-0.10.2.1/data
num.partitions=3
zookeeper.connect=bigdata01:2181,bigdata02:2181,bigdata03:2181

            分发:

scp -r kafka_2.11-0.10.2.1/ bigdata02:/opt/modules/
scp -r kafka_2.11-0.10.2.1/ bigdata03:/opt/modules/

            修改bigdata02:

broker.id=1
listeners=PLAINTEXT://bigdata02:9092

            修改bigdata03:

broker.id=2
listeners=PLAINTEXT://bigdata03:9092

            每台机器上都要启动(需要先启动zookeeper):

/root/app/kafka_2.11-0.10.2.1/bin/kafka-server-start.sh -daemon /root/app/kafka_2.11-0.10.2.1/config/server.properties

三、Kafka操作  

  •           创建topic   
     /root/app/kafka_2.11-0.10.2.1/bin/kafka-topics.sh --create --zookeeper 192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181 --replication-factor 3 --partitions 3 --topic test
  •            查看Topic的详细信息
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test 
  •            模拟客户端取发送消息
bin/kafka-console-producer.sh --broker-list 
192.168.1.3:9092,192.168.1.4:9092,192.168.1.5:9092 --topic test
  •            模拟客户端去接收消息
bin/kafka-console-consumer.sh --bootstrap-server hadoop03:9092
 --from-beginning --topic hellotopic
  •             当主节点down掉了,会重写选举一个leader,之前的消息依然可用。

四、Kafka原理

4.1Kafka的拓扑结构

如上图所示,一个典型的 Kafka 集群中包含若干 Producer,若干 broker(Kafka 支持水平扩展, 一般 broker 数量越多,集群吞吐率越高),若干 Consumer Group,以及一个 Zookeeper 集群。Kafka 通过 Zookeeper 管理集群配置,选举 leader。Producer 使用 push 模式将消息发布到 broker,Consumer 使用 pull 模式从 broker 订阅并消费消息。

4.2 Producer发布消息

Producer采用push模式将消息发布到broker,每条消息都被append到partition,属于顺序写磁盘

producer 发送消息到broker时,会根据分区算法将其存储到哪一个partition

          指定了partition,则直接使用

          未指定partition,但指定key,通过对key的 value进行hash 选出一个partition

          partition和key 都为指定,使用轮询选出一个partition

4.2.1写数据流程

  • producer 先从 zookeeper 的 "/brokers/.../state" 节点找到该 partition 的 leader
  • producer 将消息发送给该 leader
  • leader  将消息写入本地 log
  • followers  从 leader pull  消息,写入本地 log  后 leader  发送 ACK
  • leader  收到所有 ISR(in-sync replicas) 中的 replica  的 ACK  后向 producer  发送 ACK

4.3Broker存储消息

4.3.1消息存储方式

        物理上把 topic  分成一个或多个 partition(对应 server.properties  中的 num.partitions=3  配置),每个 partition 物理上对应一个文件夹(该文件夹存储该 partition 的所有消息和索引文件)

4.3.2消息存储策略

       无论消息是否被消费,kafka 都会保留所有消息。有两种策略可以删除旧数据:

       log.retention.hours=168 #基于时间

       log.retention.bytes=1073741824 #基于大小

4.4 Kafka Log的存储解析

      Partition 中的每条 Message 由 offset 来表示它在这个 partition 中的偏移量,这个 offset 不是该 Message 在 partition 数据文件中的实际存储位置,而是逻辑上一个值,它唯一确定了partition 中的一条 Message。因此,可以认为 offset 是 partition 中 Message 的 id。partition中的每条 Message 包含了以下三个属性:  offset ;MessageSize;data

那 Kafka 是如何解决查找效率的的问题呢?

分段

     Kafka 解决查询效率的手段之一是将数据文件分段,比如有 100 条 Message,它们的 offset 是从 0 到 99。假设将数据文件分成 5 段,第一段为 0-19,第二段为 20-39,以此类推,每段放在一个单独的数据文件里面,数据文件以该段中最小的 offset 命名。这样在查找指定 offset 的 Message 的时候,用二分查找就可以定位到该 Message 在哪个段中。

    索引

    数据文件分段使得可以在一个较小的数据文件中查找对应 offset 的 Message 了,但是这依然需要顺序扫描才能找到对应 offset 的 Message。为了进一步提高查找的效率,Kafka 为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为.index。

     索引文件中包含若干个索引条目,每个条目表示数据文件中一条 Message 的索引。索引包含两个部分,分别为相对 offset 和 position。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ThoughtWorks

10Hours 网页应用

以前段开发为特长,不放过技术大赛这样机会的刘旸,和几个同事打造的10Hours 受到了大家的好评。想知道何谓10Hours?那就~ ? 最近公司举办技术大赛,...

33090
来自专栏匠心独运的博客

消息中间件—RocketMQ消息消费(一)

文章摘要:在发送消息给RocketMQ后,消费者需要消费。消息的消费比发送要复杂一些,那么RocketMQ是如何来做的呢? 在RocketMQ系列文章的前面几...

45530
来自专栏乐沙弥的世界

快速体验Percona XtraDB Cluster(PXC)

Percona XtraDB Cluster(简称PXC)集群是基于Galera 2.x library,事务型应用下的通用的多主同步复制插件,主要用于解决强一...

12720
来自专栏zhisheng

RocketMQ 安装及快速入门

如果你对 RocketMQ 还没了解,建议先看下上一篇文章:RocketMQ 初探 安装条件 64位操作系统,建议使用 Linux / Unix / Mac; ...

456110
来自专栏IT技术精选文摘

JMS与ActiveMQ

JMS是Java消息服务的缩写,它提供了一种以松耦合且灵活的方式对应用进行集成的机制。JMS以异步的方式在应用之间进行数据的存储转发。应用之间以MOM(面向消息...

22850
来自专栏码神联盟

ActiveMQ入门篇一入门实例1

上一期,我们讲解了ActiveMQ的原理和概念,以及用它来实现MQ的一些优势,今天我们来写一个入门级的示例。 首先,在写示例之前,我们先了解下ActiveMQ关...

33960
来自专栏Debian社区

分布式版本控制系统 Git v2.12.2 发布

Git v2.12.2 发布了,Git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。是 Linus Torvalds 为了...

15740
来自专栏听Allen瞎扯淡

解决mac升级10.11后,出现的 xcrun: error: invalid active developer path, missing xcrun 错误

前天把小mac升级到了10.11,结果今天在终端里使用git的时候,弹出一行莫名其妙的错误:xcrun: error: invalid active devel...

9900
来自专栏精讲JAVA

RocketMQ 源码学习 1 : 整体结构

为什么是 RocketMQ,而不是 ActiveMQ/RabbitMQ/Kafka 呢?这不是技术选型,我只是想找一个业界比较好的、开源的 MQ 系统,学习一下...

17230

使用CoreOs,Docker和Nirmata部署微服务类型的应用

随着采用应用容器的持续增长,设计用于运行容器的“最小”操作系统正在普及。CoreOS就是这样的一个操作系统。CoreOs是为运行现代云原生应用,并为Docker...

314100

扫码关注云+社区

领取腾讯云代金券