kafka之基础知识梳理(一)

发布于 2019-04-13  16 次阅读


前言

在前面文章中我介绍过常见的几款消息队列之间的区别,而kafka由于io性很能强,吞吐量高等特点常常与hadoop生态以及日志分析系统结合。本文算是对kafka的一个初探,把重要的基础知识先做下总结。部分重要的原理会另写文章详细分析。

什么是kafka?

kafka 最初由Linkedin公司用scala语言开发,是一个支持分区(partition),replicas副本集,基于zookeeper协调的分布式消息系统。它的最大特性就是可以实时的处理大量数据以满足各种需求场景,比如基于hadoop的批处理系统,低延时的实时系统,storm/spark流式处理引擎,各种日志系统的中间件。后来Linkedin于2010年贡献给Apache基金会并成为顶级开源项目。

kafka常见名词解释

  • producer

消息的生产者,producer向topic发送消息的过程叫producers

producer可以将消息通过一些算法(round-robin)发布到指定topic的partition上。

  • consumer

消息的消费者

  • ConsumerGroup

消息的多个消费者组成的组,可以认为一个group就是一个"订阅者",一个topic中的partition只能被一个group中的一个comsumer消费,即一个partition只能对应一个comsumer,不能够一个consumer group的多个consumer同时消费一个partition,如果一个message可以被多个consumer(consumer 线程)消费的话,那么这些consumer必须在不同的组。一个consumer却可以消费多个不同的partition,(当comsumer个数小于partition数量,此时一个consumer要多承认消费任务,但是我们尽量让都让消费任务均分,防止个别消费者消费压力过大,造成堆积,因为ack机制说明了,这个速度取决于消费最慢的那个consumer)

  • broker

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

Message在Broker中通过Log追加的方式进行持久化存储。并进行分区(patitions),为了减少磁盘写入的次数,broker会将消息暂时buffer起来,当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,这样减少了磁盘IO调用的次数。

  • topic

消息类别。他是一个逻辑上的概念,消息产生都有创建topic,然后按照topic进行消息分类

  • Message

通信的基本单位,每个producer可以向一个topic发送一些message

kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又有多个partition.而topic有几个partition是在创建topic时候指定的。每个partition存储一部分Message。

partition中的每条Message包含了以下三个属性:

1.offset对应类型:long

2.MessageSize对应类型:int32

3.data是message的具体内容

  • partition

分区。他是一个物理上的概念,可以理解为数据分片,一个topic有多个partition,目的是防止单机性能瓶颈。

1.kafka基于文件存储,磁盘的性能就是其吞吐量的保证,通过partition分区,可以把这些文件分布在多个server上,避免文件尺寸达到单机磁盘上限。

2.越多的partitions意味着可以容纳更多的consumer,有效提升并发消费能力,因为如果partition很少只有两个,此时设置很多consumer也没有用,因为前面介绍了一个partition只能被一个consumer消费,其余consumer只能等待。那么设置过多的consumer就没意义了,所以我们可以把topic拆封成多个partition,这样设置同等数量的consumer就没有了空闲,并且消费效率也提高了。

  • offset

partition中的消息都是有序的,都被分了一个序列号,称之为offset(偏移量),在每个分区中,偏移量是唯一的。

  • segment

相对于partition的一个更为细致的概念。一个partition中有多个segment构成。segment包括Index 和log文件。目的是通过局部数据过期,防止partition过大

  • replica

副本集,每个partition都有多个replica。目的是保证分片数据可靠性,防止一个partition损坏导致整个partition不可用。

kafka体系架构

1.图中有多个producer,producer作为生产者(可以是服务器日志,业务数据,页面前端产生的pv等).通过push操作将消息推送给broker集群(kafka集群)

2.kafka集群由多个kafka实例水平拓展构成的,大大提高了系统的吞吐率,配合partition机制解决了单机性能瓶颈

3.既然kafka做成了集群,那么就需要zookeeper集群进行分布式服务协调管理。kafka和consumer会注册信息并连接zookeeper,zookeeper存储了broker的元数据信息,comsumer会先通过zookeeper进行连接查找。然后通过pull模式从broker上订阅并消费kafka上的信息。

kafka的特性

  • 高吞吐量,低延迟

kafka每秒可以处理几十万条消息,延迟最低只有几毫秒。

原理:kafka直接采用磁盘顺序读写,而不是放到内存在持久化到磁盘。磁盘的顺序读写速度要比内存的随机读效率还要高。这也是kafka io高的原因之1

  • 可扩展性

kafka集群支持热扩展,可以很好的实现水平扩展

  • 持久性,可靠性

消息被持久化到本地磁盘,本地支持数据备份防止数据丢失。

  • 容错性(replica)

允许集群节点失败,若副本replica数量为n,则允许n-1个节点失败

  • 高并发

支持数千个客户端读写

kafka四个核心API

1.应用程序使用producer API发布消息到1个或多个topic中。
2.应用程序使用consumer API订阅一个或多个topic,并处理产生的消息。
3.应用程序使用streams API充当一个流处理器,从1个或多个topic消费输入流,并产生一个输出流到1个或多个topic,有效地将输入流转换到输出流。
4.connector API允许构建或运行可重复使用的生产者或消费者,将topic链接到现有的应用程序或数据系统。

kafka应用场景

  • 日志收集

对接elk 日志系统,filebeat收集日志然后push推送给kafka,然后logstash pull 拉取 kafka中的日志进行过滤和格式整理,然后输出到elasticsearch进行存储,最后通过kibana查看日志。

  • 消息系统

用于生产者和消费者之间的解耦,提高响应速度

  • 用户活动跟踪

可以记录web用户或者app用户的各种活动。如浏览网页,搜索,点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic做实时的监控分析,或者装载到hadoop,数据仓库中做离线分析和挖掘。

  • 流式处理

比如spark streaming 和storm

主题和日志(Topic和Log)

1.topic中有多个分区(partition),每个partition都是一个顺序的,不可变的消息队列,并且可以持续添加。

2.分区中的消息都被分配了一个序列号offset,我们称为偏移量,每个分区中offset都是唯一的。kafka集群保持着所有的消息,直到他们过期,而不取决于消息是否被消费了,消费者所持有的元数据就是这个offset,记录着消费者在这个log中的位置,这个漂移量由消费者控制

3.当消费者消费消息的时候,偏移量也线性的增加,但是实际偏移量由消费者控制,消费者可以将偏移量重置为更老的一个偏移量,重新读取消息。这种设计对消费者来说操作自如,一个消费者的操作不会影响其他消费者对此log的处理。

Partition与分布式

Log的分区被分布到broker集群中的多个服务器,每个服务器仅仅处理他分配到的分区,这样就可以分担压力,提高性能。并且根据配置文件的设置,每个partition还可以复制成副本到其他服务器作为备份我们称之为replicas

每个partition分区都有一个Leader,其他是follower(可以没有)。Leader处理此parittion的读写请求,而follower只是被动的复制数据,如果leader宕机,其他的follower会被推举成新的leader。一台服务器可能是一个partition的Leader,同时也是另一个partition的follower。这样可以平衡,避免所有请求都只让一台或者某几台服务器处理

Kafka Broker Leader 选举

kafka集群受zookeeper管理,所有的kafka节点都会去zookeeper注册一个临时节点,但是只有一个kafka会注册成功被称为kafka  broker controller ,其他的叫kafka broker follower (这个过程叫controller在zookeeper注册watch)。这个controller会监听其他kafka broker的所有消息,如果这个kafka broker

 

 

 

 

 

 

 


一个幽默,喜欢动漫,音乐,爱小动物,逐渐成为二次元肥宅的LINUX运维工程师,我会用心写博客,刚开始写的不太好。但是我会不断进步的!。就像我的博客下面写的。我宁愿做错,也不愿什么都不做 ps:好像是伊泽瑞尔说的,看来你游戏没少玩啊 23333333333333