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副本的消息同步。
分区副本,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。
在每个分区中,都会有一个特定的偏移量,消费者只能拉取到这个offset之前的消息。这个特定偏移量被俗称为 高水位(HW)。
HW表示的就是 某个分区的所有ISR中最小的LEO。
如上图,也就是HW为3. 表示消费者只能消费到从0-2的数据。
ISR的方式有效的权衡了数据的可靠性和性能之间的关系。