Docker部署Kafka

Kafka是什么

Kafka是一个开源的时间流处理平台,由Scala和Java编写,持久化本质是分布式事务日志架构的大规模发布订阅消息队列

为什么要用Kafka

优点:

  • 解耦
  • 异步
  • 流量削峰填谷

缺点:

  • 可用性降低
  • 复杂性提高
  • 一致性问题

Kafka能做什么

  • 消息系统:用户下单后将订单信息发送到Kafka主题中,各处理订单的微服务可以从Kafka中消费订单消息,进行库存检查、支付处理、订单确认等操作
    • 预警通知:当库存到达某个阈值时向Kafka发生预警信息,其他采购系统或管理人员系统订阅预警信息
  • 物流跟踪:将物流运输状态更新发送到Kafka,其他系统订阅状态获取物流信息
  • 日志收集
  • 流式处理

Kafka不能做什么

  • 限时订单

Kafka架构

在这里插入图片描述

  • Producer:消息生产者,向Kafka主题(Topic)发送消息(Message)的客户端应用程序或进程
  • Consumer:消息消费者,从kafka主题(Topic)读取消息的客户端应用程序或进程
  • ConsumerGroup:消费者组,由一个或多个消费者组成,共同消费一个或多个主题的消息,默认从最新偏移量开始消费,将auto.offset.reset设置为earliest从头开始消费
  • Broker:代理,Kafka集群中的一个服务器节点
  • Topic:主题,一类消息的逻辑分类
  • Partition:分区,为实现可扩展性和高吞吐量,一个主题可以被分成多个分区
  • Message:消息,生产者发送到Kafka主题和消费者从主题读取的数据单元
  • Partition:分区,一个Topic默认一个分区
  • Offset:偏移量,每个分区写入事件的序号,从0开始

Topic 主题

主题用于存储事件

  • 事件也称为消息、记录,如支付记录、地理位置、运输订单、遥测数据、日志

AMQP

Docker部署Kafka

以前需要用到zookeeper,现在可以直接用Kraft

一、命令部署Kafka

由于docker部署一般在开发环境,监听了所有端口
ADVERTISED_LISTENERS必须设置外部连接Kafka broker的地址,本机开发设置为localhost,服务器开发设置为宿主机ip地址

  • CONTROLLER:管理和协调集群的各种元数据操作以及分区(Partition)的分配等重要任务
  • 不同的协议监听的端口必须不同

  • LISTENER_SECURITY_PROTOCOL_MAP必须指定协议映射

  • PLAINTEXT:明文协议,使用未加密的TCP进行通信
  • INTERNAL:内部网络,可以使用服务发现机制
  • EXTERNAL:外部网络,指定可以从外部监听的地址
docker run -it -d \
-p 9092:9092 \
--name broker \
--network pub-network \
--restart always \
-e KAFKA_NODE_ID=1 \
-e KAFKA_PROCESS_ROLES=broker,controller \
-e KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 
<think>好的,我现在需要帮助用户了解如何使用Docker部署Kafka。首先,用户提到了参考中的两个引用,都是关于Docker部署Kafka的内容,我需要结合这些信息来构建答案。 首先,我应该先回忆一下Docker部署Kafka的基本步骤。通常,Kafka依赖Zookeeper,所以需要同时部署两者。用户提供的引用里提到了使用docker-compose.yml配置文件,这可能是一个关键点。根据引用1,使用docker-compose可以创建并启动Zookeeper和Kafka的容器,这应该是标准做法。 接下来,我需要确保步骤正确。首先,创建Docker网络,这样容器之间可以通信。引用2提到需要创建Docker网络,这可能是在docker-compose中定义的网络,或者需要预先创建。不过通常docker-compose会自动处理网络,但有时候用户可能需要自定义。可能需要检查这一点。 然后是编写docker-compose.yml文件。这里需要确定正确的镜像版本。比如,使用confluentinc的镜像还是wurstmeister的镜像?用户提供的引用没有明确说明,但常见的教程中常用wurstmeister/kafka和zookeeper。不过引用1中的例子可能使用的是confluentinc的镜像,或者其他的。需要确认。不过为了通用性,可能使用较常见的配置。 另外,用户可能希望示例配置是可直接运行的,所以需要确保docker-compose.yml的语法正确。比如,定义服务、端口映射、环境变量等。Kafka需要配置环境变量如KAFKA_ADVERTISED_LISTENERS,这样才能被外部访问,这点很重要,否则客户端可能无法连接。 然后,启动容器的命令是docker-compose up -d,这应该没问题。测试部分可能需要使用kafka的命令行工具来创建主题、生产者和消费者,或者使用Python客户端。用户引用的参考2提到了Python使用Kafka的基础用法,所以可能需要在回答中包含Python的示例代码,但用户的问题主要是部署,所以可能放在相关问题里。 另外,用户可能遇到的问题包括网络配置不正确、端口未暴露、环境变量设置错误等,是否需要给出常见问题的解决方法?不过用户当前的问题主要是部署教程,所以可能先专注于步骤,然后在相关问题中提及。 还要注意,引用中的例子可能使用了特定的配置,比如Zookeeper和Kafka的端口映射,比如2181和9092,这些是默认端口,需要确保在docker-compose.yml中正确映射。同时,KAFKA_ADVERTISED_LISTENERS需要设置为宿主机的IP或者Docker主机名,否则外部客户端无法连接。这里可能需要提醒用户根据实际情况修改。 总结步骤应该是: 1. 安装DockerDocker Compose。 2. 创建docker-compose.yml文件,定义Zookeeper和Kafka服务。 3. 启动容器。 4. 测试Kafka是否正常运行。 在测试部分,可以建议使用kafka命令行工具进入容器执行命令,或者使用Python客户端进行测试。比如,使用kafka-python库创建生产者和消费者,如引用2提到的。 最后,生成相关问题,可能需要包括优化配置、常见错误、集群部署、监控、与Python集成等。 需要确保所有的命令和配置正确,语法正确,比如在docker-compose.yml中的缩进是否正确,环境变量是否正确设置。同时,提醒用户如果遇到问题,检查端口是否被占用,防火墙设置,以及advertised.listeners的配置是否正确。</think>以下是如何使用Docker部署Kafka的详细教程及配置示例: ### 一、Docker部署Kafka步骤 #### 1. 创建Docker网络(可选但推荐) ```bash docker network create kafka-net ``` #### 2. 编写`docker-compose.yml`文件 ```yaml version: '3' services: zookeeper: image: bitnami/zookeeper:latest container_name: zookeeper ports: - "2181:2181" networks: - kafka-net environment: ALLOW_ANONYMOUS_LOGIN: "yes" kafka: image: bitnami/kafka:latest container_name: kafka ports: - "9092:9092" networks: - kafka-net environment: KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 depends_on: - zookeeper networks: kafka-net: driver: bridge ``` #### 3. 启动服务 ```bash docker-compose up -d ``` #### 4. 验证服务状态 ```bash docker ps -a | grep -E "kafka|zookeeper" ``` ### 二、基础功能测试 #### 1. 创建测试主题 ```bash docker exec -it kafka /opt/bitnami/kafka/bin/kafka-topics.sh \ --create --topic test-topic \ --bootstrap-server localhost:9092 \ --partitions 1 --replication-factor 1 ``` #### 2. 启动生产者 ```bash docker exec -it kafka /opt/bitnami/kafka/bin/kafka-console-producer.sh \ --topic test-topic \ --bootstrap-server localhost:9092 ``` #### 3. 启动消费者 ```bash docker exec -it kafka /opt/bitnami/kafka/bin/kafka-console-consumer.sh \ --topic test-topic \ --bootstrap-server localhost:9092 \ --from-beginning ``` ### 三、Python客户端示例 ```python from kafka import KafkaProducer, KafkaConsumer # 生产者 producer = KafkaProducer(bootstrap_servers='localhost:9092') producer.send('test-topic', b'Hello Kafka') producer.flush() # 消费者 consumer = KafkaConsumer('test-topic', bootstrap_servers='localhost:9092') for msg in consumer: print(f"Received: {msg.value.decode('utf-8')}") ``` ### 配置说明 1. `KAFKA_CFG_ADVERTISED_LISTENERS`需设置为宿主机的IP或域名,若在远程服务器部署应改为服务器公网IP 2. 持久化数据可添加卷映射: ```yaml volumes: - ./kafka_data:/bitnami/kafka ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cci497

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值