kafka是什么?
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。--百度百科
参考:https://baike.baidu.com/item/Kafka/17930165?fr=aladdin
中文官网:https://kafka.apachecn.org/
kafka的特性
Topic 就是数据主题,是数据记录发布的地方,可以用来区分业务系统。Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。
对于每一个topic, Kafka集群都会维持一个分区日志,如下所示:
每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的commit log文件。分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。
Kafka 集群保留所有发布的记录—无论他们是否已被消费—并通过一个可配置的参数——保留期限来控制. 举个例子, 如果保留策略设置为2天,一条记录发布后两天内,可以随时被消费,两天过后这条记录会被抛弃并释放磁盘空间。Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题.
事实上,在每一个消费者中唯一保存的元数据是offset(偏移量)即消费在log中的位置.偏移量由消费者所控制:通常在读取记录后,消费者会以线性的方式增加偏移量,但是实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以跳过最近的记录,从"现在"开始消费。
这些细节说明Kafka 消费者是非常廉价的—消费者的增加和减少,对集群或者其他消费者没有多大的影响。比如,你可以使用命令行工具,对一些topic内容执行 tail操作,并不会影响已存在的消费者消费数据。
日志中的 partition(分区)有以下几个用途。第一,当日志大小超过了单台服务器的限制,允许日志进行扩展。每个单独的分区都必须受限于主机的文件限制,不过一个主题可能有多个分区,因此可以处理无限量的数据。第二,可以作为并行的单元集—关于这一点,更多细节如下
分布式
日志的分区partition (分布)在Kafka集群的服务器上。每个服务器在处理数据和请求时,共享这些分区。每一个分区都会在已配置的服务器上进行备份,确保容错性.
每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。当leader宕机了,followers 中的一台服务器会自动成为新的 leader。每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。
生产者
生产者可以将数据发布到所选择的topic(主题)中。生产者负责将记录分配到topic的哪一个 partition(分区)中。可以使用循环的方式来简单地实现负载均衡,也可以根据某些语义分区函数(例如:记录中的key)来完成。下面会介绍更多关于分区的使用。
消费者
消费者使用一个 消费组 名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上。
如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.
如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.
如图,这个 Kafka 集群有两台 server 的,四个分区(p0-p3)和两个消费者组。消费组A有两个消费者,消费组B有四个消费者。
通常情况下,每个 topic 都会有一些消费组,一个消费组对应一个"逻辑订阅者"。一个消费组由许多消费者实例组成,便于扩展和容错。这就是发布和订阅的概念,只不过订阅者是一组消费者而不是单个的进程。
在Kafka中实现消费的方式是将日志中的分区划分到每一个消费者实例上,以便在任何时间,每个实例都是分区唯一的消费者。维护消费组中的消费关系由Kafka协议动态处理。如果新的实例加入组,他们将从组中其他成员处接管一些 partition 分区;如果一个实例消失,拥有的分区将被分发到剩余的实例。
Kafka 只保证分区内的记录是有序的,而不保证主题中不同分区的顺序。每个 partition 分区按照key值排序足以满足大多数应用程序的需求。但如果你需要总记录在所有记录的上面,可使用仅有一个分区的主题来实现,这意味着每个消费者组只有一个消费者进程。
保证
high-level Kafka给予以下保证:
生产者发送到特定topic partition 的消息将按照发送的顺序处理。也就是说,如果记录M1和记录M2由相同的生产者发送,并先发送M1记录,那么M1的偏移比M2小,并在日志中较早出现
一个消费者实例按照日志中的顺序查看记录.
对于具有N个副本的主题,我们最多容忍N-1个服务器故障,从而保证不会丢失任何提交到日志中的记录.
关于保证的更多细节可以看文档的设计部分。
kafka可以做什么?
Kafka作为消息系统
Kafka 作为存储系统
zuoKafka用作流处理
批处理
总之kafka高性能、低延迟、具备日志存储、备份和传播功能的分布式文件系统。
详细可以参照:https://kafka.apache.org/documentation/#design
kafka基于windows10安装
先启用kafka自带的zk
zookeeper-server-start.bat ..\..\config\zookeeper.properties
下载安装kafka
下载:http://kafka.apache.org/downloads
配置kafka
\kafka_2.12-2.7.0\config\server.properties 将log.dirs 改为自已的地址
log.dirs=D:\tools\kafka_2.12-2.7.0\logs
启动kafka
.\bin\windows\kafka-server-start.bat .\config\server.properties
结果
创建topic
kafka-topics.bat --create --replication-factor 1
--partitions 1
--topic hong --zookeeper localhost:2181
注:
kafka-topics.bat 为topicat创建bat
--create 为创建指令
--zookeeper localhost:2181 提定zk 地址和端口为localhost:2181
--replication-factor 1 1个副本 就是只保存一份
--partitions 1 1个分区
--topic 指定topic
hong topic名称为hong
查看节点
kafka-topics.bat --list --zookeeper localhost:2181
启用Producer 生产数据(新窗口)
bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic hong
启用consumer 生产数据(新窗口)
kafka-console-consumer.bat --zookeeper localhost:2181 --topic hong
生产与消费结果
设置多代理集群
复制多个server.properties server2.properties server3.properties
配置如下:
server.properties
broker.id=1
listeners=PLAINTEXT://localhost:9092
log.dirs=D:\\tools\\kafka_2.12-2.7.0\\logs
server2.properties
broker.id=2
listeners=PLAINTEXT://localhost:9093
log.dirs=D:\\tools\\kafka_2.12-2.7.0\\logs2
server3.properties
broker.id=3
listeners=PLAINTEXT://localhost:9094
log.dirs=D:\\tools\\kafka_2.12-2.7.0\\logs3
然后再启动另外两个节点
启动2节点
.\bin\windows\kafka-server-start.bat .\config\server2.properties &
启动3节点
.\bin\windows\kafka-server-start.bat .\config\server3.properties &
创建一个3副本的topic=hong2
bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 3
--partitions 1
--topic hong2
查看topic详细
bin\windows\kafka-topics.bat --describe --zookeeper localhost:2181 --topic hong2
--describe 详细命令
--zookeeper localhost:2181 zk地址和端口
--topic hong2 topic为hong2
“leader”是负责给定分区所有读写操作的节点。每个节点都是随机选择的部分分区的领导者。
“replicas”是复制分区日志的节点列表,不管这些节点是leader还是仅仅活着。
“isr”是一组“同步”replicas,是replicas列表的子集,它活着并被指到leader。
查看源来 topic=hong
bin\windows\kafka-topics.bat --describe --zookeeper localhost:2181 --topic hong
启用3个消费者,1个生产者进行集群测试
消费
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic hong2 --from-beginning
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9093 --topic hong2 --from-beginning
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9094 --topic hong2 --from-beginning
生产
bin\windows\kafka-console-producer.bat --broker-list 127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094 --topic hong2
结果如下: