Kafka学习
文章平均质量分 88
Kafka学习
@Autowire
这个作者很懒,什么都没留下…
展开
-
spring-kafk实战演练-1
1 环境配置1、导入maven坐标 <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka --> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId>原创 2022-04-10 19:58:58 · 2507 阅读 · 0 评论 -
26_如何选择合适的分区数 - 2
1 分区数的上限一味地增加分区数并不能使吞吐量一直得到提升,并且分区数也并不能一直增加,如果超过默认的配置值,还会引起 Kafka 进程的崩溃。读者可以试着在一台普通的 Linux 机器上创建包含10000个分区的主题,比如在下面示例中创建一个主题 topic-bomb:[root@node1 kafka_2.11-2.0.0]# bin/kafka-topics.sh --zookeeper localhost:2181/ kafka --create --topic topic-bomb --rep原创 2021-11-25 09:03:41 · 1250 阅读 · 0 评论 -
25_如何选择合适的分区数 - 1
如何选择合适的分区数?这是很多 Kafka 的使用者经常面临的问题,不过对这个问题而言,似乎并没有非常权威的答案。而且这个问题显然也没有固定的答案,只能从某些角度来做具体的分析,最终还是要根据实际的业务场景、软件条件、硬件条件、负载情况等来做具体的考量。本节主要介绍与本问题相关的一些重要决策因素,使读者在遇到类似问题时能够有参考依据。1 性能测试工具在 Kafka 中,性能与分区数有着必然的关系,在设定分区数时一般也需要考虑性能的因素。对不同的硬件而言,其对应的性能也会不太一样。在实际生产环境中,我们需原创 2021-11-25 08:59:43 · 899 阅读 · 0 评论 -
24_修改副本因子
创建主题之后我们还可以修改分区的个数,同样可以修改副本因子(副本数)。修改副本因子的使用场景也很多,比如在创建主题时填写了错误的副本因子数而需要修改,再比如运行一段时间之后想要通过增加副本因子数来提高容错性和可靠性。前面主要讲述了分区重分配的相关细节,本节中修改副本因子的功能也是通过重分配所使用的 kafka-reassign-partition.sh 脚本实现的。我们仔细观察一下上一节中的示例使用的 project.json 文件:{ "version": 1, "partitions原创 2021-11-25 08:51:44 · 1637 阅读 · 0 评论 -
23_复制限流
在上一节中我们了解了分区重分配本质在于数据复制,先增加新的副本,然后进行数据同步,最后删除旧的副本来达到最终的目的。数据复制会占用额外的资源,如果重分配的量太大必然会严重影响整体的性能,尤其是处于业务高峰期的时候。减小重分配的粒度,以小批次的方式来操作是一种可行的解决思路。如果集群中某个主题或某个分区的流量在某段时间内特别大,那么只靠减小粒度是不足以应对的,这时就需要有一个限流的机制,可以对副本间的复制流量加以限制来保证重分配期间整体服务不会受太大的影响。副本间的复制限流有两种实现方式:kafka-con原创 2021-11-25 08:46:19 · 290 阅读 · 0 评论 -
22_分区重分配
当集群中的一个节点突然宕机下线时,如果节点上的分区是单副本的,那么这些分区就变得不可用了,在节点恢复前,相应的数据也就处于丢失状态;如果节点上的分区是多副本的,那么位于这个节点上的 leader 副本的角色会转交到集群的其他 follower 副本中。总而言之,这个节点上的分区副本都已经处于功能失效的状态,Kafka 并不会将这些失效的分区副本自动地迁移到集群中剩余的可用 broker 节点上,如果放任不管,则不仅会影响整个集群的均衡负载,还会影响整体服务的可用性和可靠性。当要对集群中的一个节点进行有计划原创 2021-11-25 08:36:15 · 198 阅读 · 0 评论 -
21_优先副本的选举
分区使用多副本机制来提升可靠性,但只有 leader 副本对外提供读写服务,而 follower 副本只负责在内部进行消息的同步。如果一个分区的 leader 副本不可用,那么就意味着整个分区变得不可用,此时就需要 Kafka 从剩余的 follower 副本中挑选一个新的 leader 副本来继续对外提供服务。虽然不够严谨,但从某种程度上说,broker 节点中 leader 副本个数的多少决定了这个节点负载的高低。在创建主题的时候,该主题的分区及副本会尽可能均匀地分布到 Kafka 集群的各个 bro原创 2021-11-25 08:25:13 · 246 阅读 · 0 评论 -
20_初识KafkaAdminClient
1基本使用一般情况下,我们都习惯使用 kafka-topics.bat 脚本来管理主题,但有些时候我们希望将主题管理类的功能集成到公司内部的系统中,打造集管理、监控、运维、告警为一体的生态平台,那么就需要以程序调用 API 的方式去实现。本节主要介绍 KafkaAdminClient 的基本使用方式,以及采用这种调用 API 方式下的创建主题时的合法性验证。使用 TopicCommand 创建了一个主题:public static void createTopic(){ String[] op原创 2021-11-24 10:28:48 · 2615 阅读 · 0 评论 -
19_配置管理-主题端参数
kafka-configs.bat 脚本是专门用来对配置进行操作的,这里的操作是指在运行状态下修改原有的配置,如此可以达到动态变更的目的。kafka-configs.bat 脚本包含变更配置 alter 和查看配置 describe 这两种指令类型。同使用 kafka-topics.bat 脚本变更配置的原则一样,增、删、改的行为都可以看作变更操作,不过 kafka-configs.bat 脚本不仅可以支持操作主题相关的配置,还可以支持操作 broker、用户和客户端这3个类型的配置。kafka-con原创 2021-11-23 15:23:10 · 765 阅读 · 0 评论 -
18_查看主题-修改主题-删除主题
1查看主题kafka-topics.bat脚本有5种指令类型:create、list、describe、alter 和 delete。其中 list 和 describe 指令可以用来方便地查看主题信息,在前面的内容中我们已经接触过了 describe 指令的用法,本节会对其做更细致的讲述。通过 list 指令可以查看当前所有可用的主题,示例如下:[root@node1 kafka_2.11-2.0.0]# bin/kafka-topics.sh --zookeeper localhost:2181/原创 2021-11-23 15:12:11 · 447 阅读 · 0 评论 -
17_分区副本的分配
上一节中多处提及了分区副本的分配,读者对此或许有点迷惑,在生产者和消费者中也都有分区分配的概念。生产者的分区分配是指为每条消息指定其所要发往的分区,消费者中的分区分配是指为消费者指定其可以消费消息的分区,而这里的分区分配是指为集群制定创建主题时的分区副本分配方案,即在哪个 broker 中创建哪些分区的副本。在创建主题时,如果使用了 replica-assignment 参数,那么就按照指定的方案来进行分区副本的创建;如果没有使用 replica-assignment 参数,那么就需要按照内部的逻辑来计算原创 2021-11-23 14:54:38 · 330 阅读 · 0 评论 -
16_主题与分区
主题和分区是 Kafka 的两个核心概念,前面章节中讲述的生产者和消费者的设计理念所针对的都是主题和分区层面的操作。主题作为消息的归类,可以再细分为一个或多个分区,分区也可以看作对消息的二次归类。分区的划分不仅为 Kafka 提供了可伸缩性、水平扩展的功能,还通过多副本机制来为 Kafka 提供数据冗余以提高数据可靠性。从 Kafka 的底层实现来说,主题和分区都是逻辑上的概念,分区可以有一至多个副本,每个副本对应一个日志文件,每个日志文件对应一至多个日志分段(LogSegment),每个日志分段还可以细原创 2021-11-23 14:10:15 · 199 阅读 · 0 评论 -
15_重要的消费者参数
在 KafkaConsumer 中,除了第8节提及的4个默认的客户端参数,大部分的参数都有合理的默认值,一般我们也不需要去修改它们。不过了解这些参数可以让我们更好地使用消费者客户端,其中还有一些重要的参数涉及程序的可用性和性能,如果能够熟练掌握它们,也可以让我们在编写相关的程序时能够更好地进行性能调优与故障排查。下面挑选一些重要的参数来做细致的讲解。fetch.min.bytes该参数用来配置 Consumer 在一次拉取请求(调用 poll() 方法)中能从 Kafka 中拉取的最小数据量,默认值原创 2021-11-23 10:22:54 · 113 阅读 · 0 评论 -
14_消费者多线程实现
KafkaProducer 是线程安全的,然而 KafkaConsumer 却是非线程安全的。KafkaConsumer 中定义了一个 acquire() 方法,用来检测当前是否只有一个线程在操作,若有其他线程正在操作则会抛出 ConcurrentModifcationException 异常:java.util.ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access.KafkaConsu原创 2021-11-23 09:55:47 · 565 阅读 · 0 评论 -
13_再均衡-消费者拦截器
1再均衡再均衡是指分区的所属权从一个消费者转移到另一消费者的行为,它为消费组具备高可用性和伸缩性提供保障,使我们可以既方便又安全地删除消费组内的消费者或往消费组内添加消费者。不过在再均衡发生期间,消费组内的消费者是无法读取消息的。也就是说,在再均衡发生期间的这一小段时间内,消费组会变得不可用。另外,当一个分区被重新分配给另一个消费者时,消费者当前的状态也会丢失。比如消费者消费完某个分区中的一部分消息时还没有来得及提交消费位移就发生了再均衡操作,之后这个分区又被分配给了消费组内的另一个消费者,原来被消费完原创 2021-11-23 09:37:19 · 595 阅读 · 0 评论 -
12_指定位移消费
在上一节中我们讲述了如何进行消费位移的提交,正是有了消费位移的持久化,才使消费者在关闭、崩溃或者在遇到再均衡的时候,可以让接替的消费者能够根据存储的消费位移继续进行消费。试想一下,当一个新的消费组建立的时候,它根本没有可以查找的消费位移。或者消费组内的一个新消费者订阅了一个新的主题,它也没有可以查找的消费位移。当 __consumer_offsets 主题中有关这个消费组的位移信息过期而被删除后,它也没有可以查找的消费位移。在 Kafka 中每当消费者查找不到所记录的消费位移时,就会根据消费者客户端参原创 2021-11-22 10:31:39 · 707 阅读 · 0 评论 -
11_位移提交-控制或关闭消费
1 位移提交对于 Kafka 中的分区而言,它的每条消息都有唯一的 offset,用来表示消息在分区中对应的位置。对于消费者而言,它也有一个 offset 的概念,消费者使用 offset 来表示消费到分区中某个消息所在的位置。单词“offset”可以翻译为“偏移量”,也可以翻译为“位移”,读者可能并没有过多地在意这一点:在很多中文资料中都会交叉使用“偏移量”和“位移”这两个词,并没有很严谨地进行区分。笔者对 offset 做了一些区分:对于消息在分区中的位置,我们将 offset 称为“偏移量”;对于原创 2021-11-22 10:11:10 · 317 阅读 · 0 评论 -
10_消息消费
Kafka 中的消费是基于拉模式的。消息的消费一般有两种模式:推模式和拉模式。推模式是服务端主动将消息推送给消费者,而拉模式是消费者主动向服务端发起请求来拉取消息。从代码清单8-1中可以看出,Kafka 中的消息消费是一个不断轮询的过程,消费者所要做的就是重复地调用 poll() 方法,而 poll() 方法返回的是所订阅的主题(分区)上的一组消息。对于 poll() 方法而言,如果某些分区中没有可供消费的消息,那么此分区对应的消息拉取的结果就为空;如果订阅的所有分区中都没有可供消费的消息,那么 po原创 2021-11-22 09:33:07 · 590 阅读 · 0 评论 -
09_反序列化
我们讲述了 KafkaProducer 对应的序列化器,那么与此对应的 KafkaConsumer 就会有反序列化器。Kafka 所提供的反序列化器有 ByteBufferDeserializer、ByteArrayDeserializer、BytesDeserializer、DoubleDeserializer、FloatDeserializer、IntegerDeserializer、LongDeserializer、ShortDeserializer、StringDeserializer,它们分别用于原创 2021-11-22 09:20:29 · 336 阅读 · 0 评论 -
08_消费者客户端开发
在了解了消费者与消费组之间的概念之后,我们就可以着手进行消费者客户端的开发了。本节主要介绍目前流行的新消费者(Java 语言编写的)客户端。一个正常的消费逻辑需要具备以下几个步骤:1 配置消费者客户端参数及创建相应的消费者实例。2 订阅主题。3 拉取消息并消费。4 提交消费位移。5 关闭消费者实例。代码清单8-1所示:package com.hlg.kafka;import lombok.extern.slf4j.Slf4j;import org.apache.kafka.client原创 2021-11-22 09:14:21 · 298 阅读 · 0 评论 -
07_消费者与消费组
与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息。不过在使用 KafkaConsumer 消费消息之前需要先了解消费者和消费组的概念,否则无法理解如何使用 KafkaConsumer。本章首先讲解消费者与消费组之间的关系,进而再细致地讲解如何使用 KafkaConsumer。消费者(Consumer)负责订阅 Kafka 中的主题(Topic),并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在 Kafka 的消费理念中还有一层消费组(C原创 2021-11-21 19:06:26 · 157 阅读 · 0 评论 -
06_重要的生产者参数
在 KafkaProducer 中,除了第3节提及的3个默认的客户端参数,大部分的参数都有合理的默认值,一般不需要修改它们。不过了解这些参数可以让我们更合理地使用生产者客户端,其中还有一些重要的参数涉及程序的可用性和性能,如果能够熟练掌握它们,也可以让我们在编写相关的程序时能够更好地进行性能调优与故障排查。下面挑选一些重要的参数进行讲解。1.1 acks这个参数用来指定分区中必须要有多少个副本收到这条消息,之后生产者才会认为这条消息是成功写入的。acks 是生产者客户端中一个非常重要的参数,它涉及消息的原创 2021-11-21 18:34:22 · 217 阅读 · 0 评论 -
05_生产者客户端原理分析
1 整体架构消息在真正发往 Kafka 之前,有可能需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,那么在此之后又会发生什么呢?下面我们来看一下生产者客户端的整体架构,如下图所示。整个生产者客户端由两个线程协调运行,这两个线程分别为主线程和 Sender 线程(发送线程)。在主线程中由 KafkaProducer 创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器(RecordAccumulator,也原创 2021-11-21 17:19:11 · 113 阅读 · 0 评论 -
04_序列化-分区器-生产者拦截器
1 序列化生产者需要用序列化器(Serializer)把对象转换成字节数组才能通过网络发送给 Kafka。而在对侧,消费者需要用反序列化器(Deserializer)把从 Kafka 中收到的字节数组转换成相应的对象。在代码清单3-1中:为了方便,消息的 key 和 value 都使用了字符串,对应程序中的序列化器也使用了客户端自带的 org.apache.kafka.common.serialization.StringSerializer,除了用于 String 类型的序列化器,还有 ByteAr原创 2021-11-21 10:57:01 · 170 阅读 · 0 评论 -
02_Kafka伪分布式搭建-1
1zookeeper的搭建下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/1解压2修改配置文件将解压目录conf中的zoo_sample.cfg复制一份,并重命名为zoo.cfg,对zoo.cfg进行修改:##存放数据dataDir=D:\\zookeeper\\data#存放日志dataLogDir=D:\\zookeeper\\log3启动zookeeperD:\zookeeper\zookeeper-3.4.8\bin&原创 2021-05-23 18:06:41 · 143 阅读 · 0 评论 -
03_生产者-客户端开发
从编程的角度而言,生产者就是负责向 Kafka 发送消息的应用程序。客户端开发一个正常的生产逻辑需要具备以下几个步骤:1 配置生产者客户端参数及创建相应的生产者实例。2 构建待发送的消息。3 发送消息。4 关闭生产者实例。代码清单3-1:package com.hlg.kafka;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.ProducerR原创 2021-11-21 10:18:20 · 94 阅读 · 0 评论 -
02_安装与配置
1 JDK的安装与配置2 ZooKeeper安装与配置ZooKeeper 是安装 Kafka 集群的必要组件,Kafka 通过 ZooKeeper 来实施对元数据信息的管理,包括集群、broker、主题、分区等内容。ZooKeeper 是一个开源的分布式协调服务,是 Google Chubby的一个开源实现。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、配置维护等功能。在 ZooKeeper 中共有3个角色:l原创 2021-11-21 09:23:10 · 295 阅读 · 0 评论 -
01_初识Kafka
1 初识KafkaKafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。Kafka 之所以受到越来越多的青睐,与它所“扮演”的三大角色是分不开的:1 消息系统: Kafka 和传统的消息中间件都具备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复原创 2021-11-20 16:26:17 · 109 阅读 · 0 评论