【Kafka系列】Kafka安装与部署

192 阅读8分钟

【Kafka系列】Kafka安装与部署

欢迎关注,​分享更多原创技术内容~

微信公众号:ByteRaccoon、知乎:一只大狸花啊、稀土掘金:浣熊say

微信公众号海量Java、数字孪生、工业互联网电子书免费送~

Docker搭建Kafka单机版

​ 要在Docker中安装和运行Apache Kafka,你可以使用官方提供的Docker镜像。以下是在Docker上安装Kafka的基本步骤:

步骤 1:Zookeeper

​要在Docker中安装ZooKeeper,你可以使用ZooKeeper官方提供的Docker镜像。以下是安装ZooKeeper的步骤:

  1. 使用Docker运行ZooKeeper容器:
docker run --name zookeeper -p 2181:2181 -d zookeeper

这将在Docker中启动一个ZooKeeper容器,将ZooKeeper默认端口2181映射到主机的2181端口。你可以根据需要更改端口映射。

  1. 验证ZooKeeper容器是否正在运行:
docker ps

你应该看到名为"zookeeper"的容器正在运行。

  1. 使用ZooKeeper客户端连接到ZooKeeper服务器:

你可以使用ZooKeeper客户端工具连接到ZooKeeper服务器,例如Apache ZooKeeper提供的zkCli.sh脚本。执行以下命令以连接到ZooKeeper容器:

docker exec -it zookeeper zkCli.sh

现在,你可以在ZooKeeper容器上执行ZooKeeper操作,管理ZooKeeper数据。

这样,你就成功在Docker中安装和运行了ZooKeeper。你可以根据需要配置ZooKeeper的更多参数,但以上步骤会为你提供一个基本的ZooKeeper实例。

步骤 2:下载Kafka Docker镜像

你可以在Docker Hub上找到官方的Apache Kafka Docker镜像。使用以下命令从Docker Hub下载Kafka镜像:

docker pull wurstmeister/cp-kafka

这将下载最新版本的Kafka Docker镜像。

步骤 3:创建Kafka容器

使用以下命令创建一个Kafka容器:

docker run -d --name kafka -p 9193:9092 -v /home/docker/kafka/config:/etc/kafka \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://xxx.25.208.118:9193 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_ADVERTISED_HOST_NAME=xxx.25.208.118 \
-e KAFKA_ZOOKEEPER_CONNECT=xxx.25.208.118:2181 \
wurstmeister/kafka

上述命令做了以下几件事:

  • -d: 这是Docker命令的选项,表示在后台运行容器。

  • --name kafka: 这个选项为容器指定一个名字,即容器的名称为 "kafka"。

  • -p 9193:9092: 这个选项用于将容器端口映射到主机端口。容器内部的Kafka端口9092被映射到主机上的端口9193,主要是为了防止端口扫描。

  • -v /home/docker/kafka/config:/etc/kafka: 这个选项用于将主机文件系统上的Kafka配置目录/home/docker/kafka/config挂载到容器内部的/etc/kafka目录。这样你可以将自定义的Kafka配置文件放在主机上,并通过挂载使其在容器内生效。

  • --network host: 这个选项将容器连接到主机的网络命名空间,这允许容器与主机共享网络设置,以便容器可以使用主机的网络接口。

  • -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://xxx.215.208.118:9193: 这个选项通过环境变量KAFKA_ADVERTISED_LISTENERS设置了Kafka的广告监听器。它告诉Kafka容器要公开的监听地址和端口。在这里,Kafka容器会在地址xxx.215.208.118的端口9193上公开。

  • -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092: 这个选项通过环境变量KAFKA_LISTENERS设置了Kafka的监听器。它允许Kafka容器接受来自任何主机的连接,0.0.0.0表示所有可用的网络接口。

  • -e KAFKA_ADVERTISED_HOST_NAME=xxx.215.208.118: 这个选项通过环境变量KAFKA_ADVERTISED_HOST_NAME设置了Kafka的广告主机名。这是广告给客户端的Kafka主机名。

  • -e KAFKA_ZOOKEEPER_CONNECT=xxx.215.208.118:2181: 这个选项通过环境变量KAFKA_ZOOKEEPER_CONNECT设置了Kafka的ZooKeeper连接地址,以便Kafka能够与ZooKeeper协调器进行通信。

步骤 4:验证Kafka容器是否运行

使用以下命令检查Kafka容器是否正在运行:

docker ps

你应该看到名为"kafka"的容器在运行中。

步骤 5:使用Kafka

现在,你可以使用Kafka了。你可以在容器中创建主题、生产消息和消费消息。你也可以在本地主机上使用Kafka客户端来连接到Kafka容器。就是在Docker中安装和运行Apache Kafka的基本步骤。请根据你的实际需求进行进一步配置和使用。

Docker搭建Kafka集群

​要在Docker上搭建Kafka集群,您需要执行以下步骤:

  1. 安装Docker和Docker Compose:如果您尚未安装Docker和Docker Compose,请先安装它们。您可以在Docker官方网站上找到安装说明。

  2. 创建一个Kafka集群配置文件:创建一个名为docker-compose.yml的文件,其中包含Kafka集群的定义。以下是一个简单的示例:

version: '3.5'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
  kafka1:
    image: wurstmeister/kafka
    container_name: kafka1
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 42.193.22.180         ## 广播主机名称,一般用IP指定
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_LISTENERS: PLAINTEXT://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://42.193.22.180:9092
      KAFKA_BROKER_ID: 1
  kafka2:
    image: wurstmeister/kafka
    container_name: kafka2
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9093:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 42.193.22.180         ## 广播主机名称,一般用IP指定
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_PORT: 9093
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_LISTENERS: PLAINTEXT://:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://42.193.22.180:9093
      KAFKA_BROKER_ID: 2
  kafka3:
    image: wurstmeister/kafka
    container_name: kafka3
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9094:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 42.193.22.180         ## 广播主机名称,一般用IP指定
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_PORT: 9094
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_LISTENERS: PLAINTEXT://:9094
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://42.193.22.180:9094
      KAFKA_BROKER_ID: 3

  kafka-manager:
    image: sheepkiller/kafka-manager
    container_name: kafka-manager
    environment:
        ZK_HOSTS: 42.193.22.180                         ## 修改:宿主机IP
    ports:
      - "9009:9000"
      

下面是一个单机版的docker-compose.yml的配置文件

version: '3.5'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 42.193.22.180         ## 广播主机名称,一般用IP指定
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_LISTENERS: PLAINTEXT://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://42.193.22.180:9092
      KAFKA_BROKER_ID: 1
  kafka-manager:
    image: sheepkiller/kafka-manager
    container_name: kafka-manager
    environment:
        ZK_HOSTS: 42.193.22.180                         ## 修改:宿主机IP
    ports:
      - "9009:9000"
      

在上面的示例中,我们定义了一个包含一个Zookeeper节点和两个Kafka节点的Docker Compose文件。您可以根据需要添加更多Kafka节点。请注意,您可以调整Kafka节点的配置参数,以满足您的需求。

  1. 启动Kafka集群:在包含docker-compose.yml文件的目录中,执行以下命令启动Kafka集群:
docker-compose up -d

这将启动Zookeeper和Kafka节点,并将它们放入后台运行。

  1. 验证Kafka集群:您可以使用Kafka命令行工具来验证Kafka集群是否正常工作。首先,通过以下方式连接到其中一个Kafka节点:
docker exec -it <kafka_container_id> /bin/bash

然后,使用Kafka命令行工具执行一些命令,例如创建一个主题,生产消息,消费消息等。

  1. 清理:当您完成测试后,可以通过以下命令停止和删除Docker容器:
docker-compose down

这样就完成了在Docker上搭建Kafka集群的过程。根据您的需求,您可以根据需要调整配置和节点数量。请注意,上述示例使用的是Confluent的Kafka镜像,您可以根据自己的要求选择其他Kafka镜像。

Spring Boot集成Kafka

  • pom文件中导入依赖:
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
  • 配置application.yml
# Kafka服务器的地址和端口,以逗号分隔的列表
spring.kafka.bootstrap-servers: 42.193.22.180:9092,42.193.22.180:9093,42.193.22.180:9094

# Kafka生产者配置
spring.kafka.producer:
  # 用于键和值的序列化器
  key-serializer: org.apache.kafka.common.serialization.StringSerializer
  value-serializer: org.apache.kafka.common.serialization.StringSerializer
  # 指定生产者要求经纪人确认的方式(1表示leader确认)
  acks: 1

# Kafka消费者配置
spring.kafka.consumer:
  # 用于键和值的反序列化器
  key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
  value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
  # 消费者组的标识
  group-id: my-group
  # 允许自动提交消费位移
  enable-auto-commit: true
  # 自动提交消费位移的时间间隔
  auto-commit-interval: 1000
  # 其他Kafka消费者属性
  properties:
    # 安全协议(PLAINTEXT表示明文)
    security.protocol: PLAINTEXT
    # 请求超时时间
    request.timeout.ms: 60000

# Kafka消息监听器配置
spring.kafka.listener:
  # 消息监听器类型(batch表示批处理模式)
  type: batch

# Kafka配置属性
spring.kafka.properties:
  # Kafka版本
  kafka:
    version: 3.4.1
  # 每次拉取的最大记录数
  max.poll.records: 100
  # 消息监听器的并发消费者数
  concurrency: 3
  • 简单生产者:
package com.ts.kafkademo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
@EnableScheduling
public class KafkaService {

    private final KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    public KafkaService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendMessage(String topic, String message) {
        kafkaTemplate.send(topic, message);
    }

    public void sendMessgae(String topic,String message,String key,Integer partion){
        kafkaTemplate.send(topic,partion,key,message);
    }


    @Scheduled(cron = "* * * * * ?")
    public void sendMsg(){
        sendMessage("my-topic","msg...");
    }
}
  • 简单消费者:

@Service
public class KafkaConsumerService {

    // 使用@KafkaListener注解来监听Kafka消息
    @KafkaListener(topicPartitions = {
            // 定义TopicPartition,指定要监听的主题("my-topic")和分区("0")
            @TopicPartition(topic = "my-topic", partitions = { "0" }),
    }, groupId = "my-group")
    public void consumeMessage(String message) {
        // 当接收到消息时,打印消息内容
        System.out.println("Received message: " + message);
    }
}

总结

本节主要介绍了Kafka单机版本和集群版本的搭建方式,所有的搭建方式都需要依赖Zookeeper来作为分布式协调中心,帮助Kafka进行选主等操作。最终通过Spring Boot快速集成了Kafka并进行了简单的用例测试,帮我们了解了Kafka的部署和简单应用。