系列文章目录
目录
环境说明
笔者使用Mac笔记本,安装了 VMWare Fusion,准备采用三个节点的虚拟集群安装Zookeeper和Kafka,并在集群之上运行zk和Kafka的集群模式,之后在这个上面进行一系列的学习和实验。需要说明的是:笔者这里服务启动和管理均采用非 root 用户,均使用了 kafka 用户。
Kafka 版本:2.8.0(Scala 2.13 版本 ) 下载地址
zookeeper 版本:3.4.5
Java 版本:Oracle jdk 8 下载地址
Scala 版本:2.13 下载地址
可以在笔者上传的资源直接打包下载地址:打包下载
也可以官网自己手动下载。
虚拟机版本:CentOS 7
其他说明:笔者这里 Kafka 版本使用的是 2.8.0,Kafka 最新的版本为 3.7,这里使用 2.8.0 版本是因为笔者是基于 2.X 版本学习的,二是因为最新版本不再强依赖 Zookeeper,笔者这里计划先用 2.X,之后做一个 Kafka 的版本升级,从 2.X 升级到最新版本,进行数据迁移,客户端兼容并下掉 Zookeeper。
1. 集群创建
1.1 虚拟机安装
首先在 VMWare Fusion 上安装虚拟机,省略
主机名笔者这里三台机器分别设置为kafka001,kafka002,kafka003
root 密码为 root,比较简单;新增用户:kafka,密码:kafka
网络配置为:internet 共享,与我的Mac共享
1.2 设置静态IP地址
如果不设置静态IP的话,每次启动虚拟机的时候可能ip地址可能会变更,会影响集群间的通信和本地连接,很麻烦,所以笔者这里直接设置静态IP,操作如下:
在root用户下,编辑网卡文件(具体需要编辑的网卡文件可以通过 ifconfig 命令查看,) vi /etc/sysconfig/network-scripts/ifcfg-ens33,内容参照以下格式
DEVICE=ens33 网卡设备名
BOOTPROTO=static 是否自动获取IP(none、static、dhcp)
HWADDR=00:0c:29:17:c4:09 MAC地址
NM_CONTROLLED=yes 是否可以由Network Manager图形管理工具托管
ONBOOT=yes 是否随网络服务启动,eth0生效
TYPE=Ethernet 类型为以太网
UUID="44b76c8a-b59f-44..." 唯一标识码
IPADDR=192.168.0.252 IP地址
NETMASK=255.255.255.0 子网掩码
GATEWAY=192.168.0.1 网关
DNS1=202.206.0.20 DNS
IPV6INIT=no IPv6没有启用
USERCTL=no 不予许非root用户控制此网卡
配置好之后,可以使用 systemctl restart network.service 重启网卡,使用 ping www.baidu.com 判断网络是否正常
其中查看 Mac 子网掩码:cat /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf | grep netmask
查看 Mac 网关:cat /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf | grep "ip =" -B 1
1.3 集群免登录设置
使用 ssh 登录时,每次都需要输入密码,可以使用免密码登录,用密钥认证代替密码认证,具体操作是:
1) 配置 /etc/hosts 文件,配置 ip 和 hostname 的对应关系(需要root用户权限);
2) 使用命令在本地生成密钥对,不停回车就可以:ssh-keygen -t rsa;
3) 将公钥复制到其他节点:ssh-copy-id kafka@kafka002, ssh-copy-id kafka@kafka003。
设置好之后,就可以使用 ssh kafka@kafka002 进行免密登录了。
1.4 踩坑
1. 把网关一直配置成了 172.16.80.1,网络一直无法 ping 通 www.baidu.com,后来运行了 查看网关的命令,才发现网关配置错了。所以配置的时候一定要看清网关和子网掩码是否正确;
2. 笔者这里服务启动和管理均采用非 root 用户,root 用户对初学者很友好,但是权限太大,一般不会再生产使用,所以笔者这里使用 kafka 用户,所以很多时候可能会出现文件权限问题,请检查文件是否有读取、写入、执行的权限,可以使用 chown 文件 kafka,将文件的所有用户改为 kafka,或者使用 chmod o+r kafka 给 kafka 用户添加对应的权限,这里不再详细展开,有问题欢迎在评论区留言。
2. Zookeeper安装
2.1 Java 安装
笔者的所有安装包都安装到了 /opt 目录下,下载 jdk 安装包,Linux x64 jdk 8 的下载地址:点击下载
其他版本可以到 Oracle jdk 官网 下载。
wget 可以进行下载,或者下载后使用 scp(只有在 mac 或者 Linux 的操作系统可用)或者 ssh 工具 copy 到虚拟机
tar -zxvf 压缩包 -C /opt,解压到 /opt 目录下
vi /etc/profile (root 权限), 将下列配置添加到 profile 文件中,其中 jdk 为解压后的文件名称
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile 刷新配置,jdk -version 命令输出 jdk 版本,安装成功
2.2 Zookeeper 安装
下载 Zookeeper 安装包,同 jdk,不再赘述。
tar -zxvf 压缩包 -C /opt,解压到 /opt 目录下
vi /etc/profile (root 权限), 将下列配置添加到 profile 文件中,其中 zookeeper 为解压后的文件名称
export ZK_HOME=/opt/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$ZK_HOME/bin
source /etc/profile 刷新配置
zkServer.sh start /opt/zookeeper/conf/zoo_sample.cfg,启动Zookeeper
可以使用 zkCli.sh kafka001:2818 连接到 Zookeeper 的服务上,查看和管理目录文件
2.3 简单配置
/opt/zookeeper/conf/ 路径,相关配置在这个目录下,
/opt/zookeeper/bin/ 路径下为命令文件,其中 zkServer.sh 是服务端命令,zkCli.sh 是客户端命令,zkEnv.sh 是环境变量相关的参数,可以把 cmd 文件都删除
首先在 zkEnv.sh 中添加下面变量的定义,ZK_HOME 为 Zookeeper 的根路径,ZOOCFGDIR 是配置文件的根路径,ZOO_LOG_DIR 为日志文件的路径(需要有写权限)
ZK_HOME=/opt/zookeeper
ZOOBINDIR=${ZOOBINDIR:-/usr/bin}
ZOOKEEPER_PREFIX=${ZOOBINDIR}/..
ZOOCFGDIR=${ZK_HOME}/conf
ZOO_LOG_DIR=/var/lib/zookeeper/log
ZOOCFG 改为 "zoo.cfg"
之后,进到 /opt/zookeeper/conf/ 路径,复制配置文件 cp zoo_sample.cfg zoo.cfg
vi zoo.cfg,编辑配置文件
dataDir=/var/lib/zookeeper (需要有写权限)
server.1=kafka001:2888:3888
server.2=kafka002:2888:3888
server.3=kafka003:2888:3888
2.4 踩坑
1. ZOO_LOG_DIR 和 dataDir 的路径一定要有写权限,数据路径不配置默认是 /tmp 下的路径,会隔天删除数据,最好不要使用,日志路径一定要自定义,不然找日志文件都不方便;
2. 启动的时候会报错没有设置 myid,需要在 dataDir 路径下建一个 myid 的文件,内容和 zoo.cfg 中各自节点的 server.id 的 id 一致即可;
3. 启动的时候报错 java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable),可能是因为节点的防火墙打开了,导致节点间的通信异常,需要关闭防火墙或者打开需要的端口,笔者这里直接关闭防火墙:systemctl stop firewalld,并且开机启动时关闭防火墙:systemctl disable firewalld,记得需要 root 权限。
3. Kafka安装
3.1 scala安装
scala 版本和 Kafka 需要的版本保持一致,笔者这里采用的 scala 2.13,同 jdk 安装差不多,下载完成后解压到 /opt 目录下,然后再配置环境变量,命令如下:
tar -zxvf 压缩包 -C /opt
vim /etc/profile,添加 scala 命令到环境变量(需要root权限)
export SCALA_HOME=/opt/scala
export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin:$ZK_HOME/bin
source /etc/profile,刷新环境变量
scala -version,打印出 scala 版本,表示安装成功
3.2 Kafka 安装
下载完成之后大致操作一样,解压到 /opt 目录下,添加环境变量,刷新环境变量,这里不再赘述,可以自己进行操作,有问题评论区留言。最后 使用 kafka-server-start.sh /opt/kafka/config/server.properties,启动 kafka,启动成功,即安装成功。
bin 目录为命令文件目录, config 目录为配置目录。暂时关注这两个目录
3.3 简单配置
这里先修改几个简单的配置,启动 Kafka 的集群模式,且使用安装好的 Zookeeper 集群。
vim config/server.properties,找到对应的配置并修改,没有的新增:
broker.id=1 (Kafka服务节点的id,默认为-1,三个节点这里分别设置1,2,3)
log.dirs=/var/lib/kafka/log (Kafka 日志文件,此日志文件并发 Kafka 服务运行打印的日志,Kafka 的数据是以日志保存的,这里相当于 Kafka 的数据)
kafka.logs.dir=/var/lib/kafka/logs (Kafka 运行时服务打印的日志文件,两个目录都要有写权限)
num.partitions=3 (默认的分区个数,笔者这里设置为 3)
zookeeper.connect=kafka001:2181,kafka002:2181,kafka003:2181 (Zookeeper服务的链接地址,多个地址用,分割,地址后可以跟目录 kafka001:2181/kafka,这样 kafka 相关的节点数据都会保存到 /kafka 目录下,这样比较容易管理,笔者这里直接使用根目录)
3.4 踩坑
1. 刚开始笔者以为 log.dirs 是保存的 Kafka 服务运行打印的日志文件,一直找不到日志,后来才发现;
2. 笔者这里的 Zookeeper 和 Kafka 的配置文件均是放在安装包下的原目录,最好的方法是放在 /etc 目录下,独立管理,这样版本升级时只需要将配置文件指向原配置文件即可;同样,日志文件和数据文件的路径也可以自己设定,只要 kafka 用户有写入权限即可;
3. 如果用 root 用户先进行启动,之后再使用 kafka 用户启动,很可能报错:java.io.FileNotFoundException: state-change.log (权限不够),需要先删除掉 root 用户创建的日志文件,保证目录有写的权限,再使用 kafka 用户启动。
4. 设置开机启动
线上如果部署了 kafka 和 Zookeeper,肯定是要开机启动的,笔者这里也进行了开机启动的设置。开机启动的两种方式:使用系统服务(Systemd),可以使用 systemctl 进行管理;使用 init.d 脚本。笔者这里使用第一种方式,这里只做第一种方式的介绍。
本章需要使用 root 用户进行配置。
4.1 Zookeeper 设置开机启动
1. 创建一个名为 zookeeper.service 的文件 /etc/systemd/system/ 目录下,需要 root 权限;
2. 文件配置如下(因为格式,笔者这里加了 tab,文件里不需要),括号内的内容为注释,也不需要:
[Unit]
Description=Zookeeper service
After=network.target(需要网络服务)
Requires=network.target(需要网络服务)
ConditionPathExists=/opt/zookeeper/conf/zoo.cfg(需要配置文件,设置配置文件地址)
[Service]
Type=forking Environment="PATH=/opt/jdk/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$PATH"(设置环境变量)
User=kafka(使用 kafka 用户运行)
Group=kafka(使用 kafka 组运行)
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg(执行启动命令,需要加上配置文件)
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg(执行停止命令,需要加上配置文件)
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg(执行重新启动命令,需要加上配置文件)
WorkingDirectory=/var/lib/zookeeper(工作路径)
[Install]
WantedBy=multi-user.target
3. 重新加载 systemd 管理器配置,systemctl daemon-reload
4. 启动 kafka 服务并设置开机自启
systemctl start kafka
systemctl enable kafka
4.2 Kafka 设置开机启动
步骤同 zookeeper 设置开机启动,笔者这里不做赘述,只贴 kafka.service 的配置:
[Unit]
Description=Apache Kafka Server
Documentation=http://kafka.apache.org/
Requires=zookeeper.service
After=network.target zookeeper.service
[Service]
Type=simple
User=kafka
Group=kafka
Restart=on-failure
Environment="LOG_DIR=/var/lib/kafka/logs"
Environment="JAVA_HOME=/opt/jdk"
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
[Install]
WantedBy=multi-user.target
4.3 踩坑
1. Zookeeper 服务一直无法启动:最开始笔者设置的启动命令为:/opt/zookeeper/bin/zkServer.sh start,systemctl start zookeeper 后一直无法启动,后来找了很久,试了很多次,加上配置文件之后才正常,后来网上查才知道:systemd启动的服务通常不会加载用户的环境变量,所以这两个配置文件都有一些 Environment 配置,加载环境变量。
2. Zookeeper 启动后日志无法打印,报错:
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.server.quorum.QuorumPeerConfig).
log4j:WARN Please initialize the log4j system properly.
如同第 1 条,环境变量没有加载到,log4j 的配置文件没有加载到,在 zkEnv.sh 文件中增加配置:
ZK_HOME=/opt/zookeeper
ZOOBINDIR=${ZOOBINDIR:-/usr/bin}
ZOOKEEPER_PREFIX=${ZOOBINDIR}/..
ZOOCFGDIR=${ZK_HOME}/conf
ZOO_LOG_DIR=/var/lib/zookeeper/log
其中 ZOOCFGDIR 就是配置文件加载的地址。
3. kafka 也类似的问题,日志没有打印到对应位置,就设置 Environment="LOG_DIR=/var/lib/kafka/logs" 环境变量。
写在最后:因笔者水平有限,难免会有问题,如有问题,欢迎在评论区指出;若安装时遇到任何问题,也欢迎在评论区贴出,一起讨论。