`
bit1129
  • 浏览: 1067880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Kafka二】Kafka工作原理详解

 
阅读更多

Kafka系统的角色

  • Broker :一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。一个Broker上可以有一个Topic的多个Partition,每个Partition的Lead随机存在于某一个Broker,这样实现了Topic的读写的负载均衡
  • topic: 可以理解为一个MQ消息队列的名字
  • Partition:为了实现扩展性,一个非常大的topic可以分布到多个 broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息 都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体 (多个partition间)的顺序。也就是说,一个topic在集群中可以有多个partition,那么分区的策略是什么?(消息发送到哪个分区上,有两种基本的策略,一是采用Key Hash算法,一是采用Round Robin算法)



 

  • Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka,如果这样的话,得多少个小文件,这个有点假啊!
  • Producer :消息生产者,就是向kafka broker发消息的客户端(Push)。
  • Consumer :消息消费者,向kafka broker取消息的客户端(Pull)



 

  • Consumer Group (CG):消息系统有两类,一是广播,二是订阅发布。广播是把消息发送给所有的消费者;发布订阅是把消息只发送给一个订阅者。Kafka通过Consumer Group组合实现了这两种机制: 实现一个topic消息广播(发给所有的consumer)和单播(发给任意一个consumer)。一个 topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个CG只会把消息发给该CG中的一个 consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还 可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。典型的应用场景是,多个Consumer来读取一个Topic(理想情况下是一个Consumer读取Topic的一个Partition),那么可以让这些Consumer属于同一个Consumer Group即可实现消息的多Consumer并行处理,原理是Kafka将一个消息发布出去后,ConsumerGroup中的Consumers可以通过Round Robin的方式进行消费(Consumers之间的负载均衡使用Zookeeper来实现)

消息多播的实现:

为一个Topic指定多个Consumer Group,每个Consumer Group指定一个Consumer,那么由于消息会发送给所有的Consumer Group,那么所有的Consumer都会消费这个消息

消息单播的实现:

为一个Topic指定一个Consumer Group,这个Consumer Group指定多个Consumer,那么由于消息发送给这个Consumer Group时只有一个Consumer消费,这就实现了一个消息只被一个Consumer消费的效果



 A two server Kafka cluster hosting four partitions (P0-P3) with two consumer groups. Consumer group A has two consumer instances and group B has four.

 

 

总结:Topic、Partition和Replica的关系:

 

 

如上图,一个Topic有四个Partition,每个Partition两个replication。

 

 

Zookeeper在Kakfa中扮演的角色

Kafka将元数据信息保存在Zookeeper中,但是发送给Topic本身的数据是不会发到Zk上的,否则Zk就疯了。

    • kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer)的配置。broker会在zookeeper注册并保持相关的元数据(topic,partition信息等)更新。
    • 而客户端会在zookeeper上注册相关的watcher。一旦zookeeper发生变化,客户端能及时感知并作出相应调整。这样就保证了添加或去除broker时,各broker间仍能自动实现负载均衡。这里的客户端指的是Kafka的消息生产端(Producer)和消息消费端(Consumer) ----那Producer还是需要知道Broker的状态啊,是不是Producer也需要监听Zookeeper以获取Broker的最新状态?但是ProducerConfig类中没有关于Zookeeper的信息
    • Producer端使用zookeeper用来"发现"broker列表,以及和Topic下每个partition的leader建立socket连接并发送消息。从这句话中,可以看出,每个Topic的partition是由Lead角色的
    • Broker端使用zookeeper来注册broker信息,以及监测partition leader存活性.
    • Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partition leader建立socket连接,并获取消息.
    • Zookeer和Producer没有建立关系,只和Brokers、Consumers建立关系以实现负载均衡,即同一个Consumer Group中的Consumers可以实现负载均衡

 

问题:

1.Topic有多个Partition,那么消息分配到某个Partition的依据是什么?Key Hash或者Round Robin

2. 如何查看一个Topic有多少个Partition?

使用kakfa-topic.sh --list topic topicName --zookeeper zookeeper.servers.list

 

Zookeeper记录的信息

如下列出了在http://bit1129.iteye.com/blog/2174791一文中操作Kafka时,Zk上记录的信息(可见,Zookeeper上没有记录Producer的信息,因为Producer是瞬态的,可以发送后关闭,无需直接等待)

[zk: localhost:2181(CONNECTED) 0] ls /
[admin, consumers, config, brokers]

 admin:

[zk: localhost:2181(CONNECTED) 15] ls /admin
[delete_topics]
[zk: localhost:2181(CONNECTED) 16] ls /admin/delete_topics
[]

 consumers:(consumers底下是consumer group,consumer group之下有owner,owner是topic的名字)

[zk: localhost:2181(CONNECTED) 7] ls /consumers
[test-consumer-group]
[zk: localhost:2181(CONNECTED) 8] ls /consumers/test-consumer-group
[owners, ids]
[zk: localhost:2181(CONNECTED) 9] ls /consumers/test-consumer-group/owners 
[test]
[zk: localhost:2181(CONNECTED) 10] ls /consumers/test-consumer-group/ids   
[]

 config:

[zk: localhost:2181(CONNECTED) 11] ls /config
[topics, changes]
[zk: localhost:2181(CONNECTED) 12] ls /config/topics
[test]
[zk: localhost:2181(CONNECTED) 13] ls /config/changes
[]

 brokers:

[zk: localhost:2181(CONNECTED) 3] ls /brokers
[topics, ids]
[zk: localhost:2181(CONNECTED) 4] ls /brokers/topics
[test]
[zk: localhost:2181(CONNECTED) 5] ls /brokers/ids
[]

 

 

推荐阅读:

http://www.michael-noll.com/blog/2013/03/13/running-a-multi-broker-apache-kafka-cluster-on-a-single-node/

  • 大小: 26.2 KB
  • 大小: 19.1 KB
  • 大小: 8.5 KB
  • 大小: 67.6 KB
分享到:
评论

相关推荐

    Kafka工作原理详解

    ### Kafka工作原理详解 #### 一、Kafka的角色与组件 Kafka作为一款分布式消息系统,在实际应用中涉及多种角色及组件,它们协同工作确保消息的高效传递。 1. **Broker**:Kafka集群的基本单元,一个Broker可以视为...

    kafka细心原理与实战

    #### 二、Kafka基本概念 **1. Topic**:主题,Kafka中用来分类消息的基本单位。一个业务通常对应一个Topic。 - **Partition**:分区,是Topic的基本单元,每个Topic可以包含多个分区,每个分区作为一个独立的日志...

    Kafka技术内幕:图文详解Kafka源码设计与实现+书签.pdf+源码

    《Kafka技术内幕:图文详解Kafka源码设计与实现》是一本深入解析Apache Kafka的专著,旨在帮助读者理解Kafka的核心设计理念、内部机制以及源码实现。这本书结合图文并茂的方式,使得复杂的概念变得更为易懂。同时,...

    Kafka技术内幕:图文详解Kafka源码设计与实现.郑奇煌(2017.11).pdf

    这本书详细介绍了Kafka的核心概念、工作原理以及源码分析,旨在帮助读者理解并掌握这个分布式流处理平台。 Kafka是一个高吞吐量、可扩展的开源消息系统,最初由LinkedIn开发,后来成为Apache软件基金会的顶级项目。...

    Kafka技术内幕:图文详解Kafka源码设计与实现

    9. **源码分析**:书中对Kafka的源码进行了深度剖析,涵盖了诸如生产者和消费者的实现、消息的序列化和反序列化、心跳机制、领导者选举等核心组件,有助于读者理解Kafka的内部工作原理。 通过学习《Kafka技术内幕:...

    kafka 技术内幕 图文详解Kafka源码设计与实现

    《Kafka技术内幕》这本书深入剖析了Apache Kafka这一分布式流处理平台的设计原理和实现细节,旨在帮助读者理解Kafka的核心机制,并能有效地运用到实际项目中。以下是对Kafka源码设计与实现的一些关键知识点的详细...

    kafka概述及原理.pdf

    #### 二、Kafka核心特性详解 ##### 1. 分布式与容错性 Kafka采用了分布式架构,集群由多个Broker组成,每个Broker都可以部署在独立的物理或虚拟机器上。这种设计不仅提高了系统的可扩展性,还极大地增强了系统的...

    Kafka快速实战与基本原理详解:从零到精通

    Kafka是一种分布式消息系统,最初由LinkedIn开发,后成为Apache软件基金会的顶级开源项目。它设计用于处理实时的大量数据,适用于批处理系统、实时处理系统、流处理引擎等多种场景,如日志收集、消息传递、用户活动...

    Kafka技术内幕(带书签).pdf

    总的来说,《Kafka技术内幕》这本书深入探讨了Kafka的架构、设计原理以及使用技巧,对于希望理解和使用Kafka构建实时数据平台的开发者来说,是一本不可多得的参考资料。通过学习本书,你可以了解到如何有效地利用...

    02-VIP-kafka设计原理详解1

    Kafka设计原理详解 在Kafka集群中,Controller扮演着至关重要的角色,它是一个核心的总控制器,负责管理和维护整个集群的稳定运行。Controller的主要任务包括处理分区的领导副本选举、ISR(In-Sync Replicas)集合...

    kafka安装包.zip

    【Kafka安装包详解】 Apache Kafka是一款开源的流处理平台,由LinkedIn开发并贡献给了Apache软件基金会。它最初设计为一个高吞吐量、低延迟的消息队列系统,但现在已经成为大数据领域的重要组件,广泛用于实时数据...

    Kafka技术内幕:图文详解Kafka源码设计与实现.郑奇煌

    《Kafka技术内幕:图文详解Kafka源码设计与实现》是郑奇煌撰写的一本深入解析Apache Kafka的书籍,特别关注的是0.10版本。这本书提供了丰富的知识,涵盖了Kafka的核心概念、架构设计以及源码分析。下面将详细讨论书...

    Kafka集群配置样例_3节点_源码

    **Kafka集群配置详解——基于3节点实例** 在大数据处理领域,Apache Kafka作为一个高吞吐量、分布式的发布订阅消息系统,被广泛应用于实时数据流处理。本篇将详细解析如何在Linux环境下配置一个3节点的Kafka集群,...

    kafka基础学习ppt

    ### Kafka基础知识点详解 #### 一、Kafka简介 Kafka是一款由Apache软件基金会开源的分布式消息系统,最初由LinkedIn开发并开源。该系统主要使用Scala语言编写,旨在解决统一、高效、低延迟以及高吞吐量的问题,同时...

    有关kafka的三本电子书,电子文档

    此外,它还会深入讨论Kafka的内置特性,如Offset管理和Consumer Group机制,这些是理解Kafka工作原理的关键。 接着,《Kafka实战指南》则注重实践操作,书中可能包含了大量的实战案例和最佳实践,帮助读者在实际...

    spring kafka demo (详解 可以跑通)

    本示例将提供一个详细的Spring Kafka演示,确保你可以按照步骤运行并理解其工作原理。 Kafka是一个高吞吐量、分布式的消息发布订阅系统,广泛应用于大数据实时处理和流数据处理场景。Spring Kafka使得Kafka的API与...

    尚硅谷大数据技术之Kafka(笔记+代码+资料).rar

    在本课程中,你将学习到,Kafka架构原理、安装配置使用、详细的Kafka写入数据和处理数据以及写出数据的流程、新旧版本对比及运用、分区副本机制的详解、内部存储策略、高阶API直接消费数据、等等

    kafka学习之路

    ### Kafka学习之路——详解Kafka原理与架构 #### 一、Kafka简介 Kafka是一款由LinkedIn开发并开源的消息队列系统,它主要用于处理实时数据流,并能够支持在线和离线的日志处理需求。Kafka的基本特性包括高吞吐量、...

    kafkatool_64bit.zip

    然而,为了充分利用这个工具,理解Kafka的基本概念和工作原理是非常重要的,比如了解Kafka的分区策略、复制机制、消费者模型等。 总的来说,kafkatool_64bit.zip是一个强大的Kafka管理工具,它通过直观的命令行界面...

Global site tag (gtag.js) - Google Analytics