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-test
partition为1,一个topic名为alex-test2
partition为2。__consumer_offsets-*
文件是已经被消费的message。
消费顺序
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:选举方式原理、性能优化等待完善