搭建kafka集群详细教程

kafka集群搭建

网络上的博客质量参差不齐,对新手很不友好,我参考了一些博客文档后,重新写了一遍kafka的搭建教程,包括zookeeper的搭建教程,还附上了遇到的一些常见错误的解决方案。
我使用了3台虚拟机,因为kafka需要zookeeper的支持,所以虚拟机上需要事先搭建好zookeeper的集群,具体步骤见 《搭建zookeeper集群》。主要参考了这两个教程: 教程一(三台虚拟机)教程二(两台虚拟机)

1. 软件环境

  1. CenOS7 虚拟机三台。
  2. 已经搭建好的zookeeper集群。
  3. 软件版本:kafka_2.11-1.0.0

2. 创建目录并下载安装软件

1.创建目录

cd /opt
mkdir kafka #创建项目目录
cd kafka
mkdir kafkalogs #创建kafka消息目录,主要存放kafka消息

  1. 下载软件
    我用的是xshell工具将下载好的软件传送到虚拟机的,放在了/opt/kafka/目录下,并解压:

tar -zxvf kafka_2.11-1.0.0.tgz

3. 修改配置文件

3.1 进入到config目录

cd /opt/kafka/kafka_2.11-1.0.0/config/

我们主要关心的文件只有一个:server.properties,我们可以发现在这个目录下有很多文件,还有zookeeper的文件。我们可以直接使用kafka自带的zookeeper集群来启动,但是考虑到未来的项目需求,建议使用独立的zookeeper集群。

-rw-r--r--. 1 root root 906 Oct 27 08:56 connect-console-sink.properties
-rw-r--r--. 1 root root 909 Oct 27 08:56 connect-console-source.properties
-rw-r--r--. 1 root root 5807 Oct 27 08:56 connect-distributed.properties
-rw-r--r--. 1 root root 883 Oct 27 08:56 connect-file-sink.properties
-rw-r--r--. 1 root root 881 Oct 27 08:56 connect-file-source.properties
-rw-r--r--. 1 root root 1111 Oct 27 08:56 connect-log4j.properties
-rw-r--r--. 1 root root 2730 Oct 27 08:56 connect-standalone.properties
-rw-r--r--. 1 root root 1221 Oct 27 08:56 consumer.properties
-rw-r--r--. 1 root root 4727 Oct 27 08:56 log4j.properties
-rw-r--r--. 1 root root 1919 Oct 27 08:56 producer.properties
-rw-r--r--. 1 root root 7030 Nov 22 18:10 server.properties
-rw-r--r--. 1 root root 1032 Oct 27 08:56 tools-log4j.properties
-rw-r--r--. 1 root root 1023 Oct 27 08:56 zookeeper.properties

3.2 修改配置文件server.properties

需要说明的是,我现在是在虚拟机1上进行的操作,同样的操作要在三台虚拟机上都执行,只是有些细微的配置不同,其他配置信息完全相同。对于不同虚拟机上有差异的部分,我会一一指出。下面修改配置文件:

// 打开配置文件
vim server.properties
// 修改配置文件
broker.id=1
/* 这是这台虚拟机上的值,在另外两台虚拟机上应该是2或者3,这个值是唯一的,每台虚拟机或者叫服务器不能相同。 /
/
设置本机IP和端口。 我这里设置的是listeners,也可以直接设置host.name=192.168.172.10,port=19292,这个IP地址也是与本机相关的,每台服务器上设置为自己的IP地址。 /
listeners=PLAINTEXT://192.168.172.10:19092
// 该端口默认是9092,我为了加深理解,没有设置为默认值。
// 在og.retention.hours=168下面新增下面三项
message.max.byte=5242880
default.replication.factor=2
replica.fetch.max.bytes=5242880
/
设置zookeeper的连接端口,新版本的kafka不再使用zookeeper而是通过brokerlist的配置让producer直接连接broker,这个brokerlist可以配置多个,只要有一个能连接上,就可以让producer获取道集群中的其他broker的信息,绕过了zookeeper。因此这个zookeeper.connect可以设置多个值 */
zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181

也就是说,zookeeper.connect 指的是zookeeper集群的地址,可以是多个,多个之间用逗号分割
配置文件的详细信息见参考链接

4. 启动kafka集群并测试

4.1 启动服务

首先要启动kafka集群,并且是三台都要手动去启动。

// 进入kafka的bin目录
cd /opt/kafka/kafka_2.11-1.0.0/bin/
// 启动kafka
./kafka-server-start.sh -daemon ../config/server.properties

-daemon代表着以后台模式运行kafka集群,这样kafka的启动就不会影响我们继续在控制台输入命令。

4.2 检查服务是否启动

执行命令jps,显示出了正在运行Kafka这个进程,进程号是4855。在运行这个命令时,你可能会出现错误,显示jps command not found。文章的最后给出了解决方案。

jps
4161 QuorumPeerMain
4855 Kafka
6809 Jps

4.3 创建topic来验证是否创建成功

  1. 创建topic

./kafka-topics.sh --create --zookeeper 192.168.172.10:12181 --replication-factor 2 --partitions 1 --topic my-topic

参数解释:

--replication-factor 2 // 复制两份
--partitions 1 // 创建1个分区
--topic // 主题为my-topic
-- --zookeeper // 此处为为zookeeper监听的地址

  1. 创建生产者producer

./kafka-console-producer.sh --broker-list 192.168.172.10:19092 --topic my-topic //`这个IP地址可以写brokerlist中的任意一个

此时,console处于阻塞状态,可以直接输入数据。

  1. 创建消费者
    此时要切换到另一台虚拟机的shell界面输入以下命令:

./kafka-console-consumer.sh --zookeeper 192.168.172.10:12181 --topic my-topic --from-beginning

此时,一旦有数据生成,此处的console中就会显示数据。

5. 遇到的问题

5.1 端口输入错误

[root@localhost bin]# ./kafka-topics.sh --create --zookeeper 192.168.172.10 --replication-factor 2 --partitions 1 --topic my-topic
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
[2017-11-22 17:45:59,726] WARN Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn) java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)

at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)  
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)  

这是因为在输入创建topic命令时,端口输入错误了,./kafka-topics.sh --create --zookeeper 192.168.172.10 --replication-factor 2 --partitions 1 --topic my-topic。这里边只输入了IP地址192.168.172.10,没有输入端口号:12181。这个IP地址+端口号是在/opt/kafka/kafka_2.11-1.0.0/config/server.properties文件中的zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181设置的任意一个地址即可。
参考链接: 主参考辅助参考,还有一个参考

5.2 topic名字写错

[root@localhost bin]# ./kafka-console-producer.sh --broker-list 192.168.172.10:19092--topic
shuaige
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Missing required argument "[topic]"

这个问题是因为我的topic名字写错了。我是照着这两个教程搭建kafka集群的:Kafka【第一篇】Kafka集群搭建kafka集群环境搭建。第二篇几乎是抄的第一篇。由于这两个文档的topic名字不一样,我在虚拟机1上创建的topic名字是用的教程一的my-topic,创建生产者时用的却是教程二的shuaige,所以才报错。可见kafka的生产者和消费者是通过topic进行连接的,而不是kafka的IP地址。
PS:教程一Kafka【第一篇】Kafka集群搭建是目前为止看到的写的最好的kafka集群搭建的教程,其他博客都有错误,无法复现。

5.3 启动console消费者后界面卡住不动

创建consumer后不能消费生产者的消息,卡住了

[root@localhost bin]# ./kafka-console-consumer.sh --zookeeper 192.168.172.10:12181 --topic my-topic --from-beginning
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
// 卡在了上边这句话不动 了

其中下面这段提示不用管它。跟JVM有关系,是一些openJDK默认的设置,具体我也没懂。感兴趣这里有解释:参考1参考2

OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N

产生错误的原因是我在虚拟机1启动生产者的时候用的命令:./kafka-console-producer.sh --broker-list 192.168.172.10:12181 --topic my-topic,注意这里我写的端口号是12181。当我将生产者启动时的端口参数设为19092,消费者启动时的端口参数设为12181时,就可以成功的进行生产者和消费者的通信。

关于生产者和消费者的端口设置,这个教程里有比较简明的讲解:kafka快速上手
在zookeeper的配置文件zoo.cfg中,zookeeper会开发一个clientPort=12181(这是我自己设置的值)端口给消费者使用,其实也可以给生产者使用,但是在0.8.0版本后,producer不再通过zookeeper连接broker,而是通过brokerlist的配置(在kafka的server.properties文件中,我设置的值为zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181)直接和broker连接,只要能和一个broker连接上,就能够获取到集群中其他broker的信息,绕过了zookeeper。

5.4 linux下jps command not found

jps命令可以列出本机所有java进程的pid (jps命令讲解)。我运行jps命令时出现:

-bash: jps: command not found

网上好多例子都是说因为jdk里有jps可执行文件,只是没有放在环境变量里。使用root身份vi /etc/profile,然后在下面加一行export PATH="usr/java/jdk160_05/bin:$PATH"(其中jdk160_05是你的安装目录,依你自己的安装情况所决定),然后source /etc/profile即可解决。
但是对我的CentOS7虚拟机不起作用,我觉得这是当你自己安装jdk后jps命令无法运行时可以这样解决,但是有人试验过,自己安装jdk成功后,一般jps命令就已经好使了。
所以说,一般输入jps后报-bash: jps: command not found的都是Linux自带的jdk,下面以我的CentOS7的解决方法为例。需要安装java-1.X.X-openjdk-devel这个包,他提供了jps这个工具。

[root@localhost lib]# yum list | grep jdk-devel
java-1.8.0-openjdk-devel.x86_64 1:1.8.0.151-1.b12.el7_4 @updates
java-1.6.0-openjdk-devel.x86_64 1:1.6.0.41-1.13.13.1.el7_3 base
java-1.7.0-openjdk-devel.x86_64 1:1.7.0.151-2.6.11.1.el7_4 updates
java-1.8.0-openjdk-devel.i686 1:1.8.0.151-1.b12.el7_4 updates
java-1.8.0-openjdk-devel-debug.i686 1:1.8.0.151-1.b12.el7_4 updates
java-1.8.0-openjdk-devel-debug.x86_64 1:1.8.0.151-1.b12.el7_4 updates
[root@localhost lib]# java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
在这里可以看到我的jdk的版本是"1.8.0_151",所以我安装了java-1.8.0-openjdk-devel-debug.x86_64
[root@localhost lib]# yum -y install java-1.8.0-openjdk-devel-debug.x86_64

安装完毕后,问题解决,jps可以正常运行。
参考:教程1教程2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342