Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica)、多订阅者,基于zookeeper协调的分布式消息系统,可以实时的处理大量数据以满足各种需求场景。常见于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

使用场景

  • 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种 consumer,例如hadoop、Hbase、Solr等。
  • 消息系统:解耦和生产者和消费者、缓存消息等。
  • 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到 hadoop、数据仓库中做离线分析和挖掘。
  • 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反 馈,比如报警和报告。

Message

名称

解释

Broker

消息中间件处理节点,一个节点就是一个Broker,一个或多个Broker可以组成一个Kafka集群

Topic

Kafka根据Topic对消息进行归类,发布到Kafka的每条消息都需要指定一个Topic

Producer

消息生产者,向Broker发送消息的客户端

Consumer

消息消费者,从Broker读取消息的客户端

ConsumerGroup

每个Consumer属于一个特定的ConsumerGroup,一条消息可以被多个不同的ConsumerGroup消费 ,但是一个ConsumerGroup中只有一个Consumer能消费该消息

Partition

物理概念,一个Topic可以分为多少个partition,每个partition内消息是有序的

  • Topic:Topic是一个类别的名称,同类消息发送到同一个Topic下面。对于每一个Topic,下面可以有多个分区(Partition)日志文件。
  • Partition:topic内部划分多个partition来分片存储数据,不同的partition可以位于不同的机器上,每台机器上都运行一个Kafka的进程Broker.
  • Producer:生产者将消息发送到topic中去,同时负责选择将message发送到topic的哪一个partition中。通过 round-­robin 做简单的负载均衡。也可以根据消息中的某一个关键字来进行区分。通常第二种方式使用的更多。
  • Consumer :传统的消息传递模式有2种:队列(queue模式:多个consumer从服务器中读取数据,消息只会到达一个consumer) 和(publish-subscribe模式:消息会被广播给所有的consumer)。Kafka基于这2种模式提供了一种consumer的抽象概念: consumer group 。
  • queue模式:所有的consumer都位于同一个consumer group 下。
  • publish-subscribe模式:所有的consumer都有着自己唯一的consumer group。

注意:每个partition,都对应一个commit log文件。一个partition中的message的offset都是唯一的,但是不同的partition中的message的offset可能是相同的。当一个partition被消费时,文件不会被删除,每个consumer会维护自己在commit log中的消费进度,当文件到达指定时间才会被删除。
时间可以通过以下参数进行配置:

# The minimum age of a log file to be eligible for deletion due to age
log.retention.hours=168

如下图所示:创建了一个topic名为alex-testpartition为1,一个topic名为alex-test2partition为2。__consumer_offsets-*文件是已经被消费的message。

springboot 用国产中间件_zookeeper

消费顺序

Kafka比传统的消息系统有着更强的顺序保证。

一个partition同一个时刻在一个consumer group中只有一个consumer instance在消费,从而保证顺序 。 consumer group中的consumer instance的数量不能比一个Topic中的partition的数量多,否则,多出来的consumer消费不到消息。

Kafka只在partition的范围内保证消息消费的局部顺序性,不能在同一个topic中的多个partition中保证总的消费顺序性。

如果有在总体上保证消费顺序的需求,那么我们可以通过将topic的partition数量设置为1,将consumer group中的consumer instance数量也设置为1。

Kafka集群

集群模式下一些参数说明

[root@VM_0_8_centos kafka_2.11-1.1.1]# bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 3 --topic kafka-cluster-test
Created topic "kafka-cluster-test".
[root@VM_0_8_centos kafka_2.11-1.1.1]# bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic kafka-cluster-test
Topic:kafka-cluster-test	PartitionCount:3	ReplicationFactor:3	Configs:
	Topic: kafka-cluster-test	Partition: 0	Leader: 0	Replicas: 0,1,2	Isr: 0,1,2
	Topic: kafka-cluster-test	Partition: 1	Leader: 1	Replicas: 1,2,0	Isr: 1,2,0
	Topic: kafka-cluster-test	Partition: 2	Leader: 2	Replicas: 2,0,1	Isr: 2,0,1

如上述命令所示:创建了一个副本数为3(replication-factor副本数不能大于broker数,否则会报错)分区数为3名为kafka-cluster-test的topic。查看topic时除了打印出来了一些Topic的基本信息外,还有一些其他信息。

  • leader:表示当前partition的leader是哪个broker,leader节点负责给定partition的所有读写请求。
  • replicas: 表示某个partition在哪几个broker上存在备份。不管这个几点是不是leader,甚至这个 节点挂了,也会列出。
  • isr: 是replicas的一个子集,它只列出当前还存活着的,并且已同步备份了该partition的节点。

TODO:选举方式原理、性能优化等待完善