kafka 集群环境搭建踩过的坑

文摘   2023-10-11 10:30   江苏  
  1. 背景

    当下有很多MQ产品,kafka作为其中之一,“优异”性能使得技术人员在选型时会自动想到它,面试运气不好有可能也会被问到,最重要的问题是我看其他同学每次新需求过来,业务要求处理新消息,因为本地没有搭建kafka环境,都是代码盲打后上测试环境去验证,本着节约(开发)时间和学习的态度,在开发机搭建一套环境便事出有因了。

  2. 依赖项

    kafka需要依赖zookeeper分布式协调框架来完成生产者(Producer)、消费者(Consumer)的注册和集群策略的管理等操作,以需要先行安装。感兴趣的同学可先花点儿时间移步至《ZooKeeper 集群环境搭建与底层原理》一篇查看相关步骤及知识点


  3. kafka组装

  4. 3.1.下载:可以直接访问URL:https://kafka.apache.org/downloads 获取到对应的安装文件。


    3.2. 创建目录:解压下载文件后在目录下创建日志文件夹,因为kafka依赖zk,为了更清晰的区分运行所产生的日志,本人这里分开创建。


    3.3. 修改配置:config目录下有2个文件需要稍作修改:server.properties和zookeeper.properties。



    3.4. 启动kafka在这个过程踩了好多坑,共享出来,希望同学们能绕道行驶。毫无意识的就下错了文件:

    下载红框标注的文件的后,运行提示找不到主类Kafka,查了好多资料(划了好多水),后来看到一句话触动到我敏感的神经——“如果下载的是带src的,意味着是源码,要自己编译”。但kafka又是用gradle编译的,我本机是maven,果断放弃



    重新下载绿框对应的二进制的文件修改配置后,总算没有这个提示了,但不影响另一个失败的提示


    无论如何尝试修改启动命令的path(相对、绝对)对应的文件,都提示:命令语法不正确,百度显示可能的情况(建议路径不要有中文、不要带空格、特殊符号)就太多了,但都不符合本人的情况,后来我灵机一动,会不会是win10 dos命令窗口的问题,因为不是管理员身份调出的,所以换成系统自带的Powershell窗口,果然不出所料,不能说一模一样,只能说毫无起色


    暂时无解,如果还有一个人能解决,那一定是公司的运维,毕竟他们经常搞这些,最后的“救命稻草”建议用引号把命令包起来


    果然老还是姜的辣,总会在人绝望的时候给一丝希望。古人云:“听人劝,吃饱饭”是有道理的,迫不及待的修改后重试,真的绝了,跟我想的不一样——没有~任何~起色~

    我还想着成功了跟同学们分享呢、脑袋还浮现出曾经吐槽同学为什么不在本地搭一套呢,同学知道我搭建没成功会不会很丢人,此刻我CPU温度已经上升了,急需降(hua)温(shui);可能这个问题让运维也好奇,后来让我换一个目录试试, 我怀(ban)揣(xin)好(ban)意(yi)的试了一把:


    人生就是这样,当你不抱希望的时候,只管踏实做事,结果总会出人意料。这回没有报错提示,它启动了而且成功了


    一脸疑惑,满满的求知欲驱使着去请教运维大佬,回复如下:


    有的时候就是这样,该死的经验和可怕直觉引导着这样调整先试试看,当“灵异事件”发生后,若要问为什么?答案是不知道!关于命令提示符 (cmd. exe) 命令行字符串限制问题查了好多资料,相对来说比较靠谱的是在URL:https://learn.microsoft.com/zh-CN/troubleshoot/windows-client/shell-experience/command-line-string-limitation 上的解释:

  5. 小测kafka

    既然环境好了,当然要试一下相关的命令,为了避免混淆,我用dos启动zookeeper,Powershell启动kafka:

    出师不利,第一个命令:.\bin\windows\kafka-topics.bat --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 1 --topic siri ,我又失败了,好在这个比较简单,原因是低版本才用zookeeper关键字,当前安装的版本应该用bootstrap-server,调整后再试:

    发现还是没用,zk一直在报错:java.io.IOException: Unreasonable length = 308375649!没有人能随随便便成功,这年头吃碗饭真是太不容易了,没办法只好继续排查,又找了好多资料(其实都差不多,百度推荐的连接打开基本都是你抄我抄你的),后来发现有个配置项不一样:

    网上的同学展示的配置都有端口的调整(大家版本不一样),我的kafka默认监听在9092上,而且(上面提到)broker.id是从1开始递增的,后面准备做三台,所以端口调整为9091试试看:


    这回真的成功了,通过命令:.\bin\windows\kafka-topics.bat  --bootstrap-server localhost:9091 --list也可以看到(在当前集群下)创建的topic;为了验证刚才不是梦,我特意又试了一把:

    虽然我再次看到了失败的提示,但我知道成功了,因为上面的提示很好解决,只要我把剩下的2个实例启动就OK,本人当前的环境如下(包含以前讲的《ZooKeeper 集群环境搭建与底层原理》):



    启动后再次创建了topic study,通过查看topic list正确显示了当前所有topic,到这里可以大(ruo)声(ruo)宣布:windows环境下kafka的集群环境搭建成功


  6. kafka 通信

    所有的前置条件都准备好了,最后再通过命令行展示一下kafka作为MQ它的生产者和消费者模式:

    生产者:.\bin\windows\kafka-console-producer.bat --broker-list localhost:9091 --topic study

    消费者.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9093 --topic study --from-beginning


    我特意选了9091发,9093消费试试看能不能通,结论显示没有问题,因为kafka本身是去中心化的,通过命令(.\bin\windows\kafka-topics.bat --describe --topic study --bootstrap-server localhost:9092)查看任意节点间互为其它节点幅本:



    消息发送到kafka的topic中后,如果需要在不同的业务逻辑中消费,需要通过groupId来实现,因为一个consumer只属于一个group。用命令:

    创建group.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9093 --topic study --consumer-property group.id=group_one

    查看该组的消费详情:

    .\bin\windows\kafka-consumer-groups.bat --bootstrap-server localhost:9091 --describe --group group_one

    Current-Offset:最后被消费的消息偏移量

    Log-End-Offset:最一条消息的偏移量(消息总量

    Lag:当前积压多少消息


  7. 命令整理

    上面陆陆续续敲打了一些命令,方便同学查阅,本人稍作整理:

    --创建topic

    .\bin\windows\kafka-topics.bat --create --bootstrap-server localhost:9091 --replication-factor 1 --partitions 1 --topic study

    --修改topic:

    .\bin\windows\kafka-topics.bat --bootstrap-server localhost:9091 --alter --topic study --config max.message.bytes=2048(segment.bytes=2048)

    .\bin\windows\kafka-topics.bat --bootstrap-server localhost:9091 --alter --topic study --delete-config max.message.bytes

    .\bin\windows\kafka-topics.bat --bootstrap-server localhost:9091 --alter --topic study--partitions 2

    --查看topic:

    .\bin\windows\kafka-topics.bat  --bootstrap-server localhost:9091 --list

    --查看某个topic:

    .\bin\windows\kafka-topics.bat --describe --topic study --bootstrap-server localhost:9092

    --生产消息

    .\bin\windows\kafka-console-producer.bat --broker-list localhost:9091 --topic study

    --消费消息

    .\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9093 --topic study --from-beginning(from-beginning从第一条消息消费,反之从最后一条+1的位置 

    .\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test-log --partition 0 --offset 1(offset需要和partition一起使用,不能单独使用

    --创建group

    .\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9093 --topic study --consumer-property group.id=group_one

    --查看该组的消费详情

    .\bin\windows\kafka-consumer-groups.bat --bootstrap-server localhost:9091 --describe --group group_one (不区分也可以用--all-group --all-topics

    --删除topic:

    .\bin\windows\kafka-topics.bat --delete --topic siri --bootstrap-server localhost:9091


  8. 对接

    可能通过命令查看zk下kafka的集群的情况,也可以按zk集群环境搭建篇中提到的工具(prettyZoo)查看注册的节点:


    至此,环境问题算彻底搞定,已做好理解kafka底层原理篇幅的准备,关于kafka创建时命令中的partitions与replication-factor 参数,且听下回分解……


    老规矩,如果你觉得哪里有问题,欢迎指正




晚霞程序员
一位需要不断学习的30+程序员……