kafka学习(一):Kafka集群安装及踩坑

系列文章目录

kafka学习(一):Kafka集群安装及踩坑

kafka学习(二):Kafka基本概念

kafka学习(三):生产者


目录

环境说明

1. 集群创建

1.1 虚拟机安装

1.2 设置静态IP地址

1.3 集群免登录设置

1.4 踩坑

2. Zookeeper安装

2.1 Java 安装

2.2 Zookeeper 安装

2.3 简单配置

2.4 踩坑

3. Kafka安装

3.1 scala安装

3.2 Kafka 安装

3.3 简单配置

3.4 踩坑

4. 设置开机启动

4.1 Zookeeper 设置开机启动

4.2 Kafka 设置开机启动

4.3 踩坑


环境说明

        笔者使用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共享

        8df7299ee5684e069e5c2aef26e5143a.png

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 判断网络是否正常

0aa0c401ef00490c8a578af6fc55a2cb.png

ad9bdb9d565f4cc0ad14f5b0945b2705.png

        其中查看 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 进行免密登录了。

63237eca6e2949a29918c8d203e73e00.png

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" 环境变量。

写在最后:因笔者水平有限,难免会有问题,如有问题,欢迎在评论区指出;若安装时遇到任何问题,也欢迎在评论区贴出,一起讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值