首页 > 数据库 > 数据库开发技术 > Kafka学习笔记(二)





kafka与其他消息对比,具有诸多优点,例如,支持多个生产者和消费者,基于磁盘进行数据存储,具有灵活伸缩性,低延时,高吞吐等等,生产中一个独立的kafka服务器被称之为broker。单个broker可以轻松处理数千个分区以及每秒百万的消息量。了解kafka,先了解一些kafka的一些概念吧,例如topic,partition(分区),replica(副本)等。



kafka使用Java NIO的ByteBuffer来保存西澳西,消息格式由多个字段组成,大部分为用于管理消息的元数据字段,这部分字段对用户来说完全透明。kafka消息格式经历过几次变迁,分别为V0,V1,V2版本。
消息由消息头部,key,value等组成,其中头部包括消息的CRC码,消息版本号,时间戳等信息。一般了解key,value,TimeStamp这三个字段即可。
Key:消息键,用于对消息做partition,通过Key来决定消息应该被保存在哪个topic下的哪个partition。
Value:消息体,实际的消息数据。
TimeStamp:消息发送时间戳,主要是用于流式处理和其他依赖时间的处理语义,不指定则默认当前时间。
另外,目前kafka支持无压缩,CZIP,Snappy,LZ4等消息压缩类型。


topic是一个逻辑概念,代表一类消息,生产中可以使用topic来区分不同的业务。kafka使用topic-parition-message的三级结构来分散负载,每个topic由若干个partition构成。
partition是不可修改的有序消息序列,每个partition有自己的partition,一般从0开始,kafka只支持在消息序列的尾部追加写入消息。partition上的每条消息会被分配一个唯一的序列号,即位移(offset)。
offset代表了某条消息在某个topic中的某个partition下的位移值。
通过<topic,partition,offset>三元组,可以在kafka中找到唯一对应的消息记录。


分布式系统实现高可靠性的主要机制还是冗余机制,即备份多份副本,以防止数据丢失。kafka中副本分为领导者副本(leader replica)和追随者副本(follower replica),只有领导者副本才能响应客户端发来的消息写入和消息消费请求,追随者副本不能提供服务给客户端,他只是从领导者副本中获取数据并同步,当领导者副本所在的broker宕机,kafka会从剩余的副本中选举新的leader继续提供服务。
kafka会将同一个partition的多个replica分配在不同的broker上面,以此实现服务器数据备份冗余的效果。
ISR全称为in-sync replica,即与leader replica保持同步的replica集合。在kafka中,会为partition动态维护一个replica集合,该集合中所有replica保存的消息日志都与leader replica保持同步,只有该集合中的replica才能被选举为leader,也只有该集合中所有replica都接收到同一条消息,kafka才会将该消息置于已提交状态。
正常情况下,partition中所有的replica都应该与leader replica保持同步,即所有replica都在ISR中,但是可能存在某种原因导致部分replica落后于leader replica的进度,当落后到一定程度后,kafka会将这些replica踢出ISR,当这些replica恢复正常后,kafka会自动将这些replica加回到ISR中。

kafka之所以不使用Java堆内存存储消息而用ByteBuffer,有以下几点:
1).保存相同的消息,使用堆内存至少需要消耗40字节左右,而使用ByteBuffer只需要24字节左右,减少了40%的空间占用,另外,运行Java的操作系统默认开启页缓存机制,在堆上保存的对象可能在页缓存中还需要保留一份。
2).当Kafka broker进程崩溃时,堆内存上的数据也会一并消失,但是页缓存中的数据会依然存在,因此当broker重启后不需要再单独热缓存。
3).使用紧凑二进制字节数组ByteBuffer避开了Java堆上内存分配,可以使Kafka访问多一倍的内存,同时还不用担心GC问题。

kafka的消息交付承诺并不是说所有提交的消息都保证不会丢失,而是保证在ISR存活的情况下已提交的消息不会丢失,需要注意这句话的关键点,ISR存活和已提交,即kafka对于没有提交成功的消息不做任何交付保证,对于提交成功的消息,只要ISR中有一个以上的活着的replica,消息就不会丢失。

kafka的partition和消费者端都有offset的概念,但是这两个是不同的概念,在partition中,offset记录的是消息在partition中的位置,是个不变值,而在消费者端,offset记录的是消费者目前消费的位置,会随着消费进度不断移动,是个变量值。

今天学习了下kafka中的一些相关概念和术语,了解了kafka中的消息存储,topic,partition,replica,ISR等概念,也熟悉了kafka的一些设计理念,其实,实际学习中能感觉到,不同技术的好多底层理念是相通的,你们有这种感觉嘛,例如kafka的ISR理念,与MySQL的一主多从结构某些设计方面是类似的。

END




原文作者:DBA修行之路;如有侵权,请联系管理员删除。