我正在使用github.com/Shopify/sarama软件包与Kafka进行交互。在我目前的方法中,我可以连接到代理并获取所有主题名称,而不会出现(下面的消费者代码)。
但是,当我尝试使用管理客户端(下面的管理代码)删除某些主题时,我收到了“拨号tcp:lookup ip-xx-xx.ec2.internal:没有这样的主机”错误。
我不知道为什么会收到此错误。我非常感谢任何提示或可能的解决方案。
消费者
config := sarama.NewConfig()
config.Consumer.Return.Errors = true
//get broker
cluster, err := sarama.NewConsumer("localhost:9092", config)
if err != nil {
panic(err)
}
defer func() {
if err := cluster.Close(); err != nil {
panic(err)
}
}()
//get all topic from cluster
topics, _ := cluster.Topics()
管理员
config := sarama.NewConfig()
config.Consumer.Return.Errors = true
config.Version = sarama.V2_4_0_0
//admin broker
admin, err := sarama.NewClusterAdmin("localhost:9092", config)
if err != nil {
panic(err)
}
defer func() {
if err := admin.Close(); err != nil {
panic(err)
}
}()
topic := []string{"test-topic"}
output := admin.DeleteTopic(topic)
if output == nil {
fmt.Printf(" delete - %s\n", topic[0])
} else {
fmt.Println(output)
}
注意:我正在通过转发ssh端口,通过堡垒实例将其连接到远程计算机。
设置sarama.Logger = log.New(os.Stdout, "[sarama] ", log.LstdFlags)
后,我得到以下信息:
[sarama] 2020/03/25 02:08:03 Initializing new client
[sarama] 2020/03/25 02:08:03 client/metadata fetching metadata for all topics from broker localhost:9092
[sarama] 2020/03/25 02:08:04 Connected to broker at localhost:9092 (unregistered)
[sarama] 2020/03/25 02:08:04 client/brokers registered new broker #1001 at ip-x-x-x-1.ec2.internal:9092
[sarama] 2020/03/25 02:08:04 client/brokers registered new broker #1003 at ip-x-x-x-2.ec2.internal:9092
[sarama] 2020/03/25 02:08:04 client/brokers registered new broker #1002 at ip-x-x-x-3.ec2.internal:9092
[sarama] 2020/03/25 02:08:04 Successfully initialized new client
[sarama] 2020/03/25 02:08:04 Failed to connect to broker ip-x-x-x-3.ec2.internal:9092: dial tcp: lookup ip-x-x-x-3.ec2.internal: no such host`
我的kafka server.properties:
advertised.listeners=INTERNAL://ip-x-x-x-1.ec2.internal:9091,EXTERNAL_INSECURE://ip-x-x-x-1.ec2.internal:9092
listeners=INTERNAL://:9091,EXTERNAL_INSECURE://:9092
listener.security.protocol.map=INTERNAL:SSL,EXTERNAL_INSECURE:PLAINTEXT
答案 0 :(得分:2)
当客户端连接到代理(在您的情况下为localhost:9092
时),代理将提供集群中所有其他代理的客户端详细信息。您可以在日志中看到它:
初始连接
fetching metadata for all topics from broker localhost:9092
经纪人详细信息:
registered new broker #1001 at ip-x-x-x-1.ec2.internal:9092
registered new broker #1003 at ip-x-x-x-2.ec2.internal:9092
registered new broker #1002 at ip-x-x-x-3.ec2.internal:9092
您遇到的问题是您的客户端随后将使用这些代理详细信息与集群进行进一步的通信。经纪人提供的这些地址称为广告监听器。即,代理“通告”的侦听器。
这意味着您的客户端必须能够解析并连接到代理在初始连接处返回的侦听器的主机和端口。 / p>
入侵/etc/hosts
的原因是您的本地客户端可以将这些地址解析回localhost,然后SSH转发才起作用。但这只是一个hack。
您应该在经纪人配置中将advertised.listeners
设置为客户端可以解析的地址(不需要任何客户端/etc/hosts
黑客)。
要详细了解此内容,请参见https://rmoff.net/2018/08/02/kafka-listeners-explained/
编辑:为清楚起见,您应该将每个经纪人上的advertised.listeners
设置为您的客户可以解析的地址-如果通过
localhost SSH转发,将advertised.listeners
设置为localhost:9092
。
答案 1 :(得分:1)
因此,将代理地址添加到执行代码的本地计算机上的已知主机/etc/hosts
可以解决问题。
/ etc / hosts:
127.0.0.1 ip-x-x-x-1.ec2.internal
127.0.0.1 ip-x-x-x-2.ec2.internal
127.0.0.1 ip-x-x-x-3.ec2.internal
尽管如此,我仍然不明白为什么我在使用sarama.NewConsumer()
时不需要执行此步骤。