Kafka 的数据单元被称为 消息(message),消息可以有 个可选的元数据 也就是键。键 个字节数组,与消息一样

当消息以 种可控的方式写入不同的分区时,会用到。最简单的例子就是为键生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区。这样可以保证具有相同键的消息总是被写到相同的分区上。

为了提高效率,消息被分批次写入 Kafka 批次就是一组消息,这些消息属于同一 个主题和分区

对于 afka 来说,消息不过是晦涩难懂的字节数组,所以有人建议用 些额外的结构来定义消息内容,让它们更易于理解。根据应用程序的需求,肖息模式(schema )有许可用的选项如JSON、xml

Kaflca 的悄息通过主题(topic)进行分类。主题就好比数据库的表,或者文件系统里的文件夹

主题可以被分为若干个分区

偏移量(offset)是另一种元数据,它是个不断递增的整数值,在创建消息 时, Kafka 会把它添加到消息里。在给定的分区里,每个悄息的偏移量都是唯一的。消费者把每个分区最后读取的悄息偏移量保存在 Zookeeper Kafka 上,如果悄费者关闭或重启,它的读取状态不会丢失。

消费者是消费者群组(Consumer Group)的一部分,也就是说,会有一个或多个消费者共同读取一个主题,群组保证每个分区只能被一个消费者使用

消费者与分区之间的映射通常被称为悄费者对分区的所有权关系

一个独立的 Kafka 服务器被称为 broker

broker 是集群的组成部分,每个集群都有 一个broker 同时充当了集群控制器的角色

一个分区可以分配给多个 broke ,这个时候会发生分区复制,在集群中, 一个分区从属于 一个broker, 该broker 被称为分区的首领

保留消息(在一定期限内)是 Kafka一个重要特性。要么保留一段时间(比如7天),要么保留到消息达到一定大小的字节数

可以通过配置把主题当作紧凑型日志,只有最后一个带有特定键的消息会被保留下来

分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均衡

消费者通过向被指派为群组协调器(GroupCoordinator)的 broker (不同的群组可以有不同的协调器)发送心跳来维持它们和群组的从属关系以及它们对分区的所有权关系

消费者可以使用 Kafka 来追踪消息在分区里的位置(偏移量),我们把更新分区当前位置的操作叫作提交

一个消费者群组里一个消费者可能同时消费一个主题的多个分区,但一个分区一定只由一个消费者消费

如果只有一个消费者,就不需要订阅主题, 而代 是为自己分配分区。

首领副本(Leader) 所有生产者和消费者的请求都经过它

跟随者副本(follower) 从Leader复制数据

Kafka 使用零拷贝技术向客户端发送消息,也就是说, Kafka 直接把消息从文件(或者更确切地说是 Linux 文件系统缓存)里发送到网络通道而不需要经过任何中间缓冲区

1. 启动

[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh start
[root@localhost ~]# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 05/04/2020 15:07 GMT
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x8d
Mode: standalone
Node count: 132
Connection closed by foreign host.
[root@localhost ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@localhost ~]# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
[root@localhost ~]# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>Test Message1
>
^D
[root@localhost ~]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
Test Message1
^C
[root@localhost ~]#