kafka基础

转载 2016年05月31日 22:43:37

1、kafka产生背景

  • kafka是分布式发布-订阅消息系统,它最初由 LinkedIn 公司开发,使用 Scala语言编写,之后成为 Apache 项目的一部分。Kafka 是一个分布式的,可划分的,多订阅者,冗余备份的持久性的日志服务,主要用于处理活跃的流式数据,譬如:根据pageview分析用户行为;对用户的搜索关键字进行统计,分析出当前的流行趋势;
  • 在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转。传统的企业消息系统并 不是非常适合大规模的数据处理。为了已在同时搞定在线应用(消息)和离线应用(数据文件,日志)Kafka 就出现了。
  • Kafka 可以起到两个作用:
    • 降低系统组网复杂度
    • 降低编程复杂度,各个子系统不在是相互协商接口,各个子系统类似插口插在插座上,Kafka 承担高速数据总线的作用。

 

2、kafka简介

  • kafka最基本的架构是生产者发布一个消息到Kafka的一个主题(topic),这个主题即是由扮演KafkaServer角色的broker提供,消费者订阅这个主题,然后从中获取消息。

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

  • 数据文件的分段: 、
    • Kafka解决查询效率的手段之一是将数据文件分段(segment);
  • 为数据文件建索引:
    • 为每个分段后的文件建立索引文件,文件名和数据文件名相同,只不过索引文件扩展名是以.index结尾
    • 索引文件中包含若干个条目,每个条目表示数据文件中一条message的索引
    • 索引文件包含两部分,分别为相对offset和position
  • 索引策略
    • 稀疏存储,每隔一定字节的数据建立一条索引。

4、kafka特点

  • 同时为发布和订阅提供高吞吐量。据了解,Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)。
  • 可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。通过将数据持久化到硬盘以及 replication 防止数据丢失。
  • 分布式系统,易于向外扩展。所有的 producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。
  • 消息被处理的状态是在 consumer 端维护,而不是由 server 端维护。当失败时能自动平衡。
  • 支持 online 和 offline 的场景。

 

5、消息队列分类

  • 点对点:
    • 消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。
    • 注意:
      • 消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
      • Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
  •  发布/订阅:
    • 消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。

 

6、消息队列MQ对比

  • RabbitMQ:
    • 支持的协议多,非常重量级消息队列,对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。
  • ZeroMQ:
    • 号称最快的消息队列系统,尤其针对大吞吐量的需求场景,擅长的高级/复杂的队列,但是技术也复杂,并且只提供非持久性的队列。
  • ActiveMQ:
    • Apache下的一个子项,类似ZeroMQ,能够以代理人和点对点的技术实现队列。
  • Redis:
    • 是一个key-Value的NOSql数据库,但也支持MQ功能,数据量较小,性能优于RabbitMQ,数据超过10K就慢的无法忍受

 

7、Kafka部署架构

8、kafka基本概念

  • Topic:
    • 特指 Kafka 处理的消息源(feeds of messages)的不同分类。
    • 一个Topic可以认为是一类消息,每个topic将被分成多partition(区),每个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),partition是以文件的形式存储在文件系统中。
    • Logs文件根据broker中的配置要求,保留一定时间后删除来释放磁盘空间。
    • Partition:
      • Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)。
      • 设计目的:
        • kafka基于文件存储.通过分区,可以将日志内容分散到多个server上,来避免文件尺寸达到单机磁盘的上限,每个partiton都会被当前server(kafka实例)保存;
        • 可以将一个topic切分多任意多个partitions,来消息保存/消费的效率.
        • 越多的partitions意味着可以容纳更多的consumer,有效提升并发消费的能力.
      • offset
        • 每条消息在文件中的位置称为offset(偏移量)
        • Partition中的每条Message由offset来表示它在这个partition中的偏移量,这个offset不是该Message在partition数据文件中的实际存储位置,而是逻辑上一个值,它唯一确定了partition中的一条Message。因此,可以认为offset是partition中Message的id。
      • Message:
        • 消息,是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。
        • Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定的),每个partition存储一部分Message。
      • Producers:
        • 消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producers。
        • Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;
      • Consumers:
        • 消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。
          • 本质上kafka只支持Topic.每个consumer属于一个consumer group;反过来说,每个group中可以有多个consumer.发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费.
          • 在 kafka中,我们 可以认为一个group是一个”订阅”者,一个Topic中的每个partions,只会被一个”订阅者”中的一个consumer消费
        • 怎样记录每个consumer处理的信息的状态?
          • 在Kafka中仅保存了每个consumer已经处理数据的offset
          • consumer处理数据时,只需从最近的offset开始处理数据即可。
        • Consumers Group
          • 允许consumer group对一个topic进行消费,不同的consumer group之间独立订阅。
          • 为了对减小一个consumer group中不同consumer之间的分布式协调开销,指定partition为最小的并行消费单位,即一个group内的consumer只能消费不同的partition。
        • Broker:
          • 缓存代理,Kafa 集群中的一台或多台服务器统称为 broker。
          • 为了减少磁盘写入的次数,broker会将消息暂时buffer起来,当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,这样减少了磁盘IO调用的次数.

 

 

9、Kafka的broker无状态机制

  • Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。
  • Broker不保存订阅者的状态,由订阅者自己保存。
  • 无状态导致消息的删除成为难题(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。
  • 消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset进行重新读取消费消息。

 

10、kafka的分布式实现

  • 一个Topic的多个partitions,被分布在kafka集群中的多个server上;每个server(kafka实例)负责partitions中消息的读写操作;
  • 此外kafka还可以配置partitions需要备份的个数(replicas),每个partition将会被备份到多台机器上,以提高可用性;
  • 基于replicated方案,那么就意味着需要对多个备份进行调度;
  • 每个partition都有一个server为”leader”;leader负责所有的读写操作,如果leader失效,那么将会有其他follower来接管(成为新的leader);
  • follower只是单调的和leader跟进,同步消息即可..由此可见作为leader的server承载了全部的请求压力,因此从集群的整体考虑,有多少个partitions就意味着有多少个”leader”;
  • kafka会将”leader”均衡的分散在每个实例上,来确保整体的性能稳定.

 

11、Kafka的储存策略

  • kafka以topic来进行消息管理,每个topic包含多个partition,每个partition对应一个逻辑log,有多个segment组成。
  • 每个segment中存储多条消息(见下图),消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。
  • broker 收到发布消息往对应 partition 的最后一个 segment 上添加该消息。
  • 每个part在内存中对应一个index,记录每个segment中的第一条消息偏移。
  • 发布者发到某个topic的 消息会被均匀的分布到多个part上(随机或根据用户指定的回调函数进行分布),broker收到发布消息往对应part的最后一个segment上添加 该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的 消息订阅者才能订阅到,segment达到一定的大小后将不会再往该segment写数据,broker会创建新的segment。

 

12、Kafka数据持久化

  • 日志数据持久化特性:
    • 写操作:通过将数据追加到文件中实现
    • 读操作:读的时候从文件中读就好了
  • 读操作不会阻塞写操作和其他操作,数据大小不对性能产生影响;   没有容量限制(相对于内存来说)的硬盘空间建立消息系统;   线性访问磁盘,速度快,可以保存任意一段时间!

 

12、Kafka的消息发送的流程

  • 由于 kafka broker 会持久化数据,broker 没有内存压力,因此,consumer 非常适合采取 pull 的方式消费数据
  • Producer 向Kafka(push)推数据, consumer 从kafka 拉(pull)数据。
  • 消息处理的优势:
    • consumer 根据消费能力自主控制消息拉取速度 ,consumer 根据自身情况自主选择消费模式,例如批量,重复消费,从尾端开始消费等
    • kafka 集群接收到 Producer 发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否被消费。

 

 

13、Kafka 可扩展性

  • 当需要增加 broker 结点时,新增的 broker 会向 zookeeper 注册,而 producer 及 consumer 会根据注册在 zookeeper 上的 watcher 感知这些变化,并及时作出调整,这样就保证了添加或去除broker时,各broker间仍能自动实现负载均衡。

14、Kafka的Zookeeper协调控制

  • 管理broker与consumer的动态加入与离开。
  • 触发负载均衡,当broker或consumer加入或离开时会触发负载均衡算法,使得一个consumer group内的多个consumer的订阅负载平衡。
  • 维护消费关系及每个partion的消费信息。
  • Zookeeper上的细节:
    • 每个broker启动后会在zookeeper上注册一个临时的broker registry,包含broker的ip地址和端口号,所存储的topics和partitions信息。
    • 每个consumer启动后会在zookeeper上注册一个临时的consumer registry:包含consumer所属的consumer group以及订阅的topics。
    • 每个consumer group关 联一个临时的owner registry和一个持久的offset registry。对于被订阅的每个partition包含一个owner registry,内容为订阅这个partition的consumer id;同时包含一个offset registry,内容为上一次订阅的offset。

 

15、Kafka客户端操作

  • 创建生产者 producer
    • bin/kafka-console-producer.sh –broker-list localhost:9092 –topic test
  • 创建消费者 consumer
    • bin/kafka-console-consumer.sh –zookeeper localhost:2181 –topic test –from-beginning
  • 参数使用帮组信息查看:
    • 生产者参数查看:bin/kafka-console-producer.sh

相关文章推荐

kafka基础代码

  • 2017年11月09日 15:07
  • 9KB
  • 下载

kafka基础使用方法(java)

Producer/Comsumer Demo源代码见: https://github.com/CalicoBox/True-Time-Count-Demo

kafka基础

http://kafka.apache.org/quickstart kafka笔记  1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客...

Kafka分布式消息队列(一):基础

本文基于Kafka 0.8 1. 引言 Kafka是LinkedIn开发并开源出来的一个高吞吐的分布式消息系统。其具有以下特点: 1) 支持高Throughput的应用 2)  sca...

kafka基础之介绍和分布式集群搭建

一 kafka介绍 现在各个电商平台,社交平台等诸多系统可以不断生产出各种细信息,那么我们应该如何收集它,如何分析它,以及输入实时的做到以上需求。Kafka应运而生。 Kafka是一个分布式的的流式系...

SODBASE实时大数据基础(一):实时同步Mysql数据库到Kafka

实时大数据平台需要有一系列的基础,例如将业务数据库同步到基于Hadoop架构的数据仓库,从而解决大数据实时查询的需求。同时,相比全量同步数据也减少对网络带宽的消耗。...

Kafka学习(一)——0.10.2.0版本基础知识,java简单的demo

centos 7 kafka第一个java示例 支持复杂对象 kafka_2.10 0.10.2.0
  • canthny
  • canthny
  • 2017年03月24日 22:38
  • 87

Kafka (一种高吞吐量的分布式发布订阅消息系统) 基础概念

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是...
  • ronmy
  • ronmy
  • 2017年03月05日 14:51
  • 643

Storm-kafka-hbase基础编程一

上一篇文章介绍了Storm如果如何保证消息传送的,通过message ID以及anchered tuple机制来跟踪消息,如果完成了,返回ack,失败了返回fail以便重发消息。但是即使如此,大家也知...

Kafka基础概念

Kafka基础概念前言最近项目中要使用到流式数据处理,借此机会学习一下Kafka的相关知识。简介Apache Kafka是一个分布式的、分区的、可重复提交的日志系统。它以独特的设计提供了消息系统的功能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kafka基础
举报原因:
原因补充:

(最多只允许输入30个字)