简述
诞生优势使用场景CAP 消息队列Kafka 相关概念Kafka 架构体系
Partition 架构体系Replica 架构体系Consumer Group 架构体系 参考
简述Kafka 是由 Apache 软件基金会开发的一个开源的分布式流处理平台,由 Scala 和 Java 编写。
主要分为两部分功能:
发布订阅模式的消息队列:构造实时流数据管道,可以在系统或应用之间可靠地获取数据,一般用于系统间解耦、异步通信、削峰填谷等用途。Kafka Stream 实时在线流处理:构建实时流式应用程序,对这些流数据进行转换或者影响。 诞生
kafka 最初由 linkedin 公司开发,是为了解决 linkedin 的数据管道问题,起初 linkedin 采用了 ActiveMQ 来进行数据交换,那时的 ActiveMQ 远远无法满足 linkedin 对数据传递系统的要求,经常由于各种缺陷而导致消息阻塞或者服务无法正常访问,为了能够解决这个问题,linkedin 决定研发自己的消息传递系统。linkedin 于 2010 年将 Kafka 贡献给 Apache 基金会并成为顶级开源项目。
优势高吞吐、低延时,即使是非常普通的硬件,也可以支持百万级的消息吞吐量。持久化存储,使用磁盘存储,通过 O(1) 的磁盘数据结构提供消息的持久化,这种结构对于即使数以 TB 的消息存储也能够保持长时间的稳定性能。高可扩展,通过对 Topic 进行分区,可以将消息数据存储到多个 Broker 节点,具备良好的扩展性高容错性,底层基于 Zookeeper,集群中任意一个 Broker 节点宕机,Kafka 依然可以对外提供服务。 使用场景
作为消息系统,与大多数消息系统比较,kafka 有更好的吞吐量,内置分区,副本和故障转移,这有利于处理大规模的消息。可替换传统消息系统,处理异步、解耦、削峰等业务场景日志聚合,从服务器中收集物理日志文件,并将它们放在中央位置(可能是文件服务器或HDFS)进行处理。事件采集,事件采集是一种应用程序的设计风格,其中状态的变化根据时间的顺序记录下来,kafka 支持这种非常大的存储日志数据的场景。指标监控,kafka 也常用于监测数据,将分布式应用程序生成的统计数据集中聚合。流处理 CAP
CAP 指一个分布式系统最多只能同时满足 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性)这三项中的两项。
一致性(C):保证所有节点在同一时间的数据完全一致。可用性(A):保证服务一直可用,而且是正常响应时间。分区容忍性(P):在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
Kafka 底层依赖 Zookeeper,所以也继承了 Zookeeper 的一致性特性,属于 CP 系统。
消息队列本系统只讲解 Kafka 作为消息队列的使用,Kafka Stream 不在范围内,后续会另起系列。
消息队列有两种主要的消息传递模式:
点对点模式:同一条数据至多被消费一次,消费者消费完成后,数据会从队列中删除。
发布-订阅模式:同一条数据可以被多个消费者消费,数据被消费后不会立马删除。Kafka 使用的这种模式。
Kafka 相关概念Producer:消息生产者,向 Kafka 发布消息的客户端。Consumer:消息消费者,负责消费 Kafka 中的消息。Message:消息,消息体由 键、值、时间戳 三部分组成。Broker:Kafka 实例,通常一台机器只安装一个实例,多个实例共同(也可以一个实例)组成 Kafka 集群。Topic:消息主题,逻辑概念,可以理解为消息队列的名称。消息的生产者与消费者面向的都是 Topic。Partition:Topic 分区,物理概念,一个 Topic 拥有多个 Partition,Topic 的数据实际存储在 Partition,Partition 是 Kafka 数据存储的基本单元,每一个 Partition 都是一个顺序的、不可变的消息队列。Replica:Partition 副本,每个 Partition 拥有多个 Replica,其中一个作为 Leader,其它的则作为 Follower,当 Leader 故障时则会选择一个 Follower 上位,成为 Leader。Leader:Partition 主分区,负责数据的读写。Follower:Partition 从分区,Leader 负责写入并广播给所有的 Follower,Follower 与 Leader 保持数据同步。Consumer Group:消费组,每个 Consumer 属于一个特定的 Consumer Group,同一个 Partition 的数据只能被消费组中的某一个消费者消费,同一个消费组的消费者可以消费同一个 topic 的不同分区的数据。 Kafka 架构体系 Partition 架构体系
Kafka 对 Topic 进行了分区,一个 Topic 拥有多个 Partition,生产者向 Topic 发送消息,消息根据一定的规则分配到 Partition,消息实际会存储到 Partition,每个 Partition 在物理上对应一个文件夹,该文件夹下存储这个 Partition 的所有消息和索引文件,Partition 是 Kafka 数据存储的基本单元。
每个 Partition 是顺序的、不可变的消息序列,新的消息不断追加到这个有组织的有保证的日志上。Partition 会给每个消息记录分配一个顺序号(偏移量),能够唯一标识该分区中的每条记录。
顺序性
Kafka 只能保证单个 Partition 内部有序,并不能保证 Topic 整体有序,如果希望 Topic 整体有序,要么设置 Topic 只有一个 Partition,要么设置 路由策略,让需要有序的消息路由到同一个 Partition。
数据保留策略
Kafka 使用硬盘存储消息,前文提到 发布-订阅模式 下,消息被消费并不会删除,但是磁盘大小有限制,不可能永久保留所有数据,因此 Kafka 提供两种可配置的策略删除旧数据
基于时间,默认一个星期基于 Partition 文件大小,默认 1G
Kafka 的性能跟存储的数据量的大小无关,所以将数据存储很长一段时间是没有问题的。
优势
高可扩展:可以通过扩展机器的方式轻松应对日益增长的数据量。
提高写入并发:如果一个 Topic 对应一个文件,那这个文件所在机器 I/O 将会成为这个 Topic 的性能瓶颈。有了 Partition,消息可以并行写入不同 Broker 的 Partition,极大的提高了吞吐率。
提高消费并发:多个消费者可以同时消费不同 Partition 中的消息,提高了消费处理效率。
为保障数据安全性,Kafka 提供了副本机制。每个 Partition 拥有多个副本,其中一个作为 Leader 负责读写功能,其余作为 Follower 负责与 Leader 保持数据同步。当 Leader 发生故障时,Kafka 会在 Follower 中进行选举,重新选择 Leader,保障 Kafka 可用性。
如下图所示,Kafka 集群拥有三个 Broker,创建一个 Topic,设置拥有 3 个 Partition,3 个 Replica,3 个 Partition 分别命名为 P1、P2、P3,红色代表 Leader,绿色代表 Follower。
Consumer Group 架构体系通常 Leader 与 Follower 会分布在不同的 Broker
消费者以消费组(Consumer Group)的名称来标识自己,消费组有两个重要特性:
同一个 Partition 的数据只能被消费组中的某一个消费者消费,防止消息被消费组中的不同消费者重复消费。同一个 Consumer Group 中的 Consumer 可以消费不同的 Partition 中的消息,提升消息端的吞吐量。
下图中,两个服务器的 Kafka 集群具有四个分区(P0-P3)和两个消费群。A消费群有两个消费者,B群有四个。
参考https://kafka.apachecn.org/
https://www.orchome.com/kafka/index



