Kafka相关概念介绍

一:Kafka介绍

  • Kafka是最初由Linkedin公司开发,是⼀个分布式⽀持分区的(partition)、多副本的 (replica),基于zookeeper协调的分布式消息系统,它的最⼤的特性就是可以实时的处理 ⼤量数据以满⾜各种需求场景:⽐如基于hadoop的批处理系统、低延迟的实时系统、 Storm/Spark流式处理引擎,web/nginx⽇志、访问⽇志,消息服务等等,⽤scala语⾔编 写,Linkedin于2010年贡献给了Apache基⾦会并成为顶级开源 项⽬。
1.Kafka使用的场景
  • 日志收集:利用Kafka手机各种服务的log,通过Kafka使用统一接口服务方式开放给各种consumer,例如hadoop,Hbase
  • 消息系统:解耦和生产者消费者,缓存消息
  • 用户活动跟踪:Kafka也经常被用来记录web用户或者app用户的各种活动,比如浏览网页搜索,点击等活动,这些活动信息被各个服务器发布到Kafka的topic当中,然后订阅者通过这些topic来做实时的监控分析,或者装载到hadoop,数据仓库当中做离线分析和挖掘
  • 运营指标:Kafka也经常⽤来记录运营监控数据。包括收集各种分布式应⽤的数据,⽣产各种操作的集中反馈,⽐如报警和报告。
2.Kafka基本概念
  • 一些名词概念
名称解释
Broke消息中间件处理节点,⼀个Kafka节点就是⼀个broker,⼀个或者多个Broker可以组成⼀个Kafka集群
TopicKafka根据topic对消息进⾏归类,发布到Kafka集群的每条消息都需 要指定⼀个topic
Producer消息⽣产者,向Broker发送消息的客户端
Consume消息消费者,从Broker读取消息的客户端
ConsumerGroup每个Consumer属于⼀个特定的Consumer Group,⼀条消息可以被多个不同的Consumer Group消费,但是⼀个Consumer Group中只能有⼀个Consumer能够消费该消息
Partition物理上的概念,⼀个topic可以分为多个partition,每个partition内部消息是有序的
  • 基本消费流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RYJLGiyQ-1655452255725)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka/image-20220617085737326.png)]

3.Kafka的安装
  • 部署一台zoopeeper服务器
  • 安装JDK
  • 下载Kafka的安装包:http://kafka.apache.org/downloads
  • 上传到服务器解压至:/opt
  • 进入config目录,修改server.properties
#broker.id属性在kafka集群中必须要是唯⼀ 
broker.id=0
#kafka部署的机器ip和提供服务的端⼝号 
listeners=PLAINTEXT://localhost:9092 
#kafka的消息存储⽂件
log.dir=/tmp/kafka-logs
#kafka连接zookeeper的地址
zookeeper.connect=localhost:2181
  • 进入到bin目录当中,执行命令启动Kafka(携带配置文件)
./kafka-server-start.sh -daemon ../config/server.properties
  • 检查Kafka是否启动成功,查看关于server.properties的进程

二:基本操作

1.创建topic
  • 执行以下命令创建一个名为"test"的topic,这个topic当中只有一个partition,并且备份因子设置为1:
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
  • 去zookeeper当中查看当前Kafka内存在那些topic
./kafka-topics.sh --list --zookeeper localhost:2181
  • 所以说Kafka创建的主题是保存在zookeeper当中的.
2.发送/消费消息
  • 将消息发送给某个borker指定topic
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
  • 从最后一条消息开始消费消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
  • 从头开始消费消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning  --topic test
  • kafka读取消息的方式有两种:
  1. 从最后一条消息开始消费消息,就是说我们在开始进行消息消费之前,可能已经发送了很多条消息,这些消息会存放在一个队列当中,然后当采用从最后一条消息读取的方法读取消息的时候是读取的队列尾部哪个新添加的消息
  2. 从头开始读取消息,将消息队列当中的消息从头到尾读取出来
  • 消息消费细节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YVdomK4j-1655452255727)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka/image-20220617094219650.png)]

  • 生产者将消息发送给broker,broker会将消息保存在本地的日志文件中

  • # 我自己的路径
    /tmp/kafka-logs/主题-分区/00000000.log
    
  • 消息的保存是有序的,通过offset偏移量来描述消息的有序性

  • 消费者消费消息也是通过offset来描述当前要消费的那条消息的位置

三:单播消息和多播消息

1.单播消息
  • 消费组的方式创建消费这group.id=testGroup表示设置的消费组名称为testGroup
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup --topic test

如果多个消费者处在同一个消费组,那么只有一个消费者可以收到订阅的topic中的消息.换言之,同一个消费组中只有一个消费者能够受到topic中的消息

2.多播消息

不同的消费组订阅同一个topic,那么不同的消费组中只有一个消费者能够收到消息,实际上也是多个消费者收到了同一个消息

3.下图就是描述单播和多播消息的区别

消息可以发往多个不同的消费组,但是同一个消费组中只有一个消费者可以进行消息消费

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcKdVXHa-1655452255728)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka/image-20220617124223881.png)]

3.查看消费组及信息
# 查看当前主题下有那些消费组
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
# 查看消费组中的具体信息:比如当前偏移量,最后一条消息的偏移量,堆积的消息数量
./kafka-consumer-groups.sh --bootstrap-server localhost: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
2.1分区的概念
  • 通过partition将一个topic中的消息分区来进行存储.这样做的好处就是

    1. 分区存储,可以解决统一存储文件过大问题

    2. 提供了读写的吞吐量:读和写可以同时在多个分区当中进行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YeGv4PRT-1655452255729)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka/image-20220617145017455.png)]

2.2创建多个分区
# 为test1主题创建2个分区
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic test1

# 查看test1主题的分区信息
./kafka-topics.sh --describe --zookeeper localhost:2181 --topic test1
3.kafka中消息日志文件中保存的内容
  • 000000.log:这个文件中保存的就是消息
  • consumer_offsets-49:
    • _kafka内部自己创建了_consumer_offsets主题一共包含50个分区.这个主题的作用使用来存放消费者消费某个主题的偏移量.
    • 因为每个消费者都会自己维护着消费的主题的偏移量,也就是说每个消费者会把消费的主题的偏移量自主上报给kafka中默认的主题:consumer_offsets,因此kafka为了提升这个主题的并发性,默认设置了50个分区
    • 提交到那个分区根据hash算法来进行计算:hash(consumerGroupId) % consumer_offsets
    • 提交到该主题的内容是: key是consumerGroupId + 分区号, value就是当前offset的值
  • 文件中保存的消息,默认保存7天事件,7天到了之后会自动清除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值