Kafka学习笔记(一)

Apache Kafka是一个开源的分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。

简介

Kafka是一个高吞吐量、分布式的消息引擎,它通过分区(partitioning)和复制机制(replication)来保障消息的可靠性,并通过分布式系统来实现高吞吐量的数据处理和存储。

Kafka的主要特点包括:

  1. 高吞吐量、低延迟:Kafka可以支持大量的消息流,每秒钟可以处理数百万条消息。单机写入TPS约在100万条/秒,消息大小10个字节。而最低的延迟只有几秒。

  2. 可靠性:Kafka的分区和复制机制可以保障消息的可靠性,即使某台服务器宕机,消息也可以被恢复。

  3. 高伸缩性/可扩展性:当存储空间不过够时,相对于其他MQ产品需要扩大硬件,比如增加磁盘或引入其他架构这种复杂且性价比低的方式来实现扩容。Kafka通过分区,可以进行横向可以扩容,且分区还可以分布在不同的机器上,因此可以通过添加更多的服务器来扩展其性能和存储容量。

  4. 消息持久化:Kafka可以将消息保存在磁盘上,以便在需要时随时进行读取。

  5. 多种消息传递保证机制:Kafka支持多种消息传递保证机制,包括“最多一次”、“最少一次”以及“恰好一次”等。消费者采用Pull方式获取消息。通过控制能够保证所有消息被消费且仅被消费一次。

  6. 高并发:Kafka支持几千个客户端同时进行读写操作。

  7. 容错性:Kafka集群部署时,其中一个节点宕机失效时,会自动转移到其他节点,保证可用性。
    Kafka基于scala语言编写,运行在JVM虚拟机上,对zookeeper依赖。支持Java、.Net、PHP、Ruby、Python、Go等多种语言的客户端。

应用场景

1.消息传递:Kafka替代了传统的Http、RPC一类点对点的通信,可以实现异步通信,实现系统内部模块或系统之间的解耦、实现流量峰值的削峰填谷。
2.网站活动跟踪:记录收集用户的活动数据
3.指标监控:记录运营数据
4.日志聚合:日志信息搜索并集中存储到一个地方。
5.大数据流的计算。

单机安装Kafka

  1. 下载并解压kafka到指定目录(kafka下载地址
wget https://downloads.apache.org/kafka/3.6.0/kafka_2.13-3.6.0.tgz
tar -xzvf kafka_2.13-3.6.0.tgz
cd kafka_2.13-3.6.0
  1. 启动Kafka
    注意:保证本地环境安装java8+
    Kafka依赖于ZooKeeper或KRaft启动。此处我们使用熟悉的zookeeper进行启动
    zookerper启动命令:
bin/zookeeper-server-start.sh config/zookeeper.properties

  后台启动

nohup ./bin/zookeeper-server-start.sh config/zookeeper.properties >> zookeeper.nohup 2>&1 &

Kafka安装包自带zookeeper,如果想用另外的zookeeper,可以修改config/server.properties中的zookeeper.connect,多个zookeeper之间用逗号分隔。
在这里插入图片描述

  1. 启动Kafka
    修改配置及部分配置参数解释
vi server.properties
#单机时可以不用改,集群时要保证broker唯一ID,必须为整数
broker.id=1
#默认监听本机服务
#参数定义了Kafka Broker的网络接口和监听端口以供客户端连接
#通过设置listeners参数,Kafka Broker可以监听多种协议和端口
#例如PLAINTEXT、SASL_PLAINTEXT、SSL、SASL_SSL等
#Kafka Broker启动时,它会根据listeners参数的设置来监听相应的接口和端口。
#一组协议和端口号之间用逗号分隔
listeners=PLAINTEXT://192.168.2.130:9092
#定义一个Topic的分区数。
num.partitions=1
#运行自动创建主题,当生产者写入或消费者订阅一个不存在的主题时,kafka会自动创建该主题。
#不建议在生产环境中设置为true,会导致意外的主题创建
auto.create.topics.enable=true
delete.topic.enable=true
#配置kafka的数据目录(kafka的消息数据是以日志文件的形式保存)
log.dirs=/tmp/kafka-logs
#消息数据留存的时间
log.retention.hours=168
#主题日志到达定义的值是,Kafka将开始删除旧的数据
log.retention.bytes=
#日志段的最大值,当超过这个值时,Kafka将关闭该日志段并开启一个新的日志段
#确保了主题在存储消息时不会超出磁盘空间限制,提高数据读取和处理的效率
log.segement.bytes=
#控制消费者在加入消费者组时,等待重新平衡的时间,以便其他消费者加入到同一个消费者组中。
group.initial.rebalance.delay.ms

后台启动kafka

nohup ./bin/kafka-server-start.sh ./config/server.properties >> kafka.nohup 2>&1 & 

num.partitions的作用如下:

增加并行度:增加分区数可以增加消费者组的并行度,使得多个消费者可以同时消费一个主题的不同分区,从而提高消费效率。

提高容错性:通过增加分区数可以提高主题的容错性。如果一个分区出现故障,其他分区仍然可以正常工作,从而保证主题的可用性。

提高负载均衡:增加分区数可以提高消息的负载均衡能力。当一个主题只有一个分区时,所有的消息都会被写入到同一个分区中,不利于负载均衡。而当一个主题有多个分区时,消息可以根据某种规则分配到不同的分区中,从而实现负载均衡。

需要注意的是,增加分区数也会增加一定的存储成本和网络开销,因此在设置分区数时需要根据实际情况进行平衡和权衡。通常建议在创建主题时就指定分区数,并在运行过程中避免对主题的分区数进行过多的修改。
group.initial.rebalance.delay.ms的作用如下:
group.initial.rebalance.delay.ms是Apache Kafka中消费者组参数之一,它的主要作用是控制消费者在加入消费者组时,等待重新平衡的时间,以便其他消费者加入到同一个消费者组中。

在Kafka中,多个消费者可以组成一个消费者组,以协同消费同一个或多个主题的消息。当有新的消费者加入或离开消费者组时,会触发消费者组的重新平衡(rebalance)操作,该操作会重新分配分区给各个消费者,以保证分区的负载均衡。

group.initial.rebalance.delay.ms则是指定了当一个消费者加入消费者组时,它要等待多长时间后才开始进行消费的操作。该参数的默认值为0,也就是说,一旦一个消费者加入消费者组,它立即可以开始进行消费。但是,在一些场景下,比如消费者组中的其他消费者还没有加入,或者正在发生重新平衡,此时新加入的消费者可能无法分配到任何分区,这时消费者需要等待一段时间,以便其他消费者加入到消费者组中,或者重新平衡完成后,才开始进行消费。所以建议在生产环境中设为3

因此,group.initial.rebalance.delay.ms可以用来控制消费者在什么时候开始消费,以避免在消费者组刚建立时可能出现的分区分配问题。

  1. 创建Topic
    2.8以下的kafka,创建分区时,依赖于zookeeper,需要执行命令如下
#创建topic
sh bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topicFirst
#查看已创建的topic
sh bin/kafka-topics.sh -list -zookeeper localhost:2181

2.8+的kafka,已经不需要依赖zookeeper来创建topic,新版本使用 --bootstrap-server 参数

#创建主题
sh bin/kafka-topics.sh --bootstrap-server 192.168.2.130:9092 --create --topic topicFirst  --replication-factor 1 --partitions 1
#--replication-factor 1参数表示创建主题时副本的数量为1。这意味着每个分区的数据只存储在一个服务器上,没有备份或冗余。因此,如果该服务器发生故障,将会丢失分区的数据。建议将副本的数量设置为至少2,以保证数据的冗余性和可靠性。
#partitions 1,表示这个主题只有一个分区。意味着所有的消息都将被写入并存储在同一个分区中,并且只能由一个消费者进行消费。因此,消息的读取和处理速度可能会受到限制,并且可能无法实现高可用性和容错性。
#查看主题
sh bin/kafka-topics.sh --list --bootstrap-server 192.168.2.130:9092
  1. 启动Produce
sh bin/kafka-console-producer.sh --broker-list 192.168.2.130:9092 --topic topicFirst
  1. 启动consoumer
sh bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.130:9092 --topic topicFirst --from-beginning

Producer窗口发送消息:
在这里插入图片描述
Consumer接收消息
在这里插入图片描述

集群启动Producer

sh kafka-console-producer.sh --broker-list [ip]:[port],[ip]:[port],[ip]:[port] --topic topicFirst

集群启动Consumer并接收消息

sh kafka-console-consumer.sh --bootstrap-server [ip]:[port],[ip]:[port],[ip]:[port] --topic topicFirst --from-beginning

–from-beginning 参数表示从该消费者组(consumer group)的最早的偏移量(offset,即最老的消息)开始消费消息,而不是从最新的消息开始消费。如果不指定该参数,则该消费者组将从当前时间开始消费新的消息。

名词解释

Broker:Kafka集群中运行Kafka服务的一个节点,负责接收来自Producer发送的消息,将消息持久化到磁盘中,并将消息发送给Consumer进行消费。
每个Broker都可以存储一个或多个Topic的数据副本,并为Topic的多个Partition提供服务。Broker可以根据Topic的特性自动或手动将数据分配到集群中的不同节点上,并提供负载均衡和故障恢复等功能。
Broker之间采用Zookeeper进行协调,Zookeeper为Broker提供了组管理、节点状态监控、数据存储等服务,保证了集群的稳定运行。

Partition:一个有序、不可变的消息队列,是Topic的一个基础组成部分。每个Partition内部是有序的,顺序由消息的Offset决定,每个Partition内部的消息数量可以非常大,并且可以根据需求动态增长,因此可以支持海量的消息存储。
每个partition都对应着一个在磁盘上的日志文件,这些日志文件在分布环境下被存储在多个Broker上。这样设计实现了高吞吐量和可扩展性。
对于Producer来说,它可以选择将消息发送到指定的Partition,或者让Kafka自动选择Partition。对于Consumer来说,同一个Consumer Group内不同Consumer消费的是不同的Partition,因此,可以实现消息的并行消费。

Topic:消息的分类,类似于消息队列中的主题或频道。在Kafka中,Topic是一个逻辑概念,用来表示一组相关的消息,一个Topic可以被多个Producer生产消息,也可以被多个Consumer消费消息。

Consumer Group:多个Consumer可以组成一个Consumer Group,共同消费同一个Topic的消息。

Offset:消息在Partition中的偏移量,用于标识消息在Partition中的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值