Docker搭建kafka集群

Docker搭建kafka集群

kafka概念

  • broker:消息中间件处理节点,一个broker就是一个kafka节点,一个或者多个broker就组成了一个kafka集群
  • topic:kafka根据topic对消息进行归类,发布到kafka集群的每个消息,都要指定一个topic
  • producer:消息生产者,向broker发送消息的客户端
  • consumer:消息消费者,从broker读取消息的客户端

kafka特性描述

  • 生产者将消息发送给broker,broker会将消息保存在本地的日志文件中
  • 消息的保存是有序的,通过offset偏移量来描述消息的有序性
  • 消费者消费消息时,也是通过offset来描述当前要消费的那条消息的位置

消息相关

  • 如果多个消费者在同一个消费者组中,那么只有一个消费者可以收到订阅topic中的消息,换言之,同一个消费组中只有一个消费者能收到一个topic中的消息
  • 多播消息:不同的消费组订阅同一个topic,不同的消费组中只有一个消费者能收到消息,实际上也是多个消费组中的多个消费者收到了消息

Controller、Rebalance、HW

Controller

  • Kafka集群中的broker在zk中创建节点的时候,会有一个临时节点序号,序号最小的节点,会被当做集群的controller,负责管理集群中的所有分区和副本的状态
  • 当某个分区的leader副本出现故障,由控制器负责为该分区选举新的leader副本
  • 当检测到某个分区的ISR集合发生变化的时候,由控制器负责通知所有的broker更新其元数据信息
  • 当使用kafka-topic.sh脚本为某个topic增加分区数量的时候,同样还是由控制器负责让新分区被其它节点感知到

Rebalance

  • 前提是消费者没有指定分区进行消费,当消费组中的消费者或者分区关系发生变化的时候,就会触发rebalance机制,这个机制会调整消费者消费哪个分区
  • 在触发rebalance机制之前,消费者消费哪个分区有三种策略:
    • range:通过公示来计算某个消费者消费哪个分区
    • 轮询:所有消费者轮着消费
    • sticky:在触发了rebalance后,在消费者消费的原分区不变的基础上进行调整

HW和LEO

  • LEO是某个副本最后消息的消息位置(log-end-offset)
  • HW是已完成同步的位置,消息在写入broker时,且每个broker都完成了这条消息的同步后,hw才会变化,这之前,消费者是消费不到这条消息的,同步完成后,HW调整后,消费者才能消费这条消息,这样做是为了方式消息丢失

kafka消息积压问题

  • 消息积压问题的出现:消息的消费者的消费速度远远赶不上生产者生产消息的速度,导致kafka中有大量的数据没有被消费,随着没有被消费的消息越来越多,消费者寻址的性能越来越差,最后导致整个kafka对外提供的服务的性能越来越差,从而造成其它服务的访问速度很慢,造成服务雪崩。
  • 消息积压的解决方案:
    • 在这个消费者中,使用多线程,充分利用机器的性能进行消费消息;
      创建多个消费组,多个消费者,部署到其它机器上,一起消费,提高消费者消费消息的速度;
    • 创建一个消费者,该消费者在kafka另建一个主题,配上多个分区,多个分区再配上多个消费者,该消费者poll下来的消息,直接转发到新的主题上,使用多个消费者消费新主题的消息–该方法不常用

Docker 搭建kafka集群

  • docker下载kafka镜像
docker search kafka
docker pull bitnami/kafka
  • 启动3个kafka节点,组成集群
docker run -d --name kafka1 --network mynetwork \-p 9092:9092 \--env KAFKA_BROKER_ID=0 \--env KAFKA_ZOOKEEPER_CONNECT=192.168.228.2:2181,92.168.228.3:2181,92.168.228.4:2181 \--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.228.5:9092 \--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 bitnami/kafka docker run -d --name kafka2 --network mynetwork \-p 9093:9092 \--env KAFKA_BROKER_ID=1 \--env KAFKA_ZOOKEEPER_CONNECT=192.168.228.2:2181,92.168.228.3:2181,92.168.228.4:2181 \--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.228.6:9092 \--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 bitnami/kafka docker run -d --name kafka3 --network mynetwork \-p 9094:9092 \--env KAFKA_BROKER_ID=2 \--env KAFKA_ZOOKEEPER_CONNECT=192.168.228.2:2181,92.168.228.3:2181,92.168.228.4:2181 \--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.228.7:9092 \--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 bitnami/kafka 
  • 启动kafka集群节点
docker start kafka1
docker start kafka2
docker start kafka3
  • springboot引用kafka的生产者和消费者
#springboot中kafka的配置信息
server:port: 8080servlet:context-path: /
spring:application:name: mvcLearn
#  mvc:
#    static-path-pattern: /static/**web:resources:static-locations:- classpath:/hwc/kafka:bootstrap-servers: 127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094producer:acks: 1retries: 3batch-size: 16384buffer-memory:  33554432key-serializer: org.apache.kafka.common.serialization.StringSerializervalue-serializer: org.apache.kafka.common.serialization.StringSerializerconsumer:group-id: default-groupenable-auto-commit: falseauto-offset-reset: earliestkey-deserializer: org.apache.kafka.common.serialization.StringDeserializervalue-deserializer:  org.apache.kafka.common.serialization.StringDeserializerlistener:ack-mode: manual_immediate
//Kafka生产者controller,接收前段消息,发送至kafka集群
package com.huwc.mvclearn.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyKafkaControlller {private final static String TOPIC_NAME = "my_two_partition_topic";@Autowiredprivate KafkaTemplate<String, String> template ;@GetMapping("/send/{msg}")public String sendMessage(@PathVariable("msg") String msg){template.send(TOPIC_NAME, 0, "key", msg);return "send success" ;}
}/**
*kafka消费者,使用@KafkaListener注解注册一个消费者
*
**/
package com.huwc.mvclearn.consumer;import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.stereotype.Component;@Component
public class MyKafkaConsumer {@KafkaListener(topics = "my_two_partition_topic", groupId = "MyGroup1")public void listenGroup(ConsumerRecord<String, String> record, Acknowledgment ack){String key = record.key();String value = record.value();System.out.println("key = " + key);System.out.println("value = " + value);System.out.println("record = " + record);ack.acknowledge();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Authing 分级管理员重磅上线,实现权限超细粒度分级管

数字化时代企业的现代化建设日益重要&#xff0c;身份权限管理系统的数字化变革已经成为企业数字化转型的核心要素之一&#xff0c;同时也对身份权限管理的“最后一公里”提出了更高的要求。管理员作为关键人员&#xff0c;往往掌握整个企业的数据核心访问权限&#xff0c;需要…

Seata AT TM->RC->RM一次完整的交互过程

原理 TM两阶段&#xff1a; 阶段1&#xff1a;TM向TC申请全局事务&#xff0c;netty客户端发起了一次记录xid的请求 阶段2&#xff1a;TC协调之后&#xff0c;决定执行RM是否提交或者回滚。 spring公共组件部分 1、SeataAutoConfiguration类加载 利用springboot自动装配机…

js实现前端下载图片和文件资料

说明&#xff1a;下载图片和文档资料是两种不同的方式&#xff0c;所以需要先判断下载的是图片还是word&#xff0c;excel等文件资料 目录 1.文件资料下载&#xff1a; 2.图片资源下载 1.文件资料下载&#xff1a; window.location.href 文件路径; handleClick(item) {let…

Delphi套接字库:构建高效网络应用的利器

在Delphi编程语言中&#xff0c;套接字库&#xff08;Socket Library&#xff09;是一个关键的组成部分&#xff0c;为开发者提供了在网络环境下构建高效应用的强大工具。套接字库通过简化网络通信的复杂性&#xff0c;使得开发者能够轻松地实现客户端和服务器之间的数据传输&a…

如何使用Spoofy检测目标域名是否存在欺骗攻击风险

关于Spoofy Spoofy是一款功能强大的域名安全检测工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松检测单个目标域名或域名列表中的域名是否存在遭受欺诈攻击的风险。 该工具基于纯Python开发&#xff0c;可以根据SPF和DMARC记录来检测和判断目标域名是否可…

C++ 类和对象 (上)

类的引入&#xff1a; 由于C语言是面向过程的编程语言&#xff0c;我们在完成一件事的时候通常习惯将一件事拆分成一个一个小过程来实现&#xff0c;而到了C就习惯将一件事分成不同的模块&#xff0c;交给不同的对象来处理&#xff0c;每一个对象中承载着数据类型和函数。 &am…

Jackson进行Json反序列化对于一个小写字母开头后跟大写字母无法识别反序列成功问题

问题描述 json数据&#xff1a;{“pTargetId”:“123”} javaBean&#xff1a; Datapublic static class Test {private String pTargetId;}运行下面代码&#xff1a; public static void main(String[] args) throws JsonProcessingException {String json "{\"pT…

We are a team - 华为OD统一考试

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 总共有 n 个人在机房&#xff0c;每个人有一个标号 (1<标号<n) &#xff0c;他们分成了多个团队&#xff0c;需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中&#xff0c;具体的: 消息构成为 a b …

智慧启航:机场管理系统的革新与飞机航天展馆的视觉盛宴

随着科技的飞速发展&#xff0c;我们的生活方式正在不断地被改变和提升。而在航空领域&#xff0c;这种变化则更加明显。从机场的智慧管理系统大屏&#xff0c;到飞机航天展馆的三维可视化&#xff0c;再到飞机涡轮发动机的3D模型&#xff0c;科技的力量正在带我们进入一个前所…

ArkUI按钮组件深入学习:通过点击按钮实现图片大小调整效果

文章目录 前言Button组件控制 Button 样式实现点击按钮改变图片大小文章总结技术回顾前言 在前面几节课中,我们已经学习了 ArkUI 提供的一些常见组件,通过一个小案例实现了 image text 和 text input 组件的使用。我们成功地让用户通过输入来改变图片的宽度,从而实现了一个…

bat命令清理Window应用注册表(Unity开发Window应用)

bat命令清理Window应用注册表&#xff08;Unity开发Window应用&#xff09; 介绍出现的问题方案一方案二方案二解决方案1. 首先使用【Win】【R】组合快捷键&#xff0c;快速打开运行命令框&#xff0c;在打开后面键入命令&#xff1a;【Regedit】2. 完后后按回车键&#xff08;…

(一)window使用VMware运行Centos7

前言&#xff1a;为了学习微服务环境搭建&#xff0c;需要自己重新弄一套linux环境&#xff0c;捡起几年前使用VMware虚拟机运行linux的知识。。。不想买云盘&#xff0c;好贵 一、下载安装包 WMware安装包下载 附赠一个破解码&#xff1a;JU090-6039P-08409-8J0QH-2YR7F 如…

【Unity美术】Unity工程师对3D模型需要达到的了解【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

C语言,指针链表详解解说及代码示例

C语言&#xff0c;指针链表详解解说及代码示例 指针链表是一种常用的数据结构&#xff0c;用于存储和组织数据。它由一系列节点组成&#xff0c;每个节点包含数据和一个指向下一个节点的指针。通过这种方式&#xff0c;可以动态地添加、删除和访问节点&#xff0c;实现灵活的数…

探索微软Edge:使用方法和心得分享

学习目标&#xff1a; 了解微软Edge的基本功能和使用方法。掌握在微软Edge上进行浏览、搜索和书签管理的技巧。学习如何使用微软Edge进行隐私和安全管理。探索微软Edge的扩展和其他高级功能。 学习内容&#xff1a; 微软Edge的简介&#xff1a;了解微软Edge的起源、特点和与其…

需求:多笔流水的金额分配给多个订单,确保流水总金额和订单总金额一致

&#x1f4da;目录 需求业务解释解决代码效果 需求 按照一定规则将多笔流水的金额分配给多个订单&#xff0c;确保流水总金额和订单总金额一致。 业务解释 之前系统做了个功能&#xff0c;允许对订单进行录错退款&#xff0c;并且重新关联新的订单&#xff0c;审核通过完成后…

logback1.2.3版本中日志文件时间自定义

假如在logback配置文件中存在以下配置 <appender name"custom_log_file" class"ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePatter…

逻辑卷学习

磁盘分区的缺点 1.无法扩容 2.必须使用的空间 3.没有备份: 一、逻辑卷的定义 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备&#xff0c;并允许用户动态调整文件系统的大小…

macOS编译ckb-next

macOS x86 成功&#xff0c;下一步&#xff0c;测试&#xff1a;m1、m2、m3 。 1、Homebrew # 三选一 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # /bin/bash -c "$(curl -fsSL https://raw.gith…

Android Camera相关类功能整理

1.Camera Java相关类 代码目录&#xff1a;frameworks/base/core/java/android/hardware/camera2/ CameraManager&#xff1a;camera系统服务管理类&#xff0c;用于监测、获取特征值和连接Camera设备。 CameraManager.CameraManagerGlobal:全局camera Manager实例&#xff…