目录
报错 Connection to node -1 could not be established. Broker may not be available
启动Kafka出现The Cluster ID doesn't match stored clusterId
由于服务器资源有限,此案例都是单机部署,算是小白引路案例。
(一)kafka部署
下载及修改配置
到http://kafka.apache.org/downloads.html 下载
丢到服务器,tar zxvf +文件名 命令行解压。
在进入解压后的文件在config/ 目录下 找到server.properties 配置文件
进行命令行 vi server.propertie 进行修改
将如图两处改为你的服务器ip ,如果在host中你有做解析处理,这里也可以填写你域名,localhost之类的,笔者在这里写的是服务器的ip.
修改完成以后 就可以启动了,由于kafka正常运行前提是zookeeper处于启动状态 ,先确认一下zookeeper 是否启动。
jps | grep -v Jps 查看zk进程
标红为zk进程
没有的话需要自己重新部署或者启动一下zookeeper了,笔者这里不做讲解了,在kafka包里也自带了配置好了的zookeeper,在bin目录下可以找到。
启动kafka
bin目录下执行
./kafka-server-start.sh ../config/server.properties 前台启动 一旦退出 kafka也随即关闭 这里不推荐
nohup ./kafka-server-start.sh ../config/server.properties & 后台启动 推荐采用这种方式
同理执行启动以后 也可以通过 jps | grep -v Jps 查看kafka 进程 如图
创建主题
./kafka-topics.sh --create --zookeeper 你的ip:2181 --config max.message.bytes=12800000 --config flush.messages=1 --replication-factor 1 --partitions 1 --topic 你的主题名称
笔者这里取的名称是 myqueue。
查看主题
./kafka-topics.sh --list --zookeeper 你的ip:2181
可以看到刚刚创建的主题myqueue
创建生产者
bin/kafka-console-producer.sh --broker-list 你的IP:9092 --topic myqueue
创建消费者
bin/kafka-console-consumer.sh --bootstrap-server 你的IP:9092 --topic myqueue --from-beginning
可以看到刚刚生产者输入的消息 消费者已经接收到
(二)SpringBoot整合kafka
创建工程选择依赖包
项目结构
application.yml配置
spring:
kafka:
bootstrap-servers: xx:xx:xx:xx:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: demo
enable-auto-commit: true
auto-commit-interval: 1000
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
@RestController
@RequestMapping("producer")
public class ProducerController {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@RequestMapping("msg")
public String send(String msg){
kafkaTemplate.send("myqueue", msg);
return "success";
}
}
@Component
public class Consumer {
@KafkaListener(topics = "myqueue")
public void listen (ConsumerRecord<?, ?> record) throws Exception {
System.out.println( "主题名:"+record.topic());
System.out.println( "偏移量:"+record.offset());
System.out.println( "消息:"+record.value());
}
}
运行程序
可以先在服务器发送两段段消息
在应用服务器上可以看到消费的信息(由于我之前在当前topic发了一些消息 所以offset并没有从1开始)
同理我们也可以通过
http://localhost:8080/producer/msg?msg=hello%20kafka
同理在应用服务器可以看到
(三)部署工程中遇到的坑点
报错 Connection to node -1 could not be established. Broker may not be available
看了很多文章都是说要在 server.properties 配置文件中 把localhost改为你的ip地址 但是笔者一开始就是写的IP地址。
经排查,最容易忽略的一点就是9092这个端口是否对外开放。
查看 命令行 看是否返回yes
firewall-cmd --zone=public --query-port=9092/tcp
未开通的情况 执行如下命令 即可解决端口问题
firewall-cmd --zone=public --add-port=9092/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --reload ---重载
启动Kafka出现The Cluster ID doesn't match stored clusterId
这是由于不正确的关闭kafka所致 笔者这里强行kill kafka出现的
处理方式如下
找到配置文件
cat server.properties
查看log.dirs所在位置
log.dirs=/tmp/kafka-logs
按着这个路径找到 meta.properties
然后删除 rm -rf meta.properties
重启kafka 恢复正常