Kafka是一个分布式消息队列,它将数据分区保存,并将每个分区保存成多份以提高数据可靠性。Kafka是在大数据背景下产生的,用以应对海量数据的处理场景,具有高性能、良好的扩展性、数据持久性等特点。
Kafka架构由生产者、代理和消费者三类组件构成。生产者将数据推送给代理,消费者从代理商拉取数据进行处理,而代理通过ZooKeeper进行协调和管理。生产者和消费者可根据业务需要自定义开发,多个代理构成一个可靠的分布式消息存储系统,避免数据丢失。代理中的消息被划分成若干个主题,同属于一个主题的的所有数据被分成多个分区,以实现负载分摊和数据并行处理。Kafka基本架构如下:
kafka架构Kafka在项目实践中的若干经验分享如下:
分享一:代理
启动Kafka的一个实例就是一个代理,默认端口9092。通过ZooKeeper搭建Kafka集群可以启动多个代理同时对外提供服务,代理不保存任何生产者和消费者状态信息。在实际应用中,建议:每个代理分布在不同的物理机器上。
分享二:主题
主题是存储在kafka中的相同类型的数据集合名称描述,主题包含一个或多个分区。假设kafka运行了3个代理,某个主题划分了3个分区,那么在代理1上,存在分区1(主),分区2(副)、分区3(副),在代理2上,存在分区1(副)、分区2(主)、分区3(副),在代理3上,存在分区1(副)、分区2(副)、分区3(主)。其中,主分区负责读和写操作,副本负责从主分区同步数据,当主分区所在代理出现异常时,通过选举机制重新从其它代理机器上选择主分区。如下图所示:
主题分区在实际应用中,建议:分区的数量不要大于代理服务器的个数,分区数量大于代理个数,会造成同一个代理上出现多个主分区,一旦代理宕机影响较大。
分享三:分区
一个主题可以分成多个分区,相当于把一个数据集合分成多份分别放到不同的分区中存储。在实际应用中,建议:我们知道每个分区都会分为主分区和副本,为了保障系统的高吞吐率,多个主分区一般会分布在不同代理上。
分享四:生产者
使用Kafka提供的二次开发包开发的,生产者将数据转化成消息,并通过网络发送个代理。在实际应用中,建议:kafka生产者采用支持集群技术的框架开发和管理,例如Flume。
分享五:消费者
消费者从Kafka主题中拉取消息,如果一个主题有多个分区,Kafka智能保证一个分区内消息的有序性,在不同的分区之间无法保证。在实际应用中,注意:对于时序数据而言,如果将某个主题下的数据分成了多个分区,可能会造成读取数据的无序。
分享六:消费者组
消费者组是消费者的集合。消费者组内的消费者,对于消息的消费是不会重复的,即同一条消息,只会被其中一个消费者消费,不会被消费者组内两个消费者消费。不同消费者组之间消息消费是重复的。假设消费者组1有两个消费者,那么消费者1负责分区1和分区2中的消息,消费者2负责消费分区3中的消息,二者消息的消费是不会重复的。如下图所示:
消息消费结束语:Kafka是开源的分布式消息队列,能够轻松实现高吞吐、可扩展、高可用,并且部署简单快速、开发接口丰富。目前已经有很多分布式处理系统支持使用Kafka,例如Spark、Storm、Flume等。
网友评论