Kafka创建背景Kafka是LinkedIn最初开发的消息系统,作为LinkedIn的ActivityStream和操作数据处理管道(Pipeline)的基础。它现在被许多不同类型的公司用作多种类型的数据管道和消息传递系统。活动流数据是几乎所有网站在报告其网站使用情况时都会使用的数据中最常见的部分。活动数据包括页面浏览量(PageViews)、有关查看的内容和搜索的信息。这类数据的处理方式通常是先将各种活动以日志的形式写入某种文件,然后周期性地对这些文件进行统计分析。运行数据是指服务器性能数据(CPU、IO使用率、请求时间、服务日志等)。运营数据的统计方法多种多样。近年来,事件和操作数据处理已成为网站软件产品功能的重要组成部分,需要稍微复杂的基础架构来支持它。Kafka简介Kafka是一个分布式的、基于发布/订阅的消息系统。主要设计目标如下:提供时间复杂度为O(1)的消息持久化能力,即使对于TB级别以上的数据,也能保证时间复杂度恒定的访问性能。高吞吐量。即使在非常便宜的商用机器上,单台机器也可以支持每秒超过100K条消息的传输。支持KafkaServer之间的消息分区和分布式消费,同时保证消息在各个Partition中的顺序传输。支持离线数据处理和实时数据处理。Scaleout:支持在线水平扩展。Kafka基本概念概念一:生产者和消费者对于Kafka来说,有两种基本的客户端类型:生产者和消费者。此外,还有用于数据集成的KafkaConnectAPI、用于流处理的KafkaStreams等高层客户端,但这些高层客户端的底层仍然是生产者和消费者API,它们只是在上层制作的包裹。很容易理解,生产者(也称为发布者)创建消息,消费者(也称为订阅者)负责消费或阅读消息。概念二:Topic和Partition在Kafka中,消息按照topic进行分类,每个topic对应一个“消息队列”,有点类似于数据库中的一张表。但是如果我们把所有同类的消息都放到一个“中央”队列中,就不可避免地缺乏可扩展性。无论是生产者/消费者数量的增加,还是消息数量的增加,都可能会耗尽系统或存储的性能。我们举一个日常生活中的例子来说明:现在A市生产的一种商品需要通过公路运到B市,那么单车道高速公路到底是“增加了A市的商品数量”还是“现在也增加了A市的商品数量”。在C市运送东西到B市的情况下,就会出现“吞吐量不足”的问题。所以我们现在引入分区(Partition)的概念,类似于“让更多的道路被修建”的方式来完成我们主题的横向扩展。概念三:Broker和Cluster(集群)一个Kafka服务器也称为Broker,它接受生产者发送的消息,并将其存储在磁盘上;Broker还服务于消费者拉取分区消息的请求,并返回当前提交的消息。使用特定的机器硬件,Broker可以每秒处理数万个分区和数百万条消息。(现在是百万量级。。我查了一下,好像集群情况下吞吐量真的很高。。按。。)几个Broker组成一个集群(Cluster),集群中的一个Broker会成为集群控制器(ClusterController),负责管理集群,包括为Broker分配分区,监控Broker故障等。在集群中,一个partition负责一个Broker,也称为partition的leader;当然也可以将一个partition复制到多个Broker来实现冗余,这样当有一个Broker出现故障时,可以将其partition重新分配给其他Broker负责。下图是一个例子:Kafka的一个关键特性是日志保留。我们可以配置主题的消息保留策略,比如只保留一定时间的日志或者只保留特定大小的日志。当超过这些限制时,旧消息将被删除。我们也可以为一个topic单独设置消息过期策略,这样可以针对不同的应用进行个性化设置。概念四:多集群随着业务的发展,我们往往需要多集群,通常有以下几个原因:基于数据的隔离;基于安全的隔离;多数据中心(容灾)在建设多数据中心时,往往需要实现消息互通。例如,如果用户修改了个人数据,无论后续请求由哪个数据中心处理,都需要反映这种更新。或者,需要将来自多个数据中心的数据汇聚到一个总控中心进行数据分析。上面提到的分区复制冗余机制只适用于同一个Kafka集群内。对于多个Kafka集群的消息同步,可以使用Kafka提供的MirrorMaker工具。本质上,MirrorMaker只是使用队列连接的Kafka消费者和生产者。它使用来自一个集群的消息并向另一个集群生成消息。
