一、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天,七天到后消息会被删除.