最近一段时间,有一个需求,需要基于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_LISTENERS和KAFKA_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监听的端口参考链接:
运行以后,可以执行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
参考博客:
我尝试了一下,但是似乎只有java刚开始跑起来的时候有效,能读进去,后面就不行了,还得在慢慢研究一下