版权声明:本文为CSDN博主「xuesp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xuesp/article/details/88094326
一、前提条件
1、部署Kafka集群搭建需要服务器至少3台,奇数台
2、Kafka的安装需要java环境,jdk1.8
3、Kafka安装包版本:kafka_2.12-2.5.0.tar.gz
官网下载地址:http://kafka.apache.org/downloads
百度云盘下载地址:https://pan.baidu.com/s/1INEvFG45aYAnI-ceDVxgtQ 提取码:err1
4、假设3台服务器分别为:kafka1、kafka2、kafka3
kafka1:
192.168.253.129
kafka1.sd.cn
kafka2:
192.168.253.131
kafka2.sd.cn
kafka3:
192.168.253.132
kafka3.sd.cn
5、增加host配置:
在三台虚拟机的/etc/hosts文件中添加如下IP和域名对应关系
192.168.253.129 kafka1.sd.cn
192.168.253.131 kafka2.sd.cn
192.168.253.132 kafka3.sd.cn
二、Zookeeper集群搭建
直接使用kafka自带的zookeeper建立zk集群
1、将安装包kafka_2.12-2.5.0.tar.gz上传到/root 目录下
2、解压:tar -zxvf kafka_2.12-2.5.0.tar.gz
3、进入目录:cd /root/kafka_2.12-2.5.0/
4、创建zookeeper目录:mkdir zk_kfk_data
5、进入目录:cd /root/kafka_2.12-2.5.0/config
6、修改zookeeper.properties文件:
三台机器上的zookeeper.properties文件配置相同
data.Dir 为zk的数据目录
server.1、server.2、server.3 为集群信息
2888端口号是zookeeper服务之间通信的端口
3888端口是zookeeper与其他应用程序通信的端口。
tickTime:CS通信心跳数,Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
initLimit:LF初始通信时限。集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数。
syncLimit:LF同步通信时限。集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)
7、创建myid文件:进入/opt/kafka_2.12-2.5.0/zk_kfk_data目录,创建myid文件,将三台服务器上的myid文件分别写入1,2,3。myid是zookeeper集群用来发现彼此的标识,必须创建,且不能相同。
8、执行启动zookeeper命令:
/root/kafka_2.12-2.5.0/bin/zookeeper-server-start.sh /root/kafka_2.12-2.5.0/config/zookeeper.properties &
三台机器都执行启动命令,查看zookeeper的日志文件,没有报错就说明zookeeper集群启动成功了。
三、Kafka集群搭建
1、进入目录:cd /opt/kafka_2.12-2.5.0/
2、创建kafka日志数据目录:mkdir kafka-logs-1
3、进入目录:cd /opt/kafka_2.12-2.5.0/config
4、修改server.properties配置文件:
broker.id :broker.id的值三个节点要配置不同的值,分别配置为0,1,2
advertised.listeners : kafka的监听端口,用于producer 和 consumer 连接使用,配置为PLAINTEXT://kafka1.sd.cn:9092
log.dirs :Kafka日志数据目录,配置为/root/kafka_2.12-2.5.0/kafka_logs
num.partitions :分区数,根据自行修改,配置为10
zookeeper.connect :zookeeper连接地址,多个以逗号隔开,配置为 kafka1.sd.cn:2181,kafka2.sd.cn:2181,kafka3.sd.cn:2181
5、 启动kafka集群:
/root/kafka_2.12-2.5.0/bin/kafka-server-start.sh /root/kafka_2.12-2.5.0/config/server.properties &
三个节点均要启动;启动无报错,即搭建成功。
四、测试Kafka集群
1、创建topic:test
/root/kafka_2.12-2.5.0/bin/kafka-topics.sh --create --zookeeper kafka1.sd.cn:2181,kafka2.sd.cn:2181,kafka3.sd.cn:2181 --replication-factor 1 --partitions 1 --topic test
2、列出已创建的topic列表
/root/kafka_2.12-2.5.0/bin/kafka-topics.sh --list --zookeeper kafka1.sd.cn:2181,kafka2.sd.cn:2181,kafka3.sd.cn:2181
3、模拟客户端去发送消息
/root/kafka_2.12-2.5.0/bin/kafka-console-producer.sh --broker-list kafka1.sd.cn:9092,kafka2.sd.cn:9092,kafka3.sd.cn:9092 --topic test
4、模拟客户端去接受消息
/root/kafka_2.12-2.5.0/bin/kafka-console-consumer.sh --bootstrap-server kafka1.sd.cn:9092,kafka2.sd.cn:9092,kafka3.sd.cn:9092 --topic test
五、部署过程中遇到的问题
1、启动zk集群的时候遇到如下报错
[2021-05-05 16:36:25,799] WARN Cannot open channel to 2 at election address kafka2.sd.cn/192.168.253.131:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.NoRouteToHostException: No route to host (Host unreachable)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
at java.net.Socket.connect(Socket.java:606)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:656)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:713)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:626)
at org.apache.zookeeper.server.quorum.FastLeaderElectionWorkerSender.process(FastLeaderElection.java:477)
at org.apache.zookeeper.server.quorum.FastLeaderElectionWorkerSender.run(FastLeaderElection.java:456)
at java.lang.Thread.run(Thread.java:748)
[2021-05-05 16:36:25,802] WARN Cannot open channel to 3 at election address kafka3.sd.cn/192.168.253.132:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.NoRouteToHostException: No route to host (Host unreachable)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
at java.net.Socket.connect(Socket.java:606)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:656)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:713)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:626)
at org.apache.zookeeper.server.quorum.FastLeaderElectionWorkerSender.process(FastLeaderElection.java:477)
at org.apache.zookeeper.server.quorum.FastLeaderElectionWorkerSender.run(FastLeaderElection.java:456)
at java.lang.Thread.run(Thread.java:748)
原因:防火墙开启导致的路由失败
解决措施:关闭防火墙
搭建环境的虚拟机操作系统为Centos7
查看防火墙状态
firewall-cmd --state
关闭防火墙
systemctl stop firewalld.service
禁止开机启动防火墙
systemctl disable firewalld.service
2、