如何列出集群中所有可用的 Kafka 代理?

Posted

技术标签:

【中文标题】如何列出集群中所有可用的 Kafka 代理?【英文标题】:How to list all available Kafka brokers in a cluster? 【发布时间】:2017-03-02 00:15:05 【问题描述】:

我正在编写一个 shell 脚本来监控 kafka 代理。

我浏览了一些链接,发现如果 ZooKeeper 包含代理列表,并且在此列表中存在 IP 地址,则说明 kafka 代理正在运行。

我想要一个可以在我的 shell 脚本中使用的命令来获取代理列表并检查 kafka 是否正在运行。

有没有curl命令可以像elasticsearch一样获取kafka集群状态?

【问题讨论】:

我知道在 Kafka 的 bin 文件夹中的 zookeper-shell 脚本中,您可以调用 ls /brokers/ids 来获取当前活跃的经纪人的 ID。我不知道如何将它作为参数传递给脚本... 【参考方案1】:

此命令将为您提供括号中的活动代理列表:

./bin/zookeeper-shell.sh localhost:2181 ls /brokers/ids

【讨论】:

谢谢先生的回复。运行命令 Connecting to xx.xx.xx.xxx:2181 Welcome to ZooKeeper! JLine support is disabled WATCHER:: WatchedEvent state:SyncConnected type:None path:null [0, 1, 3] 时出现以下错误 @ShivkumarMallesappa,这意味着你还活着的经纪人是 id 0、1 和 3 的经纪人。 先生,是否有可能获得经纪人的 ips,否则我如何才能检查哪个经纪人活着,哪个经纪人没有。谢谢 我不确定,但是当你启动代理时,你使用一个配置文件,你在其中分配 id...也许你可以在那时建立一个查找表来获取来自 broker id 的 ip? 我在这个问题的下方添加了一个答案来帮助你解决@ShivkumarMallesappa【参考方案2】:

使用 Zk-Client 的另一种方式:

如果您不喜欢将参数传递给./zookeeper-shell.sh 并希望从 Zookeeper CLI 中查看代理详细信息,则需要安装独立的 Zookeeper(因为传统的 Kafka 不提供 Jline JAR)。

一旦你安装(解压缩)独立的 Zookeeper,然后:

运行 Zookeeper CLI:$ zookeeper/bin/zkCli.sh -server localhost:2181#Make sure your Broker is already running

如果成功,可以看到Zk客户端运行为:

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]
您可以在此处使用各种命令浏览代理详细信息:

$ ls /brokers/ids# Gives the list of active brokers$ ls /brokers/topics#Gives the list of topics$ get /brokers/ids/0#Gives more detailed information of the broker id '0'

【讨论】:

如何使用 bash 脚本触发这些命令(ls /brokers/ids)? 当你运行 Zookeeper CLI 时,你会得到一个提示。您已经在该提示符下运行了这些命令。 上面写着Node doesn't exist【参考方案3】:
echo dump | nc localhost 2181 | grep brokers

(将localhost替换为运行zookeeper的主机)

【讨论】:

这并不总是列出我的经纪人,有时列表是空的。不知道具体是什么原因,好像是因为nc输出不同步 这种方式很方便,因为您可以轻松地在wc -l 命令中通过管道输出 致@dhalfageme:这对您来说不一致的原因是nc 在回复数据返回前一纳秒就退出了。使其保持一致的方法是要求nc 在退出前等待至少 1 秒:nc -q 1 localhost 2181【参考方案4】:

以下是我在将 Kafka 数据加载到演示环境中的 bash 脚本时使用的几个快速函数。在此示例中,我使用了没有安全性的 HDP,但它很容易修改为其他环境,并且旨在快速和实用,而不是特别健壮。

第一个从配置中检索第一个 ZooKeeper 节点的地址:

ZKS1=$(cat /usr/hdp/current/zookeeper-client/conf/zoo.cfg | grep server.1)
[[ $ZKS1 =~ server.1=(.*?):[0-9]*:[0-9]* ]]
export ZKADDR=$BASH_REMATCH[1]:2181
echo "using ZooKeeper Server $ZKADDR"

第二个从 ZooKeeper 检索 Broker ID:

echo "Fetching list of Kafka Brokers"
export BROKERIDS=$(/usr/hdp/current/kafka-broker/bin/zookeeper-shell.sh $ZKADDR <<< 'ls /brokers/ids' | tail -1)
export BROKERIDS=$BROKERIDS//[!0-9 ]/
echo "Found Kafka Broker IDS: $BROKERIDS"

第三个再次解析 ZooKeeper 以检索 Kafka Brokers Host:port 列表,以便在命令行客户端中使用:

unset BROKERS
for i in $BROKERIDS
do
DETAIL=$(/usr/hdp/current/kafka-broker/bin/zookeeper-shell.sh $ZKADDR <<< "get /brokers/ids/$i")
[[ $DETAIL =~ PLAINTEXT:\/\/(.*?)\"\] ]]
if [ -z $BROKERS+x ]; then BROKERS=$BASH_REMATCH[1]; else 
BROKERS="$BROKERS,$BASH_REMATCH[1]"; fi
done
echo "Found Brokerlist: $BROKERS"

【讨论】:

【参考方案5】:

如果您使用的是新版本的 Kafka,例如5.3.3,可以使用

kafka-broker-api-versions  --bootstrap-server BROKER | grep 9092

您只需要通过其中一个经纪人

【讨论】:

如果可用,它是 IMO 最干净的选项 'grep' 不是内部或外部命令、可运行程序或批处理文件。【参考方案6】:

在 MacOS 上,可以试试:

brew tap let-us-go/zkcli
brew install zkcli

zkcli ls /brokers/ids
zkcli get /brokers/ids/1

【讨论】:

这很有帮助【参考方案7】:

通过 shell 脚本尝试使用 zookeeper 命令

zookeeper/bin/zkCli.sh -server localhost:2181

【讨论】:

【参考方案8】:

使用Confluent's REST Proxy API v3:

curl -X GET -H "Accept: application/vnd.api+json" localhost:8082/v3/clusters

localhost:8082 是 Kafka 代理地址。

【讨论】:

【参考方案9】:

我是这样做的

#!/bin/bash

ZK_HOST="localhost"
ZK_PORT=2181


for i in `echo dump | nc $ZK_HOST $ZK_PORT | grep brokers`
do
    echo $i
    DETAIL=`zkCli -server "$ZK_HOST:$ZK_PORT" get $i 2>/dev/null | tail -n 1`
    echo $DETAIL
done

【讨论】:

以上是关于如何列出集群中所有可用的 Kafka 代理?的主要内容,如果未能解决你的问题,请参考以下文章

恐慌:kafka:客户端已经没有可用的代理与之交谈(您的集群是不是可达?)

设置Kafka集群的方法

在Kafka Connect中,如何连接多个kafka集群?

如何使两个DC之间的kafka集群中的生产者幂等?

kafka集群启动和停止

常用组件kafka集群hadoop高可用