kafka是一款基于发布与订阅的消息系统。它一般被称为“分布式提交日志”或者“分布式流平台”。文件系统或者数据库提交日志用来提供所有事物的持久化记录,通过重建这些日志可以重建系统的状态。同样地,kafka的数据是按照一定顺序持久化保存的,可以按需读取。
一个典型的Kafka集群包含若干个Producer(生产者)、若干个broker、若干个消费者组Consumer Group以及一个Zookeeper集群
Kafka通过Zookeeper管理集群的配置信息,Producer通过push模式将消息发布到broker,Consumer通过pull模式从broker订阅并消费消息
Brokers 就是kafka服务器
每一个节点就是Brokers(代理) 加入有10个节点就是10个Brokers
Producer和Consumer 理解为应用程序
上面的图有两个Topic,分别Topic1和Topic2
Topic有两个分区,一个是Partition1和Partition2
一个Topic对应很多Partition,在Partition当中选取一个Partition作为老大就是leader,其余Partition作为follower
producer和comsuimer 只是跟leader做交互
topic:每条发不到kafka集群的消息都有一个类别,这个类别被称为topic,生产者将消息发送到特定的主题,消费者订阅该主题或者主题的分区来进行消费,逻辑上一个topic的消息虽然保存于一个或者多个broker上面,但用户只需要指定消息的topic即可生产或者消费数据,而不必关系数据存放于何处
简单意思:生产者吐到topic里面,消费者在从topic里取出数据
在创建topic的时候,指定topic对应几个分区,每个分区对应几个副本
Partition(分区): 每个Topic包含一个或者多个Partition,每个分区由一系列有序的、不可变的消息组成,是一个有序的队列。每个分区在物理上对应的一个文件夹,分区的命名规则为主题-分区编号,分区编号从0开始,表示第一个分区
Segment:partition物理上由多个segment组成。
Producer:生产者向broker发送消息的用户的应用程序,即发送消息的客户端
Consumer:消费者是从broker获取消息的用户的应用程序,消费者通过拉的方式获取数据,每个消费都属于一个特定的消费者组
Consumer Group: 同一个主题的消息只能被消费者组中的一个消费者消费,但不同消费者组中的消费者可以消费这条数据
replication:每个分区有一个或者多个副本,并且分布在集群不同的broker上面,保证分区的高可用
引入Replication之后,同一个Partition可能会有多个Replica,而这时需要在这些Replication之间选出一个Leader,Producer和Consumer只与这个Leader交互,其它Replication作为Follower从Leader中复制数据。
leader、follower:kafka会选择分区内的一个副本作为leader副本,而其他副本作为follower副本,只有leader副本才能处理读写请求,即producer和consumer只跟leader副本交互,follower副本只是从leader上复制数据
leader和follower是谁选举出来的是controller控制器选举出来
controller:controller其实就是一个broker,只不过它除了具有一般broker的功能之外,还负责分区leader的选举
有两个消费组,一个是comsuimer gour1 和 comsuimer gourp2
二、Kafka的特点
同时为分布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万条消息(50MB),每秒处理55万条消息(110MB)这里说条数,可能不上特别准确,因为消息的大小可能不一致;
可进行持久化操作,将消息持久化到到磁盘,以日志的形式存储,因此可用于批量消费,例如ETL,以及实时应用程序。 通过将数据持久化到硬盘以及replication防止数据丢失。
分布式系统,易于向外拓展。所有的Producer、broker和consumer都会有多个,均为分布式。无需停机即可拓展机器。
消息被处理的状态是在consumer端维护,而不是由server端维护,当失败时能自动平衡。
3、Kafka的核心概念
名词 | 解释 |
Producer | 消息的生成者 |
Consumer | 消息的消费者 |
ConsumerGroup | 消费者组,可以并行消费Topic中的partition的消息 |
Broker | 缓存代理,Kafka集群中的一台或多台服务器统称broker. |
Topic | Kafka处理资源的消息源(feeds of messages)的不同分类 |
Partition | Topic物理上的分组,一个topic可以分为多个partion,每个partion是一个有序的队列。partion中每条消息都会被分 配一个 有序的Id(offset) |
Message | 消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息 |
Producers | 消息和数据生成者,向Kafka的一个topic发布消息的 过程叫做producers |
Consumers | 消息和数据的消费者,订阅topic并处理其发布的消费过程叫做consumers |
3.1 Producers的概念
- 消息和数据生成者,向Kafka的一个topic发布消息的过程叫做producers
- Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于round-robin方式或者通过其他的一些算法等;
- 异步发送批量发送可以很有效的提高发送效率。kafka producer的异步发送模式允许进行批量发送,先将消息缓存到内存中,然后一次请求批量发送出去。
3.2 broker的概念:
- Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。
- Broker不保存订阅者的状态,由订阅者自己保存。
- 无状态导致消息的删除成为难题(可能删除的消息正在被订阅),Kafka采用基于时间的SLA(服务保证),消息保存一定时间(通常7天)后会删除
- 消费订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息
3.3 Message组成
Message消息:是通信的基本单位,每个producer可以向一个topic发布消息。
Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的,每个topic又可以分成不同的partition每个partition储存一部分
partion中的每条Message包含以下三个属性:
offset | long |
MessageSize | int32 |
data | messages的具体内容 |
3.4 Consumers的概念
消息和数据消费者,订阅topic并处理其发布的消息的过程叫做consumers.
在kafka中,我们可以认为一个group是一个“订阅者”,一个topic中的每个partions只会被一个“订阅者”中的一个consumer
消费,不过一个consumer可以消费多个partitions中的消息
注:
Kafka的设计原理决定,对于一个topic,同一个group不能多于partition个数的consumer同时消费,否则将意味着某些consumer无法得到消息
Kafka 中各种分配策略