拨号 tcp: 查找 ip-xx-xx.ec2.internal: 没有这样的主机

Kin*_*ord 4 tcp go apache-kafka sarama

我正在使用 github.com/Shopify/sarama 包与 Kafka 交互。在我当前的方法中,我可以连接到代理并毫无问题地获取所有主题名称(下面的消费者代码)

但是,当我尝试使用管理客户端(下面的管理代码)删除某些主题时,我收到“拨号 tcp:查找 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()

Run Code Online (Sandbox Code Playgroud)

行政


    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)
    }
Run Code Online (Sandbox Code Playgroud)

注意我通过转发 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`
Run Code Online (Sandbox Code Playgroud)

更新2

我的卡夫卡服务器属性:

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
Run Code Online (Sandbox Code Playgroud)

Rob*_*att 7

当客户端连接到代理(在您的情况下localhost:9092)时,代理会提供集群中所有其他代理的客户端详细信息。您可以在日志中看到这一点:

初始连接

fetching metadata for all topics from broker localhost:9092
Run Code Online (Sandbox Code Playgroud)

经纪商详情:

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
Run Code Online (Sandbox Code Playgroud)

您遇到的问题是您的客户端随后将使用这些代理详细信息与集群进行进一步通信。代理给出的这些地址称为广告监听器。即经纪人“宣传”的听众。

这意味着您的客户端必须能够解析并连接到代理在初始连接时返回的侦听器的主机和端口。

黑客攻击你的工作的原因/etc/hosts是你的本地客户端可以将这些地址解析回本地主机,然后 SSH 转发工作。但这只是一个黑客。

您应该advertised.listeners代理配置中将您的地址设置为客户端可以解析的地址(无需任何客户端黑客/etc/hosts攻击)。

要详细了解更多信息,请参阅https://rmoff.net/2018/08/02/kafka-listeners-explained/


编辑:要明确的是,您应该将每个代理上的地址设置为您的客户端advertised.listeners可以解析的地址- 因此,如果是通过本地主机 SSH 转发,请设置为.advertised.listenerslocalhost:9092