简介

  • kafka主要用于实现低延迟的发送和收集大量的事件和日志数据--通常是活跃的数据(PV、访问记录等),数据以日志形式记录下来,然后由一个专门的系统来进行日志的收集与统计;
  • 吞吐量极高的分布式消息系统,典型的发布订阅模式系统;
  • kafka集群,没有中心节点的概念,可以在不做任何配置修改的情况下添加和删除服务器,同样,消息的生产者、消费者可以随意重启、上下线;

Broker注册

  • Broker是分布式部署,且相互独立,通过注册系统ZooKeeper综合管理,ZooKeeper上Broker服务器列表记录节点路径:/brokers/ids,Broker启动时会到ZooKeeper注册,创建属于自己的节点:/broker/ids/[0...N],将自己的IP地址和端口信息写入该节点中;
  • Broker创建的节点为临时节点,一旦Broker服务器宕机or下线,对应的Broker节点会被删除,因此可以通过ZooKeeper上的Broker节点的变化情况来动态表征Broker服务器的可用性;

Topic注册

  • kafka中,同一个Topic消息凤城多个分区并分布到多个Broker上,这些分区信息与Broker的对应关系由ZooKeeper维护,对应节点:/brokers/topics,每一个Topic,都会有节点:/brokers/topics/[topic],如:/brokers/topics/loginlogs;
  • Broker服务启动后,会到对应的Topic节点下注册自己的Broker ID,并写入针对该Topic的分区总数,如:/brokers/topics/loginlogs/3 ->2,表明Broker ID为3的一个Broker服务器,对于loginlogs这个Topic消息,提供了2个分区进行消息存储。同样,这个分区书节点也是临时的;

生产者负载均衡

  • 生产者需要合理的发送消息到分布式的Broker上,所以面临生产者负载均衡的问题。
  • kafka支持传统的四层负载均衡,同时支持使用ZooKeeper来实现负载均衡。
  1. 四层负载均衡

  此方案设计教简单,根据生产者的IP与端口来为其确定一个关联的Broker,通常一个生产者只会对应一个Broker,该生产者所有消息都发送给该Broker。此方案设计简单,不需要引入其他第三方系统,同时生产者不需要同其他系统建立额外的TCP连接,只需要维护和Broker的单个TCP链接即可

  弊端很明显,无法做到真正的负载均衡,实际运行中,每个生产者生成的消息量,以及每个Broker的消息存储量都不一样,导致不同Broker接收到的消息不均匀。另方面,生产者也无法感知到Broker的新增与删除,因此,该方案无法做到动态的负载均衡。

  2. 使用ZooKeeper进行负载均衡

  kafka中,客户端使用了基于ZooKeeper的负载均衡策略来解决生产者的负载均衡问题。前面介绍,每当Broker启动时,会首先完成Broker的注册过程,并注册一些“有哪些可订阅的Topic” 的元数据信息。

  kafka的生产者会对ZooKeeper上的以下事件注册Watcher监听,来实现一种动态的负载均衡机制:

    Broker的新增与减少

    Topic的新增与减少

    Broker与Topic关联关系的变化

消费者负载均衡

  与生产者类似,消费者也需要进行负载均衡来实现多个消费者合理的从对应的Broker服务器上接受消息。每一条消息都会发送给分组中的一个消费者,即同一个消费者分组内部的消息消费策略。

  • 消息分区与消费者关系

  每个消费者分组,都会有唯一的Group ID,每个消费者也有唯一的Consumer ID,通常为‘Hostname:UUID’;

  kafka设计规定,每个消息分区有且只能同时有一个消费者对其进行消息的消费,因此需要在ZooKeeper上记录下消息分区与消费者之间的关系;

  消费者确定了对一个消息分区的消费权利,需将其Customer ID写入对应的消息分区的临时节点上,如:/consumers/[group_id]/owns/[topic]/[broker_id-partition_id],broker_id-partition_id为一个消息的分区标识,节点内容即该分区对应的消费者Consumer ID;

  • 消息消费进度Offset记录

  节点路径:/consumers/[group_id]/offsets/[topic]/[broker_id-partitiion_id],节点内容即Offset的值;以便该消费者重启或其他消费者接管该消息分区后,能够从之前的进度继续开始

  • 消费者注册

  1. 注册到消费者分组

    消息者服务启动,会注册:/consumers/[group_id]/ids/[consumers_id],节点创建完后,会将自己订阅的Topic信息写入该节点,此节点也为临时节点;

  2. 对消费者分组中消费者的变化注册监听

    对/consumers/[group_id]ids节点注册子节点变化的watcher监听,一旦发现消费者新增减少,就会触发消费者的负载均衡;

  3. 对Broker服务器的变化注册监听

    对/brokers/ids/[0...N]中节点注册监听,Broker服务器发生变化,根据情况决定是否进行消费者负载均衡;

  4.  进行消费者负载均衡

    

kafka模块概述的更多相关文章

  1. XAF-通知模块概述 web+win

    通知模块概述 1.支持 WinForms和ASP.NET程序. 2.支持调度模块或自定义业务对象. 3.功能:在指定的时间,弹出一个窗口,用户可以查看提醒.也可以取消或推迟. 如需演示项目的源码,可以 ...

  2. spark概念、编程模型和模块概述

    http://blog.csdn.net/pipisorry/article/details/50931274 spark基本概念 Spark一种与 Hadoop 相似的通用的集群计算框架,通过将大量 ...

  3. Kafka之概述

    Kafka之概述 一.消息队列内部实现原理 (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消 ...

  4. ASP.NET Core模块概述

    原文地址:ASP.NET Core Module overview By Tom Dykstra, Rick Strahl, and Chris Ross ASP.NET Core模块(ANCM)让你 ...

  5. Spark Streaming 实现思路与模块概述

    一.基于 Spark 做 Spark Streaming 的思路 Spark Streaming 与 Spark Core 的关系可以用下面的经典部件图来表述: 在本节,我们先探讨一下基于 Spark ...

  6. [02] Spring主要功能模块概述

    1.Spring主要功能模块   1.1 Core Container Spring的核心容器模块,其中包括: Beans Core Context SpEL Beans和Core模块,是框架的基础部 ...

  7. ASP.NET Core Module overview模块概述

    原文地址:ASP.NET Core Module overview By Tom Dykstra, Rick Strahl, and Chris Ross ASP.NET Core模块(ANCM)让你 ...

  8. openstack七大模块概述

    前言 OpenStack主要由七部分组成,分别是Identify, Image, Network, Compute, Block Storage, Object Storage, Dashboard, ...

  9. 4.2、Libgdx每个模块概述

    (原版的:http://www.libgdx.cn/topic/34/4-2-libgdx%E5%90%84%E4%B8%AA%E6%A8%A1%E5%9D%97%E6%A6%82%E8%A7%88) ...

随机推荐

  1. angular自己最近学的一种筛选方法

    投资状态vm.statusList = [ {name:"项目状态",value:-1}, {name:"上线",value:0}, {name:"投 ...

  2. 常用mysql语句

    mysql基本知识:日志文件 =======================================开启/关闭日志修改 /etc/my.cnf #log-bin=mysql-bin #重启my ...

  3. 《sqoop安装和配置》

    参考帖子http://blog.csdn.net/jiedushi/article/details/6663177 http://blog.csdn.net/ww1982_0_0_0/article/ ...

  4. mysql连结查询

    2016年4月13日 18:08:22 星期三 union 会生成临时表, 然后一同取出合并 join 或子查询, 会生成临时表进行嵌套循环 临时表, 缺点就是没有索引

  5. 在linux中减小和增大LV的过程与思考

    今天在安装oracle 11 rac的时候,查看操作系统df -lh,发现/home目录竟然分了500多G,/根目录才有50G,当时我就爆了句粗口,这TM系统是怎么做的. Filesystem     ...

  6. 使用 lsyncd 本地目录实时备份

    转自 https://segmentfault.com/a/1190000002737213 2.1安装lsyncd # rpm -ivh http://dl.fedoraproject.org/pu ...

  7. Android笔记:android的适配

    public int Dp2Px(Context context, float dp) { final float scale = context.getResources().getDisplayM ...

  8. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  9. 注解:【有连接表的】Hibernate双向1->N关联(仅N端控制关联关系)

    Person与Address关联:双向1->N,[有连接表的],N端控制关联关系 Person.java package org.crazyit.app.domain; import java. ...

  10. 关于SQLSERVER中用SQL语句查询的一些个人理解

    作为一个编程菜鸟说真的很难有什么见解,也就是写给一些刚学习编程的人,希望能给他们一些帮助吧! SQLSERVER作为刚开始入门学习的数据库,SQL语句也并不算太难!说白了也就是建库,建表,建约束,对数 ...