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