Kafka--03---kafka安装消息的细节 主题和分区的概念

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka--03---kafka安装消息的细节 主题和分区的概念相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


kafka安装和搭建

Kafka的安装

  • 部署⼀台zookeeper服务器
  • 安装jdk
  • 下载kafka的安装包:http://kafka.apache.org/downloads
  • 上传到kafka服务器上: /usr/local/kafka
  • 解压缩压缩包
  • 进⼊到config⽬录内,修改server.properties
#broker.id属性在kafka集群中必须要是唯⼀
broker.id=0
#kafka部署的机器ip和提供服务的端⼝号
listeners=PLAINTEXT://192.168.65.60:9092
#kafka的消息存储⽂件
log.dir=/usr/local/data/kafka-logs
#kafka连接zookeeper的地址
zookeeper.connect=192.168.65.60:2181

进⼊到bin⽬录内,执⾏以下命令来启动kafka服务器(带着配置⽂件)

./kafka-server-start.sh -daemon ../config/server.properties

校验kafka是否启动成功:

  • 进⼊到zk内查看是否有kafka的节点: /brokers/ids/0

创建topic

  • 通过kafka命令向zk中创建⼀个主题
./kafka-topics.sh --create --zookeeper 172.16.253.35:2181 --replicationfactor
1 --partitions 1 --topic test
  • 查看当前zk中所有的主题
./kafka-topics.sh --list --zookeeper 172.16.253.35:2181 test

发送消息

把消息发送给broker中的某个topic,打开⼀个kafka发送消息的客户端,然后开始⽤客户端向
kafka服务器发送消息

./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --
topic test

消费消息

打开⼀个消费消息的客户端,向kafka服务器的某个主题消费消息

  • ⽅式⼀:从当前主题中的最后⼀条消息的offset(偏移量位置)+1开始消费
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --
topic test

⽅式⼆:从当前主题中的第⼀条消息开始消费

./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --
from-beginning --topic test

消息的细节

消息的储存

  • ⽣产者将消息发送给broker,broker会将消息保存在本地的⽇志⽂件中

/usr/local/kafka/data/kafka-logs/主题-分区/00000000.log

  • 消息的保存是有序的,通过offset偏移量来描述消息的有序性
  • 消费者消费消息时也是通过offset来描述当前要消费的那条消息的位置

单播消息

在⼀个kafka的topic中,启动两个消费者,⼀个⽣产者,问:⽣产者发送消息,这条消息是否同时会被两个消费者消费?

  • 如果多个消费者在同⼀个消费组,那么只有⼀个消费者可以收到订阅的topic中的消息。换⾔ 之,
  • 同⼀个消费组中只能有⼀个消费者收到⼀个topic中的消息
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --
consumer-property group.id=testGroup --topic test

多播消息

  • 不同的消费组订阅同⼀个topic,那么不同的消费组中只有⼀个消费者能收到消息。实际上也是多个消费组中的多个消费者收到了同⼀个消息
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --
consumer-property group.id=testGroup1 --topic test

./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --
consumer-property group.id=testGroup2 --topic test

查看消费组的详细信息

通过以下命令可以查看到消费组的相信信息:

./kafka-consumer-groups.sh --bootstrap-server 172.16.253.38:9092 --
describe --group testGroup

重点关注以下⼏个信息:

  • current-offset: 最后被消费的消息的偏移量
  • Log-end-offset: 消息总量(最后⼀条消息的偏移量)
  • Lag:积压了多少条消息

主题和分区的概念

1.主题Topic

  • 主题-topic在kafka中是⼀个逻辑的概念,kafka通过topic将消息进⾏分类。不同的topic会被
    订阅该topic的消费者消费。
  • 但是有⼀个问题,如果说这个topic中的消息⾮常⾮常多,多到需要⼏T来存,因为消息是会被
    保存到log⽇志⽂件中的。为了解决这个⽂件过⼤的问题,kafka提出了Partition分区的概念

2.分区Partition

1)分区的概念
通过partition将⼀个topic中的消息分区来存储。这样的好处有多个:

  • 分区存储,可以解决统⼀存储⽂件过⼤的问题
  • 提供了读写的吞吐量:读和写可以同时在多个分区中进⾏

    2)创建多分区的主题
./kafka-topics.sh --create --zookeeper 172.16.253.35:2181 --replicationfactor
1 --partitions 2 --topic test1

kafka中消息⽇志⽂件中保存的内容

  • 00000.log: 这个⽂件中保存的就是消息
  • __consumer_offsets-49:
    kafka内部⾃⼰创建了__consumer_offsets主题包含了50个分区。这个主题⽤来存放消费
    者消费某个主题的偏移量。因为每个消费者都会⾃⼰维护着消费的主题的偏移量,也就是
    说每个消费者会把消费的主题的偏移量⾃主上报给kafka中的默认主题:
    consumer_offsets。因此kafka为了提升这个主题的并发性,默认设置了50个分区。

kafka内部⾃⼰创建了__consumer_offsets主题包含了50个分区。这个主题⽤来存放消费者消费某个主题的偏移量

  • 提交到哪个分区:通过hash函数:hash(consumerGroupId) % __consumer_offsets 主题的分区数
  • 提交到该主题中的内容是:key是consumerGroupId+topic+分区号,value就是当前 offset的值
  • ⽂件中保存的消息,默认保存7天。七天到后消息会被删除。

以上是关于Kafka--03---kafka安装消息的细节 主题和分区的概念的主要内容,如果未能解决你的问题,请参考以下文章

使用RocketMQ的小细节(上)

30 RocketMQ事务消息的代码实现细节

阿里分布式消息中间件RocketMQ的设计思路与技术细节

iOS语言播报支付金额的实现细节

Erlang 细节记录

优化技术专题「线程间的高性能消息框架」再次细节领略Disruptor的底层原理和优势分析