目录
1、关于Kafka你知道这些术语么?
2、Kafka如何存储数据?
3、kafka扑街了,如何保证高可用?
4、Kafka如何做到数据不丢失?
又是烟雨蒙蒙的冬日,一杯暖茶,春天的气息已经在杯中袅袅升起的热气里荡漾开来,茶醇使人醉,技术要学会。我们来简单剖析一下kafka的一些原理特性。
1、关于Kafka,你知道这些术语吗?
Kafka在消息处理领域能独步天下,自然离不开他优良的架构设计,我们先来看看在Kafka的领域里有哪些组件和概念,下面是一些枯燥的名词解释,如果已经掌握,可以帮忙看看是否正确解释了。
Topic,顾名思义,主题的意思。可以理解为是对某一类型的消息的标识,kafka处理的消息集按照Topic分类,相当于逻辑上的一个消息消息集合。
Partition,分区,数据分区,数据分片,这是物理存储上的分组,每一个Topic可能对应多个分片,比如Topic为Order的消息需要存放5TB的数据到磁盘,如果分配5个Partition,每个partition就是1TB的数据。
一直在说kafka是分布式,高可靠的消息系统,那么这里就有所体现,多个Partition可以分散在不同的服务器上,将数据存储到不同服务器的磁盘上。
Broker,Kafka是可以分布式部署集群,集群中多台服务器,每台部署一个Kafka进程,这个Kafka进程就称之为Broker。
Message,消息,Kafka世界里的通信的基本单位,生产者和消费者基于Topic进行消息的流转。
Producers,消息或者数据的生产者,可以选择向Kafka的某个主题的某个分区发送消息。
Consumers,消息或者数据的消费者,可以从多个topics接受并处理消息,一个topic的数据可以被多个Consumer接收处理。
这图中大概画了几个组件的样子,简单的说他们之间的关系:一个Broker是一个Kafka进程,一个Broker有多个Topic,一个Topic可能有多个分区的。
02 Kafka如何存储数据?
我们知道Kafka是基于磁盘持久化存储的高可靠的消息系统。每次往一个Topic写入一条消息,就会定位到一个Partition上,相当于是写到磁盘上的一个日志文件,并且将消息追加写入到日志文件中。
消息会被封装到一个log entry,每一个日志条目都包含一个offset,消息大小和消息内容。offset是有序的,代表了在日志文件中的顺序,是唯一标记此消息的标识。Kafka是基于NIO的ByteBuffer来进行序列化成二进制进行存储,这样子也是最大化的保证存储的紧凑,节省磁盘的空间。
而Kafka的消息结构设计也随着版本的升级,有很多变化,正是因为对消息结构的优良设计,从而做到了存储紧凑,节省磁盘的存储空间。消息的格式是这样子滴:
消息格式设计的演变,也可以看出,通过引入RecordBatch,加上字段可变长度的消息体来节省磁盘空间,提高序列化的速度。V2版本里面时间戳增量,offset的增量也通过使用增量差值来节省存储的字节数。
上面也说了,每次消息发送到kafka,就会根据一定规则路由到某个Partition,并追加到磁盘的某个人日志文件的偏移量为offset的位置。
可以从图中看出,每一个Topic都是分散存储的,也就是多个Partition,在分布式集群部署下,TB级别数据实现扩容存储,分布式存储。
03 Kafka扑街了,如何保证高可用?
此时,如果kafka宕机了,从我们前面一直分析的来说,那我们将会丢失一个Topic下的某个Partition里的数据,这个问题就很严重了,数据丢失一向是架构设计里很重视的一个问题。所以Kafka是对所有的Partition做了多副本冗余的。
并且,将每个Partition的副本都是放到其他机器上,假设一个Partition有三个副本,kafka还会借助zookeeper选举出一个leader Partition,这个leader partition就是这个partition负责对外提供读写的服务。其他的follower partition 会定时同步数据。
假设此时leader partition宕机了,zookeeper会感知到,并且会在kafka集群选举出新的leader partition提供服务,新的leader partition拥有之前同步到的所有数据,通过这样的多副本冗余机制加上主从模式,宕机选主,就可以实现高可用啦。
04 kafka如何做到数据不丢失?
通过多副本冗余机制,我们可以实现高可用性,但是细思一番,上文中有这样一种场景,假如leader所在进程宕机了,此时数据还没有被follower同步,那么当follower选举成leader之后,此处就会丢失部分没有同步到的数据,这样子真是蛋疼了。
这里我们关注一个新的名字 ISR (in sync replicas),副本同步队列。每一个leader都维护一份ISR列表,列表中存放的是当前所有和leader partition 数据同步,保持一致的follower partition。
kafka要保证数据不丢失,那么每一个leader的ISR列表中必须至少要存在一个follower partition,那么当kafka写入数据的时候,必须是确保复制给了所有的ISR列表中的所有的follower partition,这样才能算写入成功。由此,就能保证数据不会在重新选主的时候丢失部分数据。
05 还有很多很多要去研究
Kafka是一款很优秀,很值得学习的工业级消息中间件,本文只是浅谈了他的一些基础概念和原理,还需要花费很多时间去研读他,文中有出现错误,欢迎小伙伴指正。谢谢大家。