kafka 初见 (Meet Kafka)
在讨论Kafka 细节之前,有必要先来了解下消息发布/ 订阅的概念,这个概念非常重要。
 
kafka 中的数据单位是message 。对比数据库来说,可以把消息看做数据库中的记录。对kafka 而言,一个消息就是一个字节数组,字节数组中的数据没有特定的格式或者意义。消息有一个可选的元数据信息,称为key key 也是一个字节数组,与消息一样,没有特别的含义。key 用于将消息写入特定的partition partition 是一个环形存储结构,保证具有相同key 的消息总是写入相同的partition key 的用法在第三章讨论。
为了提高效率,消息以批量的形式写入kafka 。批量(batch) 消息是指消息的集合,这些消息会发送到同一个topic partition 。批次越大,延迟越高,批次可以进行压缩,以更高效的速度传输。
Schemas
消息对kafka 来说只是字节数组,但是在传输消息时,建议给消息内容增加额外的结构,便于消费端理解。这个结构称为消息的schema 。可以根据业务场景来选择合适的schema ,如JSON XML 。但是JSON XML 格式的schema 缺乏强类型处理和schema 版本间的兼容性。许多kafka 开发者倾向使用Apache Avro ,一个序列化框架,最初开发的目的就是为了Hadoop Avro 提供了一个压缩的序列化格式、消息模式和消息负载分离,schema 变化时, 不需要修改已有代码, 以及强大的数据类型和模式演化, 向后和向前兼容。
kafka 中,一致的数据格式是非常重要的, 这样可以实现读写消息解耦。如果没有实现解耦,订阅消息的客户端必须经常更新,以处理新旧消息的数据格式。
Topics and Partitions
kafka 中的消息分类存储在各自的topic 中。topic 类似一个数据库表, 或一个文件系统的文件夹。topic 包含一系列分区partition 。一个partition 是一个log 日志,消息以只能追加的方式写入到log 中,以从头到尾的顺序进行顺序读取。需要注意的是,一个topic 包括多个partition ,不能保证整个topic 中的消息的时间顺序, 只能保证在一个分区中的消息的时间顺序。图1-5 中展示了一个topic ,包含4 partition ,新写入的消息在每个partition end 处追加。partition kafka 提供了冗余和伸缩性。每一个partition 可以位于不同的server 节点上,也就是说,一个topic 可以水平扩展多台服务器,以此来提供比单节点高的性能服务。
Producers and Consumers
kafka 客户端就是用户程序,有两种基本类型的客户端:producer 生产者和consumer 消费者。
producer 创建新消息。在其他的消息系统中,producer 被称为publisher 或者writer 。一般情况下,一个消息会被生产到一个特定了topic 上。默认情况下,producer 不关心消息发送到哪个partition 上,producer 会使消息在所有的partition 中均匀分布。在某些情况下,producer 会将消息发送到特定的partition ( 可以使用消息key 和自定义partitioner 用来生成key hash 值,从而将消息映射到一个特定的partition )
consumer 读取消息。在其他消息系统中,consumer 被称为subscribe 或者reader consumer 可以订阅一个或者多个topic 中的消息,以消息产生的顺序来读取。consumer 通过消息的offset 来跟踪消费的消息。offset 是另一个元数据信息,是一个持续增加的整数值,kafka 将消息添加到topic 中时,会为消息添加offset 元数据信息。通过存储每个partition 中最后消费的消息的offset zookeeper 中或者kafka 本身,consumer 可以停止消费或者重新消费消息。
consumer consumer group 的一部分。一个或者多个consumer 组成一个consumer group 来消费一个topic 中消息。group 保证一个partition 只会被一个成员消费。图1-6 中,一个group 中有3 consumer 消费一个topic 中的消息。其中两个consumer 各自消费一个partition ,另一个consumer 消费两个partition 中的消息。consumer partition 之间的映射关系叫做partition ownership
 
 
Brokers and Clusters
一个kafka server 叫做一个broker broker 接收producer 发送的消息,为消息设置offset ,并将消息存储在磁盘上。broker 同时为consumer 服务,响应consumer 读取partition 中消息的请求。
根据特定的硬件及其性能特征, 一个代理可以很容易地处理成千上万的分区和每秒数以百万计的消息。
kafka broker 被设计为Cluster 的组成部分。一个cluster 中的brokers 中的某个broker 将成为集群的controller( 从活动的集群成员中自动选举出) controller 负责执行管理操作,包括为broker 分配partition ,监控broker 的错误信息。一个partition 属于一个broker broker 是这个partition leader 。一个partition 可以属于多个broker(partition 多副本,如图1-7 所示) ,这样实现了partition HA 。注意,所有的consumer producer 在这个partition 上的操作,必须连接上leader
retention 消息保留时间


查看topic列表:
./kafka-topics.sh --zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181 --list
查看topic详细信息:
./kafka-topics.sh --zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181 --topic userLogs --describe
如何保证消息的消费顺序与消息的生产顺序一致?
可以将topic的 partitions设置为1: --partitions 1
  1. "leader" is the node responsible for all reads and writes for the given partition. Each node will be the leader for a randomly selected portion of the partitions.
  2. "replicas" is the list of nodes that replicate the log for this partition regardless of whether they are the leader or even if they are currently alive.
  3. "isr" is the set of "in-sync" replicas. This is the subset of the replicas list that is currently alive and caught-up to the leader.
更改broker端口:
listeners=PLAINTEXT://:9092 //默认端口 9092

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐