【Kafka系列】Kafka安装与部署
欢迎关注,分享更多原创技术内容~
微信公众号:ByteRaccoon、知乎:一只大狸花啊、稀土掘金:浣熊say
微信公众号海量Java、数字孪生、工业互联网电子书免费送~
Docker搭建Kafka单机版
要在Docker中安装和运行Apache Kafka,你可以使用官方提供的Docker镜像。以下是在Docker上安装Kafka的基本步骤:
步骤 1:Zookeeper
要在Docker中安装ZooKeeper,你可以使用ZooKeeper官方提供的Docker镜像。以下是安装ZooKeeper的步骤:
- 使用Docker运行ZooKeeper容器:
css
docker run --name zookeeper -p 2181:2181 -d zookeeper
这将在Docker中启动一个ZooKeeper容器,将ZooKeeper默认端口2181映射到主机的2181端口。你可以根据需要更改端口映射。
-
验证ZooKeeper容器是否正在运行:
docker ps
你应该看到名为"zookeeper"的容器正在运行。
- 使用ZooKeeper客户端连接到ZooKeeper服务器:
你可以使用ZooKeeper客户端工具连接到ZooKeeper服务器,例如Apache ZooKeeper提供的zkCli.sh脚本。执行以下命令以连接到ZooKeeper容器:
bash
docker exec -it zookeeper zkCli.sh
现在,你可以在ZooKeeper容器上执行ZooKeeper操作,管理ZooKeeper数据。
这样,你就成功在Docker中安装和运行了ZooKeeper。你可以根据需要配置ZooKeeper的更多参数,但以上步骤会为你提供一个基本的ZooKeeper实例。
步骤 2:下载Kafka Docker镜像
你可以在Docker Hub上找到官方的Apache Kafka Docker镜像。使用以下命令从Docker Hub下载Kafka镜像:
bash
docker pull wurstmeister/cp-kafka
这将下载最新版本的Kafka Docker镜像。
步骤 3:创建Kafka容器
使用以下命令创建一个Kafka容器:
arduino
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集群,您需要执行以下步骤:
-
安装Docker和Docker Compose:如果您尚未安装Docker和Docker Compose,请先安装它们。您可以在Docker官方网站上找到安装说明。
-
创建一个Kafka集群配置文件:创建一个名为docker-compose.yml的文件,其中包含Kafka集群的定义。以下是一个简单的示例:
yaml
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的配置文件
yaml
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节点的配置参数,以满足您的需求。
-
启动Kafka集群:在包含docker-compose.yml文件的目录中,执行以下命令启动Kafka集群:
docker-compose up -d
这将启动Zookeeper和Kafka节点,并将它们放入后台运行。
- 验证Kafka集群:您可以使用Kafka命令行工具来验证Kafka集群是否正常工作。首先,通过以下方式连接到其中一个Kafka节点:
bash
docker exec -it <kafka_container_id> /bin/bash
然后,使用Kafka命令行工具执行一些命令,例如创建一个主题,生产消息,消费消息等。
-
清理:当您完成测试后,可以通过以下命令停止和删除Docker容器:
docker-compose down
这样就完成了在Docker上搭建Kafka集群的过程。根据您的需求,您可以根据需要调整配置和节点数量。请注意,上述示例使用的是Confluent的Kafka镜像,您可以根据自己的要求选择其他Kafka镜像。
Spring Boot集成Kafka
- pom文件中导入依赖:
xml
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
- 配置application.yml
yaml
# 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
- 简单生产者:
typescript
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...");
}
}
- 简单消费者:
less
@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的部署和简单应用。