如何列出集群中所有可用的 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:客户端已经没有可用的代理与之交谈(您的集群是不是可达?)