前言
kafka属于分布式的消息引擎系统,主要功能是提供一套完备的消息发布与订阅解决方案。
消息和批次
- kafka 的数据单元被称为消息。消息由字节数组组成,对kafka来说,消息里的数据没有特殊的格式或含义。消息可以有一个可选的元数据,也就是键。键也是一个字节数组,与消息一样,对kafka来说没有特殊含义。当需要以一种可控的方式将消息写入不同的分区时,需要用到键。最简单的例子就是为键生成一个一致性哈希值,然后用哈希值对主题分区数进行取模,为消息选取分区。这样可以保证具有相同键的消息总是会被写到相同的分区中(前提是分区数量没有发生变化)。
- 为了提高效率,消息会被分成批次写入 Kafka。批次包含了一组属于同一个主题和分区的消息。
主题和分区
- 在kafka中,发布订阅的对象是Topic(主题),可以为每个业务、每个应用甚至每类数据都创建专属的主题。
- 主题可以被分为若干个分区,一个分区就是一个提交日志。消息会以追加的方式被写入分区,然后按照先入先出的顺序读取。
- 由于一个主题一般包含几个分区,因此无法在整个主体范围内保证消息的顺序,但可以保证消息在单个分区内是有序的。
- kafka使用消息日志(Log)来保存数据,一个日志就是硬盘上一个只能追加写(Append Only)消息的物理文件。因为只能追加下,因此避免了缓慢的随机IO操作,改为性能较好的顺序写操作。
- 一条日志被细分为多个日志段(LogSegment),消息被追加写到最新的日志段中。当写满一个日志段后,kafka自动切分出一个新的日志段,并封存老的日志段。
- kafka在后台会定期检查老的日志段能否被删除。
- kafka通过分区来实现数据的冗余和伸缩。分区可以分布在不同的服务器上,也就是说,一个主题可以横跨多台服务器,以此来提供比单台服务器更强的性能。
- 分区可以被复制,相同分区的多个副本可以保存在多台服务器上,以防其中一台服务器发生故障。
- 我们通常会使用流这个词来描述kafka这类系统中的数据。
生产者和消费者
- 向主题发布消息的客户端称为生产者,生产者通常持续不断地向一个或多个主题发送消息。默认情况下,生产者会把消息均衡地分布到主题的所有分区中。不过,在某些情况下,生产者会把消息直接写入指定的分区,这通常是通过消息键和分区器来实现的。
- 分区器会为键生成一个哈希值,并将其映射到指定的分区,这样可以保证包含同一个键的消息被写入同一个分区。
- 订阅主题读取消息的客户端被称为消费者。
- 生产者向分区写入消息,每条消息在分区中的位置信息由一个叫偏移量(Offset)的数据来表征。分区偏移量总是从0开始。消费者通过检查消息的偏移量来区分消息是否已读取。
- 消费者组,指的是多个消费者实例共同组成一个组来消费一组主题。这组主题中的每个分区都只会被组内的一个消费者实例消费,其它消费者实例不能消费它。
- 假设消费者组内的一个实例挂了,kafka会自动将Failed实例之前消费的数据转移给其它活着的消费者,此机制称为“重平衡”。
broker和集群
- 一个单独的kafka服务端被称为broker。broker 会接收来自生产者的消息,为其设置偏移量,并提交到磁盘保存。broker 会为消费者提供服务,对读取分区的请求做出响应,并返回已经发布的消息。
- 多个broker组成了集群。每个集群都有一个同时充当集群控制器角色的broker(自动从活动的集群成员中选举出来)。控制器负责管理工作,包括为broker分配分区和监控broker。
- 备份(Replication)是把相同的数据拷贝到多台机器上,这些相同的数据称为副本(replica)。
- kafka定义了两类副本:领导者副本(leader replica)和追随者副本(follower replica)。前者对外提供与客户端交互的服务,后者只被动同步领导者副本的数据,不提供与客户端交互的服务。生产者总是向领导者副本写消息,消费者总是从领导者副本读消息。追随者副本总是向领导者副本发送请求,领导者把消息同步给追随者。
- 在集群中,一个分区从属于一个broker,这个broker被称为分区的领导者。一个被分配给其它broker的分区副本叫作这个分区的追随者。
- 所有想要发布消息的生产者必须连接到领导者,但消费者可以从领导者或者追随者那里读取消息。
补充
- kafka不只是一个消息引擎系统,也是一个流处理平台。
- broker默认的消息保留策略是这样的:要么保留一段时间,要么保留消息总量达到一定的字节数。当消息数量达到这些上限时,就消息就会过期并被删除。主题可以设置自己的保留策略。我们可以把主题配置成紧凑型日志,只有最后一条带有特定键的消息会被保留下来。
- kafka为多集群提供了一个叫作mirrormaker的工具,用于将一个集群的数据同步给另一个集群。
参考
- 极客时间 - kafka核心技术与实战 - 胡夕
- kafka权威指南