看透kafka(-) kafka数据存储详解(存储速度,高水位,偏移量,LEO,ISR等)

 

kafka   始于linkedIn公司 (scala语言编写),现以捐献给apache基金会

 

总所周知,kafka数据持久化与磁盘。为什么kafka基于磁盘比基于内存还要快。

 

1.kafka的数据文件是二进制文件,相对文本文件要小,减少了很多数据传输,提高了速度

2.kafka是对于磁盘进行顺序读写,避免了磁盘随机写的磁盘寻道的开销

3.kakfa消息再写入磁盘前会先写到操作系统的页缓存,由页缓存映射到磁盘文件。

4.linux近些年对磁盘的优化也做了很多。

 

 

kafka的功能:

作为消息中间件,已经支持Cloudera,Strom,Spark,Flink等分布式处理系统的集成。

kafka作为众多消息中间件却为何如此受青睐,这和它提供的3大功能是分不开的。

 

1.消息系统kafka    实现了大多数消息系统难以实现的消息顺序性保障和回溯消费(offset粒度)。

2.存储系统kafka    消息持久化与磁盘,利用多副本机制,大大降低了数据丢失的风险。

3.流式处理kafka   为很多流式处理框架提供了可靠的数据源的支持。例如SparkStreaming,flink,storm等等。

 

 

体系架构:

 

一个典型的kafka体系架构:{多个producer, 多个broker,多个consumer,一个zookeeper集群}

producer   :  发送消息,俗称生产者。然后将其数据投递到kafka中

consumer  :  接收消息,俗称消费者。连接kafka接收并处理消息

broker       :   kafka的每一个服务代理节点。一个或多个broker组成了一个kafka集群。

 

数据分类:

kafka中的消息以主题(topic)为单位进行分类。

生产者将消息发送到kafka中,发送到kafka的每条消息都要指定一个主题(topic)。消费者进行订阅主题(topic)并进行消费处理。

 

主题与分区:

同一个主题(topic)可以细分多个分区

同一个主题(topic)的不同分区包含的消息是不同的,

分区在存储层可以看作一个可追加的日志(LOG)文件。

同一个主题的不同分区可以在不同的broker上。也就是说,一个主题可以横跨多个broker.

 

有序性:

消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。kafka通过偏移量(offset)可以保证消息在分区内的顺序性。

不过偏移量并不跨越分区,所以说,kafka保证的是数据分区有序而不是主题有序。

 

分区解决的问题:

每一条消息被发送到kafka的broker之前,会根据分区规则选择存储在哪个具体的分区对应的log文件中。如果分区规则设计的合理,所以消息都可以被均匀的分配到不同分区中。如果一个主题值对应一个分区(也就是对应一个文件),那么这个文件所在的机器I/O将会成为这个主题的性能瓶颈。分区就解决了这个问题。

在创建主题的时候可以通过指定的参数来设置分区的个数。当然也可以在主题创建完成之后去修改分区的数量。

 

创建并指定分区数:

kafka-topics --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 1 --topic topicTest

修改分区数:(修改分区只能少变多,不可以多变少)

kafka-topics -zookeeper127.0.0.1:2181 -alter -partitions 24 -topic topicTest

 

负载均衡和高可靠:

kafka为分区引入了多副本(replica)机制。

1.同一分区的不同副本中保存的是相同的消息。

2.一个分区的副本之间是一主多从的关系。分为leader和follower。

3.leader副本负责处理读写请求,follower只负责与leader副本的消息同步。

 

看透kafka(-) kafka数据存储详解(存储速度,高水位,偏移量,LEO,ISR等)_第1张图片

 

 

 

 

 

 

分区副本,AR,ISR,OSR:

分区中的所有副本统称为AR。

所有与leader副本保持一定程度(消息先发到leader副本,然后follower副本才能从leader拉取消息进行同步,同步期间会有一定程度可忍受的滞后)同步的副本(包括leader)组成ISR。

与leader副本同步滞后过多的副本(不包含leader)组成OSR。

AR包含ISR。

AR包含OSR.

OSR+ISR=AR.

 

AR (leader+ follower)= ISR (leader + 保持与leader一定同步的follower) + OSR(与leader同步滞后的follower) 

 

补充:默认情况下,当leader副本发生故障时,在副本中也只有ISR的副本才有资格被再次重新选为leader.

 

 

偏移量offset:

 

在每一个分区之中,当前分区所在的日志中最后一条消息的offset+1 就是该分区的LEO。

 

在该分区的ISR集合之中(也即是该分区的达到一定程度同步的副本),都会维护自身的LEO。

 

看透kafka(-) kafka数据存储详解(存储速度,高水位,偏移量,LEO,ISR等)_第2张图片

 

在每个分区中,都会有一个特定的偏移量,消费者只能拉取到这个offset之前的消息。这个特定偏移量被俗称为 高水位(HW)。

 

看透kafka(-) kafka数据存储详解(存储速度,高水位,偏移量,LEO,ISR等)_第3张图片

HW表示的就是 某个分区的所有ISR中最小的LEO。

如上图,也就是HW为3.  表示消费者只能消费到从0-2的数据。

 

 

 

ISR的方式有效的权衡了数据的可靠性和性能之间的关系。

 

 

你可能感兴趣的:(kafka)