一、kafka的安装
- 部署一台zookeeper服务器
- 安装jdk
- 下载kafka的安装包:
- 上传到kafka的服务器上:/usr/local/kafka
- 解压缩压缩包
- 进入到config目录内,修改server.properties
#broker.id属性在kafka集群中必须要是唯一 broker.id=0 #kafka部署的机器ip和提供服务的端口号 listeners=PLAINTEXT://173.16.179.60:9092 #kafka的消息存储文件 log.dirs=/usr/local/data/kafka-logs #kafka连接zookeeper的地址 zookeeper.connect=173.16.179.60:2181
- 进入到bin目录下,执行以下命令来启动kafka服务器(带配置文件)
./kafka-server-start.sh -daemon ../config/server.properties
- 校验kafka是否启动成功
- 进入到zk内查看是否有kafka的节点:
/brokers/ids是否存在[0]
二、kafka的简介
三、kafka的基本命令
1.创建topic
bin/kafka-topics.sh --create --bootstrap-server 173.16.179.60:9092 --replication-factor 1 --partitions 1 --topic test
2.查看当前所有的topic
bin/kafka-topics.sh --list --bootstrap-server 192.168.43.110:9092
3.列出指定topic的详细信息,若不指定,则列出所有的topic信息
bin/kafka-topics.sh --describe --bootstrap-server 192.168.43.110:9092 --topic test
bin/kafka-topics.sh --describe --bootstrap-server 192.168.43.110:9092
4.删除一个topic
bin/kafka-topics.sh --delete --bootstrap-server 192.168.43.110:9092 --topic test1
5.查看帮助文档
bin/kafka-topics.sh --help
6.发送消息(把消息发送给broker中的某个topic)
生产者:bin/kafka-console-producer.sh --broker-list 192.168.43.110:9092 --topic test (向test主题发送消息)
消费者:bin/kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --topic test (从test主题最后一条的偏移量加1开始接受消息)
bin/kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --topic test --from-beginning(从头开始消费test主题的消息)
发送消息的示例如下图:
7.关于发送消息的细节
生产者将消息发送给broker,broker会将消息保存在指定的日志文件中(log.dirs=/data/kafka-logs)
消息的保存是有序的,通过offset偏移量描述消息的有序性
消费者消费消息时也是通过offset来描述当前要消费的那条消息的位置
四、单播消息和多播消息
在kafka的一个topic中启动一个生产者,2个消费者。
生产者生产的一条消息是否同时被2个消费者消费?
1.单播消息
如果多个消费者在同一个消费组,那么只有一个消费者可以收到订阅的topic。换言之同一个消费组中只能有一个消费者收到一个topic的消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --topic test --consumer-property group.id=testGroup
其中testGroup为消费组group.id的名称
2.多播消息
不同的消费组订阅一个topic,那么不同的消费组中只有一个消费者能收到消息。实际上也是多个消费组的多个消费者能够收到同一个消息。
bin/kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --topic test --consumer-property group.id=testGroup1
(换一个与之前不同的组的id名称testGroup1,则再次发送消息之后,2个不同的组都能同时收到消息)
3.单播和多播的示例图如下:
4.查看当前主题下消费组
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.43.110:9092 --list
5.查看消费组中的具体信息
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.43.110:9092 --describe --group testGroup
PARTITION:分区
CURRENT-OFFSET:当前被消费的消息的偏移量
LOG-END-OFFSET:消息总量(最后一条消息的偏移量)
LAG:积压了多少条消息
五、kafka主题和分区的概念
1.主题topic
主题topic在kafka中是一个逻辑的概念,kafka通过topic将消息进行分类,不同的topic会被订阅该topic的消费者消费。如果说这个topic中的消息非常非常的多,多到需要几T来存,因为消息会被保存在日志文件中,为了解决文件过大的问题,kafka提出了partition分区的概念
2.分区partition
通过partition将一个topic中的消息分区来存储,这样的好处有多个:
- 分区存储,可以解决统一文件过大的问题
- 提供读写的吞吐量:读和写可以同时在多个分区中进行
3. 创建多分区的主题
bin/kafka-topics.sh --bootstrap-server 192.168.43.110:9092 --create --partitions 2 --replication-factor 1 --topic topic1
4. kafka中消息日志文件中保存的内容
- 00000000000000000000.log 这个文件保存的就是消息
- __consumer_offsets-49 kafka内部创建了__consumer_offsets主题50个分区,这个主题用来存放消费者消费某个主题的偏移量。因为每个消费组都会子维护着消费的主题的偏移量,也就是说每个消费者都会把消费的主题的偏移量自主上报给kafka中的默认主题:__consumer_offsets,因此kafka为了提升这个主题的并发性,默认设置了50个分区。至于提交到哪个分区:通过hash函数算法确定分区数
- 提交到该主题中的内容是:key是consumerGroupid+topic+分区号,value就是当前的offset的值
- 文件中保存的消息,默认保存7天,七天到后消息会被删除.