Kafka is a distributed,partitioned,replicated commit logservice。
Kafka是一个分布式、分区、复制的提交日志服务。
kafka对消息保存时根据主题(Topic)进行归类,发送消息者成为生产者(Producer),消息接受者成为消费者(Consumer),此外kafka集群有多个kafka实例组成,一个实例就是一个broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性为集群保存一些信息
主题(topic)和分区(partition)
kafka的消息通过主题(topic)来分类,一个主题(topic)可以分成若干个分区(partition),一个分区就是一个提交日志,消息以追加的方式写入分区(如下图所示),然后以先入先出的顺序读取。
一个主题一般包含若干个分区,因此无法在整个主题范围内保证消息的顺序,但是可以保证消息在单个分区的顺序。
kafka通过分区来实现数据冗余和伸缩性。分区可以分布在不同的服务器,也就是说一个主题可以横跨多个服务器,以此提供比单个服务器更强大的性能。
生产者(producer)和消费者(consumer)
生产者(producer)创建消息发布到指定的主题上,生产者默认情况下将消息均衡地分布到主题的所有分区,不关系特定消息被写入到哪个分区;当然消费者也可以指定主题的分区写入。
消费者(consumer)读取消息,订阅一个或者多个主题,并按照消息生成的顺序读取他们,消费者通过检查数据的偏移量(offset)来区分已经读取过的消息。偏移量是一种元数据,是一个不断递增的整数,在创建消息时,kafka会把偏移量添加到消息里面。在给定的分区里,每个消息的偏移量都是唯一的。消费者把每个分区最后读取的消息偏移量保存在zookeeper或者kafka上,如果消费者关闭或者重启他的读取状态不会丢失。
消费者是消费者群组(consumer group)的一部分,也就是说会有一个或者多个消费者共同读取一个主题。群组保证每个分区只能被一个消费者使用(如下图所示),通过这种方式消费者可以消费一个大量消息的主题,如果一个消费者失效,其他的消费者可以接管这个失效的消费者的工作。
broker和集群
一个独立的kafka服务器被称为broker。broker接收生产者的消息,为消息设置偏移量,并且提交消息到磁盘保存。broker为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息,硬件支持的情况下,单个broker可以轻松处理数千个分区以及每秒百万级的消息量。
broker是集群的组成部分,每个集群都有一个broker同时充当了集群控制器的角色(自动从活跃的成员中选举出来)。控制器负责管理工作,包括将分区分配给broker和监控broker。在集群中,一个分区从属于一个broker,该broker被称为分区的首领(leader)。一个分区可以分配给多个broker,这个时候会产生分区复制(如下图所示)。这种复制机制为分区提供了消息冗余,如果有一个broker失效,其他broker可以接管领导权。
保留策略:kafka broker默认的消息保留策略要么是保留一段时间,要么保留到数据达到一定大小,当消息上限达到这些要求时,旧消息会被删除,所以根据配置消息不会无限增长保留。主题也可以单独配置自己的保留策略。
多集群
如果使用多个数据中心,就需要在他们之间复制消息,但是kafka的消息复制机制只能在单个集群里进行,不能在多集群中进行。
kafka提供了一个叫做MirrorMaker的工具,可以用来实现集群中的消息复制,MirrorMaker的核心组件包含一个生产者和消费者,两者间通过一个队列相连,这个消费者从一个集群读取消息,生产者把消息发送到另外一个集群上(如下图所示)。