Kafka世界中有很多概念和术语是需要提前理解并掌握的, 这对于后续学习Kafka的各种功能和特性将大有裨益.
Kafka属于分布式的消息引擎系统, 它的主要功能是提供一套完备的消息发布与订阅解决方案.
在Kafka中, 发布订阅的对象是主题(Topic), 你可以为每个业务、每个应用甚至是每类数据都创建专属的主题.
向主题发布消息的客户端应用称为生产者(Producer), 生产者程序通常持续不断地向一个或多个主题发送消息, 而订阅这些主题的客户端应用称为消费者(Consumer). 和生产者类似, 消费者也能够同时订阅多个主题的消息. 我们把生产者和消费者统称为客户端(Clients).
有客户端自然就有服务端. Kafka服务端由被称为Broker的服务进程构成, 即一个Kafka集群由多个Broker组成, Broker负责接收和处理客户端发送过来的请求, 以及对消息进行持久化.
实现高可用的方式,
其一不同的Broker部署在不同的机器上, 如果集群中某个机器宕机, 即使它上面运行的所有Broker进程都挂了, 其他机器上的Broker也依然能够对外提供服务.
另一个手段就是备份机制(Replication). 把相同的数据拷贝到多台机器上, 而这些数据拷贝在Kafka中被称为副本(Replica).Kafka定义了两类副本: 领导者副本(Leader Replica) 和 追随者副本(Follower Replica). 前者对外提供服务, 后者只是被动地追随领导者副本, 不会对外提供服务.
副本的工作机制很简单: 生产者总是向领导者副本写消息; 而消费者总是从领导者副本读消息. 至于追随者副本, 它只做一件事: 向领导者副本发送请求, 请求领导者把最新生产的消息发送给它, 这样它能够保持与领导者的同步.
虽然有了副本机制可以保障数据的持久化不丢失, 但没有解决伸缩性的问题. 伸缩性即所谓的Scalability, 是分布式系统中非常重要必须要严谨对待的问题.
Kafka通过分区机制(Partitioning)来实现其伸缩性. 如果你了解其他分布式系统, 你可能听过分片、分区域等提法, 如MongoDB和ES中的Sharding, HBase中的Region, 其实它们都是相同的原理, 只是Partitioning是最标准的名称.
Kafka中的分区机制指的是将每个主题划分成多个分区(Partition), 每个分区是一组有序的消息日志.生产者生产的每条消息只会发送到一个分区中.
Kakfa的三层消息架构:
- 第一层是主题层, 每个主题可以配置M个分区, 而每个分区又可以配置N个副本.
- 第二层是分区层, 每个分区的N个副本中只能有一个充当领导者角色, 对外提供服务; 其他N-1个副本是追随者副本, 只提供数据冗余之用.
- 最后, 客户端程序只能与分区的领导者副本进行交互.
Kafka Broker是如何持久化数据的. 总的来说, Kafka使用消息日志(Log)来保存数据, 一个日志就是磁盘上一个只能追加写(Append-only)消息的物理文件. 因为只能追加写入, 故避免了缓慢的随机I/O操作, 改为性能较好的顺序I/O写操作, 这也是实现Kafka高吞吐量的一个重要手段. 不过如果不停地向一个日志写入消息, 最终也会耗尽所有的磁盘空间, 因此Kafka必然要定期删除消息以回收磁盘. 怎么删除呢? 简单来说就是通过日志段(Log Segment)机制, 在Kakfa底层, 一个日志又进一步细分成多个日志段, 信息被追加写到当前最新的日志段中, 当写满了一个日志段后, Kafka会自动切分成一个新的日志段, 并将老的日志段封存起来. Kafka在后台还有定时任务会定期检查老的日志段是否能够被删除, 从而实现回收磁盘空间的目的.
结语
- 消息: Record. 消息是Kafka处理的主要对象.
- 主题: Topic. 主题是承载消息的逻辑容器, 在实际使用中多用来区分具体的业务.
- 分区: Partition. 一个有序不变的消息序列. 每个主题下可以有多个分区.
- 消息位移: Offset. 表示分区中每条消息的位置信息, 是一个单调递增切不变的值.
- 副本: Replica. 进行数据冗余.
- 生产者: Producer. 向主题发送新消息的应用程序.
- 消费者: Consumer. 从主题订阅新消息的应用程序.
- 消费者位移: Consumer Offset. 表征消费者消费进度.
- 消费者组: Consumer Group. 多个消费者实例共同组成的一个组, 同时消费多个分区以实现高吞吐.
此文章为3月Day15学习笔记, 内容来源于极客时间《Kafka核心技术与实战》, 强烈推荐该课