赞
踩
概述
Kafka是一个分布式的、可分区的、可复制的消息系统。
Kafka特点
①高吞吐量:Kafka每秒可以生产约25万消息(50MB),每秒处理 55 万消息(110 MB)
②持久化数据存储:可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。通过将数据持久化到硬盘以及 replication 防止数据丢失。
③分布式系统易于扩展:所有的 producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。
④ 客户端状态维护:消息被处理的状态是在 客户 端维护,而不是由 服务端维护。减轻服务器端的压力,为客户端会话管理提供了更好的灵活性。
Topic–主题
一个topic是对一组消息的归纳。
在一个Kafka集群中,可以创建多个topic主题,以topic主题为单位管理消息,Kafka中多个topic主题之间是互相隔离、互不影响。
Partition分区
Kafka的topic主题中还可以划分出若干的分区。Kafka以分区为单位对主题中的数据实现多副本并进行分布式存储。利用分区机制保证了每个分区的数据量不会太大,可以在单个服务上保存。分区通过多副本实现了Kafka的负载均衡及失败恢复。另外每个分区可以单独发布和消费,为并发操作topic提供了一种可能。
offset–序号
分区中的每个消息都有一个连续的序列号叫做offset,用来在分区中唯一的标识这个消息。
每个分区都由一系列有序的、不可变的消息组成,这些消息被连续的追加到分区中。在一个可配置的时间段内,Kafka集群保留所有发布的消息,不管这些消息有没有被消费。(可以设置消息的保存策略,指定保存期限,在期限到来之前数据会一直存在,无论是否被消费过,而当保存期限结束,消息会被连续的擦除,释放空间)
这一系列的机制,保证了Kafka中的数据是连续的读写磁盘,保障了性能,从而实现了Kafka的性能和数据量无关,只和磁盘性能相关
Replication–副本
每个分区都可以有若干个副本,这些副本分布式的存放在不同的服务器中,共同处理请求提升性能,并使Kafka具备了容错能力。
为了保证数据的一致性,若干副本中会有一个成为leader负责读写操作,而其他副本成为follower负责同步leader的数据,对外只提供读的能力。
Kafka中不是以broker为单位划分leader,follower,而是以分区副本为单位划分。这样,集群中的每个broker是其持有的一部分分区的leader和另一部分分区的follower,从而将写入的压力分摊在集群上不同broker中,提升性能。
Producer
它会生产数据到指定的topic中,默认采用负载均衡机制随机选择分区,如果需要可以通过特定的分区函数选择分区,指定发布到哪个分区。
Cosumer
在KafKa消费的中默认有两种消费方式:
①发布订阅模式:在这种模式下所有的消费者共享分区中的所有数据,而且各个消费者之间的数据获取互不影响。
②队列模式:在队列模式下各个消费者获取数据是互斥的,互相竞争的。
在生产环境下我们通常混合使用这两种模式。在Kafka中可以将多个消费者组成一个消费者组。在组内,多个消费者处于竞争状态,一个消息只能被组内的一个消费者消费到。在多个组之间,同一份消息会同时被多个消费者组各自消费到,形成共享状态。
Kafka的存储策略
Kafka通过topic分主题存放数据,而topic中又有很多的分区,分区还可以有多个副本。在分区内部,还存在一个个的segment(在分区对应的文件夹下产生的文件)。一个分区会被划分成大小相等的若干segment,既保证了每个分区中不会产生体积过大的文件,又可以基于这些segment文件进行历史数据的删除,从而提高效率。
一个segment由一个**.log文件(存放数据)和一个.index**(索引文件,保存对应的**.log**文件的索引信息)文件组成,这两个文件的命名规则为:partition第一个segment从0开始,后续每个segment文件为上一个segment文件最后一条消息的offset序号值,数值大小为64位,20位数字字符长度,没有数字用0填充。
所以真正开始读取指定分区中某个offset对应的数据时 ,先根据offset和当前分区 的所有segment的名称做比较 ,确定出数据在哪个segment中 ,查找该segment的索引文件 ,确定当前offset在数据文件中的开始位置 ,从该位置开始读取数据文件, 再根据数据格式判断结果 ,最终获取到完整数据。
Kafka的可靠性保证
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。