Bootstrap

关于在虚拟机搭建kafka服务出现的一些问题

最近一段时间,有一个需求,需要基于kafka完成消息的发布,因为之前买的云服务器前不久就已经到期了,也没想去买,就想着自己在虚拟机上搭一个kafka

我自己用的Ubuntu 22.04.4,一般在Linux上搭kafka,都需要先安装ZooKeeper,因为kafka是一个分布式平台,是以集群的方式运行的,可以自由地伸缩,同时还提供了数据传递保证(可复制、持久化等),而ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,需要ZooKeeper对kakfa集群进行管理和负载均衡

docker部署

为了方便,我之前是用docker去部署的,现在应该是不行了

通过以下命令一键安装启动ZooKeeper,启动以后,可以用docker ps查看ZooKeeper是否启动成功

sudo docker run -d --restart=unless-stopped --name zookeeper --network host zookeeper

然后安装kafka的命令就比较复杂:

sudo docker run -d --restart=unless-stopped --name kafka --network host \
          --env KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" \
          --env KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181 \
          --env KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT \
          --env KAFKA_LISTENERS=INSIDE://0.0.0.0:9092,OUTSIDE://0.0.0.0:9093 \
          --env KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE \
          --env KAFKA_ADVERTISED_LISTENERS=INSIDE://{此处替换为私网IP}:9092,OUTSIDE://{此处替换为公网IP}:9093  \
          wurstmeister/kafka

上面这个是用于云服务器的配置,inside和outside那个地方分别替换成云服务器私网和公网ip

我们这里就是改一下KAFKA_LISTENERSKAFKA_ADVERTISED_LISTENERS这两个参数,这里可以仔细看一下这些参数,后面出问题也会用到

sudo docker run -d --restart=unless-stopped --name kafka --network host \
          --env KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" \
          --env KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181 \
          --env KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT \
          --env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
          --env KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE \
          --env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://{虚拟机ip}:9092  \
          wurstmeister/kafka

PLAINTEXT指的是使用明文协议进行网络通信,在Kafka的配置文件server.properties中看到listeners=PLAINTEXT://ip:9092这样的设置时,它表示Kafka服务器将在指定的主机名和端口上监听来自客户端的连接请求,并且通信数据不会进行加密处理

在使用Docker安装Kafka时,KAFKA_ADVERTISED_LISTENERS环境变量用于配置Kafka客户端应当尝试连接的地址。由于Docker容器内部的网络地址对于外部网络不可见,您需要设置一个外部可达的地址,以便Kafka客户端能够正确地连接到Kafka broker,通常会将KAFKA_ADVERTISED_LISTENERS设置为容器的IP地址或主机的IP地址,以及Kafka监听的端口

参考链接:

Kafka连接服务器出现:Connection to node 1 (localhost/127.0.0.1:9092) could not be established.「建议收藏」-腾讯云开发者社区-腾讯云

Kafka连接服务器出现:Connection to node 1 (localhost/127.0.0.1:9092) could not be established._kafka connection to node -1 could not be establish-CSDN博客

运行以后,可以执行docker logs -f kafka命令查看运行日志

后面还需要根据自己的虚拟机环境开放端口9092

sudo ufw enable
sudo ufw allow 9092
sudo ufw status

删除容器

docker rm -f <container_id_or_name>

 


到这里安装已经结束了,我自己装的没什么问题,但是后面还是出现无法连接的问题

主要的问题还是Connection to node 1 (localhost/127.0.0.1:9092) could not be established.Broker may not be available.

因为是用docker部署的,所以kafka是在docker容器里的,对配置文件进行修改需要进入容器

# 进入容器
docker exec -it kafka /bin/bash
 
# 一旦进入容器,你可以使用以下命令查看Kafka配置或日志文件
# 查看Kafka配置文件
cd /opt/kafka/config
ls
cat server.properties
 
# 查看日志文件
cd /opt/kafka/logs
ls
cat server.log

Invalid character found in method name. HTTP method names must be tokens

这个一般是端口的问题,如果不是端口的问题,可以参考这位大佬的文章筛查一下完美解决 Invalid character found in method name. HTTP method names must be tokens_java.lang.illegalargumentexception: invalid charac-CSDN博客

Connection to node -1 could not be established. Broker may not be available.

在网上找到的解决办法基本上就是修改配置文件中的两个listeners

# 允许外部端口连接                                            
listeners=PLAINTEXT://0.0.0.0:9092  
# 外部代理地址                                                
advertised.listeners=PLAINTEXT://121.201.64.12:9092

参考博客:

Kafka报错:Connection to node -1 could not be established. Broker may not be available._中间件_渣渣帅-华为云开发者联盟

Kafka连接服务器出现:Connection to node 1 (localhost/127.0.0.1:9092) could not be established.「建议收藏」-腾讯云开发者社区-腾讯云

Kafka连接服务器出现:Connection to node 1 (localhost/127.0.0.1:9092) could not be established._kafka connection to node -1 could not be establish-CSDN博客

kafka连接生产者报错Connection to node -1 could not be established. Broker may not be available._kafka broker may not available-CSDN博客

我尝试了一下,但是似乎只有java刚开始跑起来的时候有效,能读进去,后面就不行了,还得在慢慢研究一下

;