一、安装JDK8
二、安装zookeeper
新版的Kafka自带zookeeper,也可以使用自带的,我这里为了体验安装zookeeper的过程,选择自己安装
zookeeper3.7安装参考
三、安装
下载Kafka的包
Kafka官网下载
kafka_2.13-2.7.1.tgz
1.解压到opt目录下
tar -zxvf kafka_2.13-2.7.1.tgz
2.进入config目录,修改server.properties文件
############################# Server Basics #############################
broker.id=0
############################# Socket Server Settings #############################
listeners=PLAINTEXT://0.0.0.0:5555
advertised.listeners=PLAINTEXT://(本机IP):5555
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
############################# Log Basics #############################
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
############################# Internal Topic Settings #############################
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
############################# Log Retention Policy #############################
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
############################# Zookeeper #############################
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
############################# Group Coordinator Settings #############################
group.initial.rebalance.delay.ms=0
下面两项不是默认的配置,在这里会出现各种问题后面会详细写明
我使用的是阿里云服务器,所以advertised.listeners使用的服务器的公网IP
listeners=PLAINTEXT://0.0.0.0:5555
advertised.listeners=PLAINTEXT://(本机IP):5555
四、启动测试
1.zookeeper
[root@rookieWRL bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@rookieWRL bin]#
2.启动Kafka
去到Kafka的bin目录下
./kafka-server-start.sh ../config/server.properties
3.创建topic
去到Kafka的bin目录下
#创建topic
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test1
#查看topic信息
./kafka-topics.sh --describe --zookeeper localhost:2181 --topic test1
4.开启生产者
复制出一个新的会话窗口
#启动生产者控制台
[root@rookieWRL bin]# ./kafka-console-producer.sh --broker-list 0.0.0.0:5555 --topic test1
正常情况下这里我使用0.0.0.0或者是advertised.listeners配置项里面的IP都可以的IP来开启生产者和消费者
公网IP开启
如下图发送消息
0.0.0.0开启
5.开启消费者
再复制出 一个新的窗口
[root@rookieWRL bin]# ./kafka-console-consumer.sh --bootstrap-server 0.0.0.0:5555 --topic test1 --from-beginning
公网IP开启
0.0.0.0开启
消费者启动成功,成功消费消息就会打印生产者发送的消息,这里面有部分是springboot程序发送的不用在意
六、配置问题
目前这里,zookeeper,Kafka,生产者,消费者都在一个主机里面。
接下来目前的主要问题是下面两个配置
listeners=PLAINTEXT://0.0.0.0:5555
advertised.listeners=PLAINTEXT://(本机IP):5555
我查了一些资料以及配置文件也有部分说明这两个配置项的作用(看配置文件的注释,养成好习惯)
在一开始在配置文件使用的是默认的9092端口,在在防火墙开启了这个端口,也在阿里云安全组配置了这个端口
接下来问题就慢慢出现了
之后启动Kafka服务在命令中是不用指定IP和端口的,指定配置文件就行,执行开启服务的命令后你能看见Kafka请求的是
listeners=PLAINTEXT://0.0.0.0:5555
配置项类里面的配置
情况1
listeners=PLAINTEXT://公网IP:5555
advertised.listeners=PLAINTEXT://公网IP:5555
启动Kafka服务
这里就能猜测Kafka服务的启动需要使用这个配置项的IP和端口
查了些资料,这个配置项好像只能配置0.0.0.0或者localhost和内网IP
listeners:启动kafka服务监听的ip和端口,可以监听内网ip和0.0.0.0(不能为外网ip),默认为java.net.InetAddress.getCanonicalHostName()获取的ip。
既然这样,我们就配置为0.0.0.0就行
情况二、
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://公网IP:9092
启动生产者和消费者
Kafka服务通过这个端口倒是可以成功启动,但是生产者和消费者无法通过公网IP加9092端口连接,但是可以用我自己开的一个端口5555来连接,这是为什么文章开始我是用的是5555端口而不是默认端口9092。具体为什么可能还要研究,可能不是端口的问题
advertised.listeners:生产者和消费者连接的地址,kafka会把该地址注册到zookeeper中,所以只能是除0.0.0.0之外的合法ip或域名 ,默认和listeners的配置一致。
至于是怎么发现可能是端口有问题的,大概是下面的过程
使用telnet命令测试: telnet 公网IP:9092
,结果连接不上,但是其他端口可以。这里要注意防火墙是不是正常,是不是开启了这个端口,以及安全组是不是开放了这个端口。
我想开启防火墙时执行这个:systemctl start firewall.service
出现了
Failed to start firewall.service: Unit not found.
我就有点懵了
后来发现是是我的防火墙没有弄好,没有安装,但是我之前的一些端口也设置了的,有点懵,既然这样就安装吧
(使用yum install firewalld命令安装时,中间停顿输入y既可)
yum install firewalld
systemctl unmask firewalld
systemctl enable firewalld
systemctl start firewalld
1、开启防火墙
systemctl start firewalld
2、开放指定端口
firewall-cmd --zone=public --add-port=9092/tcp --permanent
命令含义:
--zone #作用域
--add-port=1935/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
3、重启防火墙
firewall-cmd --reload
之后呢,就9092也可以使用了
systemctl start firewalld.service //开启防火墙
systemctl stop firewalld.service //关闭防火墙
systemctl enable firewalld.service //设置开机自动启动
systemctl disable firewalld.service //设置关闭开机制动启动
firewall-cmd --reload//在不改变状态的条件下重新加载防火墙
参考资料:
关于新方法和旧方法的问题
关于springboot中Kafka配置文件
Linux防火墙问题
Linux防火墙开放端口
telnet命令