一.概述
1.1 Kafka简介
Kafka是一个分布式,分区,多副本,多订阅者,基于Zookeeper协调的分布式日志系统,也可以是消息系统。常见可以用于web/nginx日志,访问日志,消息服务等。
主要设计目标有:
-
以时间复杂度为o(1)的方式提供消息持久化能力,即使对TB级以上的数据也能保证常数时间的访问性能
-
高吞吐率。即使在廉价的机器上也能做到支持每秒100K消息的传输
-
只是Kafka Server间的消息分区,及分布式消费,同时保证每个partition 内消息顺序传输
-
同时支持离线数据处理和实时消息处理。
Kafka主要有两大应用场景:
-
消息队列:建立实时流数据管道,以可靠地在系统或应用程序之间获取数据
-
数据处理:构建实时的流数据处理程序来转换或处理数据流
1.2 消息系统概述
一个消息系统负责将数据从一个应用传递到另一个应用中,应用只需关注数据,无需关注数据在两个或多个应用之间如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。有两种消息传递模式:
点对点消息传递模式:消息持久化一个队列中,此时,将有一个或者多个消费者消费队列中的数据。但是一条消息只能被消费一次,当一个消费者消费了队列中的某条数据之后,该条数据则从消息队列中被删除。该模式即使有多个消费者同时消费数据,也能保证数据处理的数据。
发布订阅消息传递模式:消息被持久化一个topic中。消费者可以订阅一个或多个topic,消费可以消费该topic中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除。在发布订阅模式,消息生产者称为发布者,消费者称为订阅者。
1.3 优点
- 解耦
- 冗余
- 扩展性
- 灵活性&峰值处理能力
- 可恢复性
- 顺序保证
- 缓冲
- 异步通信
二.Kafka基础架构
- broker:Kafka集群中包含一个或多个服务器,服务器节点称为broker,这个也可以看做Kafka的一个实例。
- topic:每条发布到Kafka集群的消息都有一个类别,这个类别就是topic(物理不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上单用户只需要指定消息的topic即可生产或者消费数据而不必关系数据存储在哪个位置)
- partition:topic中的数据被划分成一个多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition数据是有序的,不同partition间数据丢失了数据的顺序,如果topic中有多个partition,消费数据时就不能保证数据之间的有序性。
(broker存储topic数据。如果topic有N个partition,集群有N个broker,那么每个broker存储该topic中的一个partition;如果该topic有N个partition,集群有N+M个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储;如果某topic中有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition,在实际生产环境中,尽量避免这种情况的发生,这种情况会导致Kafka集群数据不均衡)
为了使得Kafka的吞吐率可以线性提高,物理可以把topic分为一个或多个partition,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件。创建一个topic时,可以指定一个partition。
Kafka会为每一个consumer gropu保存一些metadata信息——当前消费的消息的partition,也就是offset。这个offset由consumer控制,所以broker是无状态的,不需要标记哪些消息是被消费过的,也不需要通过brokser去保证同一个consumer group只有一个consumer能消费某一条消息,因此也不需要锁机制。
- producer:生产者即数据的发布者,该角色将消息发布到Kafka的topic中
- consumer:消费者可以从broker中读取数据。消费者可以消费多个topic中的数据
- consumer group:每个consumer属于一个特定的consumer group。同一个topic中的一条消息只能被同一个consumer group中的一个consumer消费,但多个consumer group可同时消费这一消息。
- leader:每个partition有多个副本,其中有且一个作为leader,leader是当前负责数据读写的partition
- follower:follower追随leader,所有写请求通过leader,数据变更会广播给所有follower,follower与leader保持数据同步。如果leader失败,则会从follower中选举出一个新的leader。当follower与leader挂掉,卡住或者同步太慢,leader会把这个follower从ISR中删除,重新创建。
三.Kafka delivery guarantee
-
At most once:消息可能丢失,但是绝对不重复传输
-
At least once:消息绝对不会丢失,但是很有可能重复传输
-
Exactly once:每条数据肯定会被传输一次且仅传输一次
Kafka默认保证At least once,并且允许通过设置Producer异步提交来实现At most once。