![深入理解Kafka:核心设计与实践原理](https://wfqqreader-1252317822.image.myqcloud.com/cover/424/25462424/b_25462424.jpg)
1.2 安装与配置
本节详细介绍Kafka运行环境的搭建,为了节省篇幅,本节的内容以Linux CentOS作为安装演示的操作系统,其他 Linux 系列的操作系统也可以参考本节的内容。具体的操作系统的信息如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/20_1.jpg?sign=1738761843-b809FCsE52TaoqswS8yEe4xARdtbTkSD-0-5257aaec90fce0106c5e41608569cf44)
由图1-1可知,搭建Kafka运行环境还需要涉及ZooKeeper,Kafka和ZooKeeper都是运行在JVM之上的服务,所以还需要安装JDK。Kafka从2.0.0版本开始就不再支持JDK7及以下版本,本节就以JDK8为例来进行演示。
1.JDK的安装与配置
很多学习Kafka的读者也都是JVM系语言的支持者,如果你的操作系统中已经安装了JDK8及以上版本则可以跳过这段内容。
安装JDK的第一步就是下载JDK 1.8的安装包,可以进入Oracle官网页面进行下载。示例中选择的安装包是 jdk-8u181-linux-x64.tar.gz,我们这里将其先复制至/opt 目录下,本书所有与安装有关的操作都在这个目录下进行。
其次将/opt目录下的安装包解压,相关信息如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/20_2.jpg?sign=1738761843-5ui3tRnuoktTajQkW0dKGdDyeARip6Rq-0-12e85fcd3d6df018bfffa650109843a8)
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/21_1.jpg?sign=1738761843-1R12bLYujr2NEsbWXX2f3J7nKCaGtTGK-0-7f16c937a823b2b3f41739d0d4a32acd)
然后配置JDK的环境变量。修改/etc/profile文件并向其中添加如下配置:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/21_2.jpg?sign=1738761843-4eiBVY0vOBpTFUryep2lQk29LyQaOSMy-0-f28b939c775be24d609f634737e56fce)
再执行source/etc/profile命令使配置生效,最后可以通过java-version命令验证 JDK 是否已经安装配置成功。如果安装配置成功,则会正确显示出 JDK 的版本信息,参考如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/21_3.jpg?sign=1738761843-6bjWsyvJterv2hYs3YcPF0v1ao5iN83j-0-be71d125fdf8cbe4a022a049e2fd8d96)
2.ZooKeeper安装与配置
ZooKeeper是安装Kafka集群的必要组件,Kafka通过ZooKeeper来实施对元数据信息的管理,包括集群、broker、主题、分区等内容。
ZooKeeper是一个开源的分布式协调服务,是Google Chubby的一个开源实现。分布式应用程序可以基于ZooKeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、配置维护等功能。在ZooKeeper中共有3个角色:leader、follower和observer,同一时刻 ZooKeeper集群中只会有一个leader,其他的都是follower和observer。observer不参与投票,默认情况下 ZooKeeper 中只有 leader 和 follower 两个角色。更多相关知识可以查阅ZooKeeper官方网站来获得。
安装ZooKeeper的第一步也是下载相应的安装包,安装包可以从官网中获得,示例中使用的安装包是zookeeper-3.4.12.tar.gz,同样将其复制到/opt目录下,然后解压缩,参考如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/21_4.jpg?sign=1738761843-FRARaaHQg64AWNzS8gDZiX4zdoYbeOJa-0-aefbcfb13f37c1e0470545f3dadb85bd)
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/22_1.jpg?sign=1738761843-kBKDSyilpCE80UnRBiIVgm1HFXgeK5M0-0-34c9b859c027ef9972dbb59713d1e5c8)
第二步,向/etc/profile配置文件中添加如下内容,并执行source/etc/profile命令使配置生效:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/22_2.jpg?sign=1738761843-lOQrWRf3VBWaPqEfK85HcGgCcNu0LiDg-0-8470576f642fb3e510cb4aa3dfe61e50)
第三步,修改 ZooKeeper 的配置文件。首先进入$ZOOKEEPER_HOME/conf 目录,并将zoo_sample.cfg文件修改为zoo.cfg:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/22_3.jpg?sign=1738761843-JrQHHXvvE0DpphOq8kbdTFo3zwKvzRQU-0-9cbf4e3d288c836eaea9f1ab29449c61)
然后修改zoo.cfg配置文件,zoo.cfg文件的内容参考如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/22_4.jpg?sign=1738761843-VqztfZEXYRyBLrmNsQ6KHRoRdw18qCBU-0-6bdb516f78d10ae0ff12b43dc4ef9187)
默认情况下,Linux系统中没有/tmp/zookeeper/data和/tmp/zookeeper/log这两个目录,所以接下来还要创建这两个目录:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/22_5.jpg?sign=1738761843-QTdzkRkrmGkhHuFsMC679cpLSFscZZyT-0-55edd8e7799eb32d44563e2e14069178)
第四步,在${dataDir}目录(也就是/tmp/zookeeper/data)下创建一个myid文件,并写入一个数值,比如0。myid文件里存放的是服务器的编号。
第五步,启动Zookeeper服务,详情如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/23_1.jpg?sign=1738761843-ZZIJx3n93vSjRdupdXna6JRH2686dPhC-0-1c41154c1febfa6e3ca3e05585290d66)
可以通过zkServer.sh status命令查看Zookeeper服务状态,示例如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/23_2.jpg?sign=1738761843-97abaI1v28xOKjEb26EJLFliwi2BB09q-0-19ebfaa3df7a6f1ac97da86cb13eb5e6)
以上是关于ZooKeeper单机模式的安装与配置,一般在生产环境中使用的都是集群模式,集群模式的配置也比较简单,相比单机模式而言只需要修改一些配置即可。下面以3台机器为例来配置一个ZooKeeper集群。首先在这3台机器的/etc/hosts文件中添加3台集群的IP地址与机器域名的映射,示例如下(3个IP地址分别对应3台机器):
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/23_3.jpg?sign=1738761843-xH1f0yIYukP2ta4i0ynrGDyaUW6uzv8W-0-acbf8f683b11b645434b3f7d8e5db641)
然后在这3台机器的zoo.cfg文件中添加以下配置:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/23_4.jpg?sign=1738761843-YJL6A3cT1MENGrLDYO2i3NbfRQjsIXOQ-0-152b1fc0b4a9f375159a18ec1ddc2cf5)
为了便于讲解上面的配置,这里抽象出一个公式,即 server.A=B:C:D。其中 A 是一个数字,代表服务器的编号,就是前面所说的myid文件里面的值。集群中每台服务器的编号都必须唯一,所以要保证每台服务器中的myid文件中的值不同。B代表服务器的IP地址。C表示服务器与集群中的 leader 服务器交换信息的端口。D 表示选举时服务器相互通信的端口。如此,集群模式的配置就告一段落,可以在这3台机器上各自执行zkServer.sh start命令来启动服务。
3.Kafka的安装与配置
在安装完JDK和ZooKeeper之后,就可以执行Kafka broker的安装了,首先也是从官网中下载安装包,示例中选用按照包的是kafka_2.11-2.0.0.tgz,将其复制至/opt目录下并进行解压缩,示例如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/24_1.jpg?sign=1738761843-bHDXeRxDYC7dDdBqRkbg6Cws7Fmk3tQ1-0-a81dac89babfe1052c971ae643e3fb5f)
接下来需要修改broker的配置文件$KAFKA_HOME/conf/server.properties。主要关注以下几个配置参数即可:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/24_2.jpg?sign=1738761843-O2PcOCSLumWfx9w5CYMACtotHuwZUrz6-0-29a0e6e57d60687d01df52057d7dd3bd)
如果是单机模式,那么修改完上述配置参数之后就可以启动服务。如果是集群模式,那么只需要对单机模式的配置文件做相应的修改即可:确保集群中每个broker的broker.id配置参数的值不一样,以及listeners配置参数也需要修改为与broker对应的IP地址或域名,之后就可以各自启动服务。注意,在启动 Kafka 服务之前同样需要确保 zookeeper.connect参数所配置的ZooKeeper服务已经正确启动。
启动Kafka服务的方式比较简单,在$KAFKA_HOME目录下执行下面的命令即可:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/24_3.jpg?sign=1738761843-vgGgW71Pj8DAo10OToBKHhBKETwkpOHi-0-664de6b97006ebde5b56f870010ed89a)
如果要在后台运行Kafka服务,那么可以在启动命令中加入-daemon参数或&字符,示例如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/25_1.jpg?sign=1738761843-Vjsw9ZEQykGwVm0IkrlLzYlDcOlHaDeD-0-582520e673cbdec28b6e5c09f4e978fb)
可以通过jps命令查看Kafka服务进程是否已经启动,示例如下:
![](https://epubservercos.yuewen.com/C6A8CD/13916125605940406/epubprivate/OEBPS/Images/25_2.jpg?sign=1738761843-Suv176xKkAdU9iWkHiSKxQZ16jV2AYd0-0-730d45384d82f79d131529b316acdd59)
jps命令只是用来确认Kafka服务的进程已经正常启动。它是否能够正确地对外提供服务,还需要通过发送和消费消息来进行验证,验证的过程可以参考1.3节的内容。