Kafka分布式流式处理平台

本文链接地址:【Kafka】Kafka分布式流式处理平台(http://www.lubinsu.com/index.php/archives/472)

作为一个分布式消息发布订阅系统,Kafka在大数据领域被人们所熟知,在这里对Kafka的一些基本概念做一个简介,后续将对Kafka做一整个专题的介绍。希望对大家有所帮助。

Kafka流平台有如下三个特征:

Publish and subscribe to streams of records, similar to a message queue or enterprise messaging system.

Store streams of records in a fault-tolerant durable way.

Process streams of records as they occur.

也就是说它类似于消息队列或者企业级消息系统,可以发布订阅流中的数据、可以将接收到的数据持久化达到高容错性的效果,你还可以通过这个平台实时处理接收到的流式数据。

API

我们先来看下Kafka的四类主要的API:

Producer API:发布流数据到一个或者多个topic

Consumer API:用于订阅一个或者多个topic,并且处理产生的消息

Streams API:作为一个流处理器,有效的将一个输入流转换为一个输出流,也就是将一个或者多个topic的数据处理转换成另一个或者多个topic的数据

Connector API:我们可以通过connector api构建并运行一个可以重复使用的生产者或者消费者,来连接Kafka的topic与应用程序,或者数据系统

概念释义

开头说了这么多,可能大家对一些新的概念还不是很熟悉,这里我们来了解下几个专有名词:

Topic(主题):Kafka集群分类保存的一系列流数据,这些分类就叫做主题

A topic is a category or feed name to which records are published. Topics in Kafka are always multi-subscriber; that is, a topic can have zero, one, or many consumers that subscribe to the data written to it.

也就是说kafka中的topic支持一个或者多个消费者订阅它。并且针对每个topic,Kafka维护了一个经过分区的log,如下图所示:

在这里,每个分区都是一个有序的、不可变的、不断追加的日志序列。并且每一条记录在这里都用一个顺序生成的id标示了——叫做offset,这个offset唯一标志了一个partition的一条记录。不管这些消息有没有被消费掉,Kafka集群会根据所配置的时间段将每一条记录持久化在磁盘中。只要消息在指定的时间内还未过期,我们都可以从中消费到它。

分布式

所有日志的分区,分布在Kafka集群的服务器上,每台服务处理其所负责的partition的数据和请求,每个partition根据配置可以拥有多个副本并分布到不同的服务器上,来达到容错的效果。

每个partition拥有一个leader,并且有0个或者多个follower,leader负责所有的读写,follower负责被动的从leader复制。如果leader失败了,那么其中的follower将会自动转为leader。每台服务器扮演了一部分topic的leader,一部分topic的follower,以此达到负载均衡的效果。

Producer(生产者):Kafka的生产者根据指定的逻辑(如:round-robin),将消息分发到指定topic的partition下

Consumer(消费者):Kafka的消费者根据group name来标识自己,每条发布的消息最终会传送给每个指定了group name的消费者,同一个消费者(只要group name相同)可以分布在不同服务器的不同进程中

If all the consumer instances have the same consumer group, then the records will effectively be load balanced over the consumer instances.–同一个group name可以达到负载均衡的效果

If all the consumer instances have different consumer groups, then each record will be broadcast to all the consumer processes.–不同的group name,那么记录将会被拷贝多份分发给各个group

由此可见,我们可以通过创建多个同名的consumer,实现消费者的高可用和负载均衡。如果新的同名消费者实例加入进来,那么它会从其他的同名消费者实例中接管该topic下的部分partition,如果某个实例down了,那么它接管的partition则会被其他同名消费者接管。另外,Kafka的数据有序性只是在单个partition中有序,而在不同的patition之间的数据是无法保证消费的先后顺序的。如果我们需要达到数据消费的有序性,那么可以将partition的数量设置为1,而这样意味着这个topic下的每个group消费实例只能有一个。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180508G07NW800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券