要让Kafka运行,您需要在config/server.properties
文件中设置一些属性。我不明白有两种设置。
有人可以解释一下listeners和advertised.listeners属性之间的区别吗?
文档说:
listeners:套接字服务器侦听的地址。
和
advertised.listeners: 经纪人将向生产者和消费者宣传的主机名和端口。
我何时必须使用哪种设置?
答案 0 :(得分:29)
由于我无法发表评论,我将发布此作为"答案",添加到M.Situations的答案。
在他链接的同一文档中,有一个关于KAFKA客户端(https://cwiki.apache.org/confluence/display/KAFKA/KIP-103%3A+Separation+of+Internal+and+External+traffic)使用哪个监听器的模糊:
如前所述,客户端永远不会看到侦听器名称,并且会像以前一样完成元数据请求。不同之处在于,它们返回的端点列表仅限于发出请求的端点的侦听器名称。
这一点非常重要,具体取决于您在bootstrap.servers配置中使用的URL,如果它映射到advertised.listeners中,客户端将返回的URL *(如果监听器不知道该行为是什么)不存在)。
另请注意:
例外是基于ZooKeeper的消费者。这些消费者直接从ZooKeeper检索代理注册信息,并将选择第一个使用PLAINTEXT作为安全协议的侦听器(它们支持的唯一安全协议)。
作为示例代理配置(对于集群中的所有代理):
advertised.listeners = EXTERNAL://XXXXX.compute-1.amazonaws.com:9990,内部://ip-XXXXX.ec2.internal:9993
inter.broker.listener.name = INTERNAL
listener.security.protocol.map = EXTERNAL:SSL,内部:PLAINTEXT
如果客户端使用XXXXX.compute-1.amazonaws.com:9990进行连接,则元数据提取将转到该代理。但是,与组协调员或领导者一起使用的返回URL可以是123.compute-1.amazonaws.com:9990*(另一台机器!)。这意味着匹配是在KIP-103公布的侦听器名称上完成的,而不管实际的URL(节点)。
由于EXTERNAL的协议映射是SSL,因此会强制您使用SSL密钥库进行连接。
另一方面,如果您在AWS内部,那么您可以发出ip-XXXXX.ec2.internal:9993,相应的连接将是协议映射的纯文本。
在IaaS中尤其需要这样,在我的案例中,经纪人和消费者都在AWS上,而我的制作人则生活在客户端网站上,因此需要不同的安全协议和听众。
编辑: 此外,由于您为不同的客户(经纪人,生产者,消费者)提供了不同的端口,因此添加入站规则要容易得多。
答案 1 :(得分:17)
listeners
是代理用于创建服务器套接字的内容。
advertised.listeners
连接经纪人。
如果您有“复杂”的网络设置(公共和私有子网以及中间路由),这两个设置可能会有所不同。
答案 2 :(得分:4)
在0.9.0.0发布周期中,每个支持多个侦听器 经纪人介绍。每个侦听器都与安全性相关联 协议,ip /主机和端口。与广告结合使用时 听众机制,有一个相当大的灵活性 限制:每个安全协议中最多只有一个监听器 两个配置(监听器和advertised.listeners)。
在某些环境中,人们可能希望区分外部 客户端,内部客户端和复制流量独立于 出于成本,性能和安全原因的安全协议。一些 举例说明:
- 复制流量分配给单独的网络接口,因此不会干扰客户端流量。
- 外部流量通过代理/负载均衡器(安全性,灵活性),而内部流量直接攻击代理 (表现,费用)。
- 外部流量与内部流量的不同安全设置,即使安全协议相同(例如,不同的设置) 启用SASL机制,身份验证服务器,不同的密钥库, 等)
因此,我们建议Kafka经纪人应该能够定义 用于绑定的相同安全协议的多个侦听器(即 听众)和共享(即advertised.listeners)以便内部, 如果需要,可以分离外部和复制流量。
所以,
listeners - 我们将监听的以逗号分隔的URI列表及其协议。
将主机名指定为0.0.0.0
以绑定到所有接口。
将hostname保留为空以绑定到默认接口。
合法听众列表的示例:
PLAINTEXT://myhost:9092,TRACE://:9091
PLAINTEXT://0.0.0.0:9092, TRACE://localhost:9093
advertised.listeners - 发布到ZooKeeper以供客户端使用的侦听器(如果与上面的侦听器不同)。
在IaaS环境中,这可能需要与代理绑定的接口不同。如果未设置,则将使用listeners
的值。