【Kafka】Kafka分布式流式处理平台


本博客文章如无特别说明,均为原创!转载请注明出处:Big data enthusiast(http://www.lubinsu.com/)

本文链接地址:【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:
  1. Producer API:发布流数据到一个或者多个topic
  2. Consumer API:用于订阅一个或者多个topic,并且处理产生的消息
  3. Streams API:作为一个流处理器,有效的将一个输入流转换为一个输出流,也就是将一个或者多个topic的数据处理转换成另一个或者多个topic的数据
  4. Connector API:我们可以通过connector api构建并运行一个可以重复使用的生产者或者消费者,来连接Kafka的topic与应用程序,或者数据系统
  • 概念释义
开头说了这么多,可能大家对一些新的概念还不是很熟悉,这里我们来了解下几个专有名词:
  1. 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集群会根据所配置的时间段将每一条记录持久化在磁盘中。只要消息在指定的时间内还未过期,我们都可以从中消费到它。
  1. 分布式
所有日志的分区,分布在Kafka集群的服务器上,每台服务处理其所负责的partition的数据和请求,每个partition根据配置可以拥有多个副本并分布到不同的服务器上,来达到容错的效果。
每个partition拥有一个leader,并且有0个或者多个follower,leader负责所有的读写,follower负责被动的从leader复制。如果leader失败了,那么其中的follower将会自动转为leader。每台服务器扮演了一部分topic的leader,一部分topic的follower,以此达到负载均衡的效果。
  1. Producer(生产者):Kafka的生产者根据指定的逻辑(如:round-robin),将消息分发到指定topic的partition下
  2. 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消费实例只能有一个。

发表评论

电子邮件地址不会被公开。 必填项已用*标注