kafka模块概述

简介

  • 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.  进行消费者负载均衡

    

posted @ 2016-11-11 21:49  Binnzhao  阅读(928)  评论(0编辑  收藏  举报