kafka权威指南中文翻译之一
kafka初见(Meet Kafka)在讨论Kafka细节之前,有必要先来了解下消息发布/订阅的概念,这个概念非常重要。 kafka中的数据单位是message。对比数据库来说,可以把消息看做数据库中的记录。对kafka而言,一个消息就是一个字节数组,字节数组中的数据没有特定的格式或者意义。消息有一个可选的元数据信息,称为key。key也是一个字节数组,与消息一样,没有特别的含义。ke
·
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
- "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.
- "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.
- "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
更多推荐
已为社区贡献3条内容
所有评论(0)