Docker部署Kakfa——初体验
周末啦,闲着没事干,就想找点事情做做,总不能一天都躺尸对吧,于是就想学学kafka,因为工作上可能需要用到,所以也就趁此机会去学习学习!
首先呢,先瞅一眼kafka的官网https://kafka.apache.org/,全是英文,很难受,没办法,只能去找点看得懂的来学了,虽然这个习惯很不好,但是效率高鸭!
B站上面搜了一圈Kafka的教学视频,挑了个觉着比较靠谱的看了下,然后心血来潮,想着腾讯云服务器还没过期,就想在上面部署一个kafka,看到教学中是通过官网下载tar包通过脚本进行部署的,可我对这些脚本不熟悉鸭,想着平时主要用Docker比较多,于是就想用Docker部署。
接下来咧,第一步,打开dockerhub,dockerhub是一个镜像仓库,里面存着许多镜像,有的是官方提供的,有的是第三方提供的,当然了,我们自己也可以打成镜像放到仓库中去。
搜索kafka,选择对应版本
点进去后,官方推荐我们通过docker-compose进行部署,并且提供了docker-compose文件
$ curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/kafka/docker-compose.yml > docker-compose.yml
$ docker-compose up -d
由于腾讯云服务器上是Ubuntu系统,所以没有curl这个命令,所以干脆就自己动手丰衣足食,自己写docker-compose文件
想要写docker-compose文件,首先得会通过命令将这些容器启动起来,再去编写docker-compose
kafka在2.8版本后去除了zookeeper,当然了,我没有其它想法,首先先让它跑起来,根据官方提供的命令去创建zookeeper和kafka
docker run -d --name zookeeper-server \
-e ALLOW_ANONYMOUS_LOGIN=yes \
bitnami/zookeeper:latest
创建zookeeper容器
docker run -d --name kafka-server \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 \
bitnami/kafka:latest
创建kafka容器
有朋友可能会问,好像我的命令和官方有些不同,是的,没错,官方是创建了一个网络,然后将这两个容器共用同一个网络,而我没有指定,所以它会默认docker0这个网络。
zookeeper容器启动还算成功,但是到了kafka容器启动的时候,它秒停,这种情况下肯定是要去看它运行日志。
docker logs --tail=500 kafka-server
提示报的是内存不够,我服务器是2G的内存,跑了一些容器,还剩下不到1G可用内容,上一次遇到这种情况还是在启动ElasticSearch的时候。之前部署ES的时候也是内存不够,那时是不起ELK,并分配指定堆大小,最终才得以让ES跑起来,那现在这种情况应该也是可以设置堆大小的。
该如何去设置呢?
在官方镜像说明中给了一堆环境变量可以让我们去设置
- ALLOW_PLAINTEXT_LISTENER: Allow to use the PLAINTEXT listener. Default: no.
- KAFKA_INTER_BROKER_USER: Apache Kafka inter broker communication user. Default: admin. Default: user.
- KAFKA_INTER_BROKER_PASSWORD: Apache Kafka inter broker communication password. Default: bitnami.
- KAFKA_CERTIFICATE_PASSWORD: Password for certificates. No defaults.
- KAFKA_HEAP_OPTS: Apache Kafka’s Java Heap size. Default: -Xmx1024m -Xms1024m.
- KAFKA_ZOOKEEPER_PROTOCOL: Authentication protocol for Zookeeper connections. Allowed protocols: PLAINTEXT, SASL, SSL, and SASL_SSL. = Defaults: PLAINTEXT.
- KAFKA_ZOOKEEPER_USER: Apache Kafka Zookeeper user for SASL authentication. No defaults.
- KAFKA_ZOOKEEPER_PASSWORD: Apache Kafka Zookeeper user password for SASL authentication. No defaults.
- KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD: Apache Kafka Zookeeper keystore file password and key password. No defaults.
- KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD: Apache Kafka Zookeeper truststore file password. No defaults.
- KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME: Verify Zookeeper hostname on TLS certificates. Defaults: true.
- KAFKA_ZOOKEEPER_TLS_TYPE: Choose the TLS certificate format to use. Allowed values: JKS, PEM. Defaults: JKS.
- KAFKA_CFG_SASL_ENABLED_MECHANISMS: Allowed mechanism when using SASL either for clients, inter broker, or zookeeper comunications. Allowed values: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512 or a comma separated combination of those values. Default: PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL: SASL mechanism to use for inter broker communications. No defaults.
- KAFKA_TLS_CLIENT_AUTH: Configures kafka brokers to request client authentication. Allowed values: required, requested, none. Defaults: required.
- KAFKA_TLS_TYPE: Choose the TLS certificate format to use. Allowed values: JKS, PEM. Defaults: JKS.
- KAFKA_CLIENT_USERS: Users that will be created into Zookeeper when using SASL for client communications. Separated by commas. Default: user
- KAFKA_CLIENT_PASSWORDS: Passwords for the users specified atKAFKA_CLIENT_USERS. Separated by commas. Default: bitnami
- KAFKA_CFG_MAX_PARTITION_FETCH_BYTES: The maximum amount of data per-partition the server will return. Default: 1048576
- KAFKA_CFG_MAX_REQUEST_SIZE: The maximum size of a request in bytes. Default: 1048576
- KAFKA_ENABLE_KRAFT: Whether to enable Kafka Raft (KRaft) mode. Default: no
- KAFKA_KRAFT_CLUSTER_ID: Kafka cluster ID when using Kafka Raft (KRaft). No defaults.
一下子看到这么多配置项,人有点麻了,但是稍微看一下还是看得懂的,比如KAFKA_HEAP_OPTS这项,HEAP是堆的意思,那应该就可以分配堆大小,然后再加上官方给的默认的配置,那docker-compose文件就会写了。
version: "2"
services:
zookeeper:
image: docker.io/bitnami/zookeeper:3.8
container_name: zookeeper
ports:
- "2181:2181"
volumes:
- "zookeeper_data:/bitnami"
environment:
ALLOW_ANONYMOUS_LOGIN: "yes"
kafka:
image: docker.io/bitnami/kafka:3.2
container_name: kafka
ports:
- "9092:9092"
volumes:
- "kafka_data:/bitnami"
environment:
KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
ALLOW_PLAINTEXT_LISTENER: "yes"
KAFKA_CFG_ADVERTISED_LISTENERS: "PLAINTEXT://服务器IP:9092"
KAFKA_HEAP_OPTS: "-Xmx512M -Xms256M"
depends_on:
- zookeeper
volumes:
zookeeper_data:
driver: local
kafka_data:
driver: local
写好docker-compose文件,再执行docker-compose up -d命令,等待容器创建,然后再通过docker ps命令查看容器是否都跑起来了。
检查没问题,那接下来就可以去操作kafka啦!
PS:如果创建失败的朋友,你可以还需要创建一个交换内存
先是通过free -m命令查看你的swap分区是否有分配内存
如果没有那就创建后再去运行容器。
创建Swap分区
创建大小为500MB的swapfile文件
dd if=/dev/zero of=swapfile bs=1024 count=500000
将swapfile设置为swap空间(把这个文件变成swap文件)
mkswap swapfile
启用交换空间(启用这个swap文件)
swapon swapfile
再去执行docker-compose up -d命令
Java连接Kafka
Java连接Kafka最简单的方式就是导入依赖,然后使用默认的KafkTemplate进行操作。
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
配置Kafka服务器地址
spring:
kafka:
producer:
bootstrap-servers: Kafka服务器IP:9092
consumer:
group-id: consumer-group #命令kafka的组id,可以随便起
bootstrap-servers: Kafka服务器IP:9092
server:
port: 8088
创建生产者
@RestController
@RequestMapping("/hello")
public class HelloController {
@Autowired
private KafkaTemplate<String,String> kafkaTemplate;
@GetMapping("send")
public String sendMsg(){
kafkaTemplate.send("first","msg");
return "ok";
}
}
创建消费者
@Component
public class KafkaConsumer {
@KafkaListener(topics = {"first"})
public void listener(ConsumerRecord<?, ?> record){
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
if (kafkaMessage.isPresent()) {
Object message = kafkaMessage.get();
System.out.println("数据接收完毕:"+message);
}
}
}
项目启动,访问send接口,再看控制台是否打印出你发送的消息,至此,Kafka部署已经完成,这次部署Zookeeper没有做集群部署。