初学kafka踩坑指南

177 阅读5分钟

前言

由于工作需要,需要使用mq队列来解决异步调用问题,综合考虑各种使用情况及现有环境的适用性以及团队内的接受度,选择使用kafka来做为mq队列,一则和java耦合度较高,调用简单,二来业务相对来说允许一定的数据丢失率。

一、安装kafka

1.安装linux版本kafka

kafka安装包自带zookeeper,但由于内置的zookeeper效果不好,复用性不强,在使用过程中我们一般会选择外置独立zookeeper来使用。 本文采用zookeeper-3.4.10以及kafka_2.12-1.0.0

1)安装java环境

jdk安装就不多赘述了,自行百度即可,需要注意的是请尽量安装jdk1.8及以上版本

2)安装zookeeper

2.1 下载

下载安装包 https://zookeeper.apache.org/releases.html

2.2解压

下载后解压即可 tar -zxvf zookeeper-3.4.10.tar.gz

2.3修改配置文件

// 1.进入配置文件目录
cd apache-zookeeper-3.7.0/conf
// 2.将zoo_sample.cfg这个文件复制为zoo.cfg (注意:文件名一定要是zoo.cfg) cp zoo_sample.cfg  zoo.cfg
// 3.修改配置文件vi zoo.cfg

1641439995(1).png

特别注意

jdk,zookeeper,kafka一定要记得配置环境变量,具体操作如下:

    ##1.打开环境变量配置文件
    vi ~/.bashrc
    ##2.修改文件
    # .bashrc
    # User specific aliases and functions
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
    #set oracle jdk environment
    export JAVA_HOME=/usr/local/java/jdk/jdk1.8.0_241  ## 这里要注意目录要换成自己解压的jdk 目录
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    #export PATH=${JAVA_HOME}/bin:$PATH;/usr/local/java/kafka/kafka/bin:$ZOOKEEPER_INSTALL/bin:$PATH
    export ZOOKEEPER_INSTALL=/usr/local/java/zookeeper/zookeeper
    export PATH=${JAVA_HOME}/bin:/usr/local/java/kafka/kafka/bin:$ZOOKEEPER_INSTALL/bin:$PATH
    ##3.执行修改
    source ~/.bashrc
    或者 . ~/.bashrc 来使编辑的环境变量生效

2.4 启动zookeeper

进入zookeeper安装目录下的bin目录下执行以下指令即可

./zkServer.sh start

1641449554(1).png

 #停止
 ./zkServer.sh stop
 #重启
 ./zkServer.sh restart
 #查看状态
 ./zkServer.sh status

3)安装kafka

3.1 下载

下载安装包 https://kafka.apache.org/downloads

3.2解压

下载后解压即可 tar -zxvf kafka_2.12-1.0.0.tar.gz

3.3修改配置文件

// 1.进入配置文件目录
cd kafka_2.12-1.0.0/config
// 2.修改配置文件vi zookeeper.properties以及vi server.properties
//zookeeper.properties配置如下,

1641614320(1).png 注意:如果采用外置的zookeeper的话,可不用关注此配置文件

//server.peoperties配置如下
broker.id=0 
port=9092 #端口号 
host.name=localhost #单机可直接用localhost
log.dirs=/usr/local/java/kafka/kafka/kafkadata #日志存放路径可修改可不修改
zookeeper.connect=localhost:2181 #zookeeper地址和端口,单机配置部署,localhost:2181 (如果是集群配置,请把全部zookeeper地址配置上,用逗号分割)
listeners=PLAINTEXT://172.30.105.96:9092 #此项单机使用时注掉,远程访问时请开启,ip地址配置本机ip(特别注意ip地址,现在的云服务器是一组ip,需使用ifconfig指令查询自己本机所在ip)

特别注意

jdk,zookeeper,kafka一定要记得配置环境变量,具体操作如下:

    ##1.打开环境变量配置文件
    vi ~/.bashrc
    ##2.修改文件
    # .bashrc
    # User specific aliases and functions
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
    #set oracle jdk environment
    export JAVA_HOME=/usr/local/java/jdk/jdk1.8.0_241  ## 这里要注意目录要换成自己解压的jdk 目录
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    #export PATH=${JAVA_HOME}/bin:$PATH;/usr/local/java/kafka/kafka/bin:$ZOOKEEPER_INSTALL/bin:$PATH
    export ZOOKEEPER_INSTALL=/usr/local/java/zookeeper/zookeeper
    export PATH=${JAVA_HOME}/bin:/usr/local/java/kafka/kafka/bin:$ZOOKEEPER_INSTALL/bin:$PATH
    ##3.执行修改
    source ~/.bashrc
    或者 . ~/.bashrc 来使编辑的环境变量生效

3.4 启动zookeeper

进入zookeeper安装目录下执行以下指令即可

./bin/kafka-server-start.sh ./config/server.properties

1641622672(1).png

 #停止
 ./bin/kafka-server-stop.sh ./config/server.properties

3.5 kafka创建topic及生产消费测试

    #1.创建topic
    命令:在kafka 目录下bin目录下执行:
    ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic demo  demo是topic名字可以随意更换
    #2.查看topic
    命令:在kafka 目录下bin目录下执行:
    ./kafka-topics.sh --list --zookeeper localhost:2181
    #3.删除topic
    命令:在kafka 目录下bin目录下执行:
    ./kafka-topics.sh --delete --zookeeper localhost:2181 --topic demo   demo是要删除的topic名称
    ###1.生产者测试
    命令:在kafka 目录下bin目录下执行:
    ./kafka-console-producer.sh --broker-list localhost:9092 --topic demo(要启动生产者的topic名称)
    
    ###2.消费者测试
    命令:在kafka 目录下bin目录下执行:
    ./kafka-console-consumer.sh --zookeeper localhost:2181 --topic demo --from-beginning
    注意:消费这边有几个需要注意的点:
    1)当我们输入--zookeeper指令时,系统会提示让我们输入--bootstrap-server,此时如果我们更换为--bootstrap-server指令后会发现消费者不消费,其实是因为我们当前使用的zookeeper是外置的,如果使用的kafka自带的zookeeper的话两个指令都是可以的
    2)一定要注意端口号是我们配置的zookeeper端口号,如果使用kafka自带zookeeper的话,此时生产者和消费者端口号是一样的

2.安装windows版本kafka

我们在本地开发过程中,很多情况下需要在自己本地先搭建kafka用于开发测试使用,此时可直接使用windows版kafka要使用,简单易上手

1)安装windows版kafka

    kafka安装包中自带两个版本的,所以使用上一份的安装包直接在本地windows电脑解压即可

由于kafka本地使用时往往很多情况下都需要使用命令行来操作,此时用windows自带的命令行很难操作,推荐下载自己使用顺手的工具即可,git是比较好用的命令行工具,但是对linux指令友好,对windows指令支持不太好,我自己使用powershell很方便,在文件夹按住shift+鼠标右键即可选择打开

2)使用

windows版kafka使用和linux版本基本一致,除了指令需要调用windows文件夹下的文件
首先启动zookeeper

1641641667(1).jpg 启动以后界面如下

1641641748(1).jpg

    然后启动kafka

1641641864(1).png 启动以后界面如下

1641641920(1).jpg 生产消费和linux版本一致,就不在赘述了,要注意的是调用windows文件夹下的.bat文件

    特别注意:windows版本踩的坑,注意使用
    windows版本存在bug,在最新版里依然存在,当我们调用删除topic指令删掉指定的topic以后会发现kafka会自动停止运行,并且无法重启,此时也没法通过其他指令去操作kafka,就是无限报log.dirs错误
    此时我们的解决办法是找到当时配置的kafka数据所在目录,即server.properties文件中的log.dir所在路径,删掉所有数据,最好连文件夹一起删掉,以及zookeeper.properties文件中dataDir所在文件夹的所有数据一起删掉,然后重启zookeeper以及kafka即可成功启动并恢复使用
    也就是说因为这个bug,我们在使用windows版kafka时不能删除某个topic,要不就是情况所有topic数据重新生产消费
    linux版本不存在此问题,可放心使用