kafka系列-入门篇之基础概念

版权声明:如您需要转载该文章,请注明原文网址 https://blog.csdn.net/camel84/article/details/81464210

定义

官方对kafka的定义,kafka是一个分布式流平台。听起来让人感觉很陌生,实际使用中,你会觉得kafka是一个发布-订阅的消息队列平台。它和我们熟知的一些消息队列中间件比起来,在功能上更加强大,性能上也是非常高效的。


特性

  • 可扩展性,kafka搭建在分布式集群服务器上,支持水平无限扩展。
  • 容错性,kafka将数据副本存放在多台服务器上,避免服务器故障影响运行。
  • 高吞吐量,使用6块7200转SATA的RAID5硬盘,最高可以达到600mb/s的写入速度。
  • 高并发,kafka将数据进行分片存放在多台服务器上,以group的方式在多台客户端上读取消息。
  • 持久性,消息被持久化到本地磁盘,并且支持数据备份防止数据丢失。

架构

这里写图片描述
上面是一张kafka关于消息队列的软件架构图。
1. 消息从上到下依次通过Producer、Broker、Consumer三个角色传递。
2. 三个角色Producer、Broker、Consumer都可以部署成在集群服务器环境上,从而提高消息传递的效率。
3. Producer是将生产的消息推送给broker
4. Consumer是主动从Broker端拉取消息
5. Zookeeper会协助Kafka存储消息的消费偏移位置


基本概念

Topic/主题

Kafka将消息种子(Feed)分门别类,每一类的消息称之为一个主题(Topic)。

Producers/生产者

发布消息的对象称之为主题生产者(producer),上一节使用的kafka-console-producer命令就是一个生产者。

Consumers/消费者

订阅消息并处理发布的消息的种子的对象称之为主题消费者(consumers),上一节使用的kafka-console-consumer命令就是一个消费者

Broker/代理

已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker). 消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。


Kafka读写消息

kafka的每一个主题(topic)由多个分区(patition)组成,分区使得数据可以分散到多个服务器上,提高数据读取的并发度。
Topic结构
可以看到上图的topic由3个partition组成,每个partition可以分布在不同的服务器上,也可以存放在同一台服务器上。当kafka收到消息后,会按照先后顺序依次写入对应的partition,写入成功的数据不可更改。分区中的每一条消息都被分配了一个偏移量(offset),在每个分区中此偏移量都是唯一的。


生产者负责选择哪一个消息发布到Topic上的哪一个分区。对于负载均衡,最简单的方式从分区列表中轮流选择,也可以自定义选择分区算法。

消费者使用发布-订阅的方式,从Topic消息队列中拉取自己需要的数据。
读写topic
上图是一个Topic数据的读写情况,生产者将数据按顺序写入一个topic中,每一条数据都有一个offset。写完的数据都会持久化在硬盘上,默认保存7天。

回到刚才的图,此时生产者正在写入数据offset=12的位置;另外,有两个消费者在同时读取数据,consumerA读取到了offset=9的位置,consumerB读取到了offset=11的位置。也就是说,我们可以在任意时刻,反复读取保存在硬盘上的所有数据,这和传统的消息队列被接受数据有很大的区别。

在性能方面,虽然kafka没有使用大量的内存,而是使用硬盘存储数据,但是由于kafka在写入数据时,会按照数据收到的先后顺序写入硬盘,读取时便会线性读取,不再需要在磁盘寻道上花费大量性能。根据官方数据,6块7200转的硬盘做raid-5的线性写速度可以达到600M/s,但是随机写只有100K/s


使用场景

消息队列

kafka更好的替换传统的消息系统,消息系统被用于各种场景(解耦数据生产者,缓存未处理的消息等),与大多数消息系统比较,kafka有更好的吞吐量,内置分区,副本和故障转移,这有利于处理大规模的消息。

网站活动追踪

kafka原本的使用场景:用户的活动追踪,网站的活动(网页游览,搜索或其他用户的操作信息)发布到不同的话题中心,这些消息可实时处理,实时监测,也可加载到Hadoop或离线处理数据仓库。

指标

kafka也常常用于监测数据。分布式应用程序生成的统计数据集中聚合。

日志聚合

使用kafka代替一个日志聚合的解决方案。日志聚合是收集来自多台服务器上的日志文件,并处理后存放到数据中心(文件服务器或者HDFS)。Kafka清洗掉日志文件的细节,对日志数据进行实时流式处理。kafka对数据处理的低延时,对多数据源和分布式数据消费提供了更简单的方式。对比Scribe和flume等日志中心系统,kafka拥有数据副本和端对端的低延时性,提供了等效的性能,保证了强劲的持久性

流处理

kafka消息处理包含多个阶段。其中原始输入数据是从kafka主题消费的,然后汇总,丰富,或者以其他的方式处理转化为新主题,例如,一个推荐新闻文章,文章内容可能从“articles”主题获取;然后进一步处理内容,得到一个处理后的新内容,最后推荐给用户。这种处理是基于单个主题的实时数据流。从0.10.0.0开始,轻量,但功能强大的流处理,就进行这样的数据处理了。

事件采集

事件采集是一种应用程序的设计风格,其中状态的变化根据时间的顺序记录下来,kafka支持这种非常大的存储日志数据的场景。

提交日志

kafka可以作为一种分布式的外部提交日志,日志帮助节点之间复制数据,并作为失败的节点来恢复数据重新同步,kafka的日志压缩功能很好的支持这种用法,这种用法类似于Apacha BookKeeper项目。


小结

本篇介绍了kafka的一些基本概念,在后面深入研究kafka的过程,会发现kafka在设计上有很多亮点,这也是kafka能在大数据生太圏有一席之地的原因。

猜你喜欢

转载自blog.csdn.net/camel84/article/details/81464210