首页 > 编程知识 正文

spring kafka配置,没有hosts文件

时间:2023-05-03 21:37:26 阅读:16790 作者:3175

问题背景如果前几天,一个kafka群集部署在k8s上,而kafka客户端位于另一个k8s群集的pod的容器中,则kafka群集上配置的advertised_listeners为hostname。 但是,因为我只知道kafka群集的ip地址,所以在客户端直接使用ip操作broker时报告了错误,无法解决hostname。 虽然不知道为什么,但是同事告诉我,需要在与kafka客户端对应的yaml文件中添加HostAliases字段,然后重新部署kafka客户端所在的pod。 然后就可以访问了。 所以我不知道,我查了一下主机别名的使用,没有什么特别的地方。 而且,即使调查了监听器的使用也没有说可以携带域名等。 最后调查了kafka客户端的请求流程,知道了是什么意思。 (笔者刚接触kafka不久,但光看文档并不知道客户端的请求流程和步骤,所以犹豫了这么久--- () ) ) kafka中介配置与kafka监听器无关

首先,让我们看一下有关kafka broker监听器配置项的官方文档。

名称说明类型默认值有效值有效值重要性监听器列表URI列表和监听器名称之间用逗号分隔。 如果监听程序名称不是安全协议,则还必须设置listener.security.protocol.map。 指定要绑定到所有接口的主机名为0.0.0.0。 如果保留为空,则会绑定到默认接口。 合法监听程序列表示例: PLAINTEXT://myhost:9092,SSL://:9091client://0.0.0.0:9092,复制://localhossion 如果未设置,则使用监听器配置。 与监听器不同,配置0.0.0.0元地址无效。 stringnull高listener.security.protocol.map侦听器名称与安全协议之间的映射。 必须定义相同的安全协议以供多个端口或IP使用。 例如,即使两者都需要ssl,也可以将内部流量和外部流量分开。 具体来说,用户可以定义名为INTERNAL和EXTERNAL的监听程序。 此属性为internal:ssl,external:ssl。 如图所示,键和值由冒号分隔,贴图条目由逗号分隔。 侦听器名称在映射表中只显示一次。 通过在配置名称中添加规范化前缀(监听程序名称的小写字母),可以为每个监听程序配置不同的安全性(ssl和sasl )设置。 例如,如果为内部侦听器设置不同的密钥库,则会设置名为listener.name.internal.SSL.keystore.location的配置。 如果没有监听程序名称设置,则设置将回滚到常规设置,即ssl.keystore.location。 stringPLAINTEXT:PLAINTEXT,SSL:SSL,sasl _ plaintext : sasl _ plaintext,SASL_SSL:SASL_SSL低inter.brasl 同时设置此项目和security.inter.broker.protocol属性是错误的。 请只设定一个。 stringnull的security.inter.broker.protocol broker之间的安全通信协议。 有效值包括PLAINTEXT、SSL、SASL_PLAINTEXT和SASL_SSL。 同时设置此配置和inter.broker.listener.name属性会导致stringPLAINTEXT的简要说明错误

监听器设定。 简单来说,就是在kafka上设置监听程序,外部连接者通过什么协议、什么地址、什么端口,名为kafkabrokeradvertised _ listeners 3360的监听程序通过中介程序发布在与advertiseer 172.17.2.9092建立请求连接时,kafka broker会通过zk找到注册的INSIDE侦听器,并通过监听器找到相应的ip和端口。 172.17.2.9092在与公共网络ip:端口建立请求连接时,Kafka中介会找到通过zk注册的OUTSIDE侦听器。 然后,在监听器上找到对应的ip和端口。 更多关于172.17.2.9094监听器。 kafkalistenerslisteners 3360 inside ://172.17.2.00 outside ://172.17.2.3:9094 advertised _ listed 172.17.2.9092 outside ://公共网络ip:端口listener _ security _ protocol _ map : ' inside : sasl:

oker_listener_name: "INSIDE"

DNS介绍

域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送

hostname hostname即主机名字 , 每一个主机都会对应一个hostname, 在特定的网络范围内唯一每一个主机都会对应一个IP地址,在特定的网络范围内唯一域名及域名解析 域名是因特网范围内某一个服务器的名字,是用来解决IP地址不可读不好记的问题,例如百度的域名为 :baidu.com , 这个域名在响应的DNS服务中有对应的ip,当我们访问这个域名的时候会在先进行域名解析得到ip后在进行tcp/ip建立连接,具体的域名解析过程原理在此不赘述。专门用来进行域名解析的成为DNS服务器,DNS服务器根据范围不同分为互联网DNS服务器,局域网DNS服务器,当然对于每个主机而言在/etc/hosts配置ip地址和主机hostname的映射也可称为一个DNS服务器。kafka中使用hostname(这是本篇文章的重点)

如上文所描述,kafka broker配置项listeners的作用和使用,listeners的地址配置不一定是ip, 也可以是hsotname:

listeners: INSIDE://my-hostname:9092,OUTSIDE://my-hostname:9094advertised_listeners: INSIDE://my-hostname:9092,OUTSIDE://<my-out-hostname>:端口listener_security_protocol_map: "INSIDE:SASL_PLAINTEXT,OUTSIDE:SASL_PLAINTEXT"inter_broker_listener_name: "INSIDE"

如上所示,当advertised-listeners配置的地址为hostname的时候,外部客户端请求连接的时候是怎样的流程呢?
此时,我们如果直接访问ip进行请求连接是无法获取kafka broker中的数据的;当在主机的/etc/hosts文件中添加该hostname所映射的ip之后便可以请求kafka broker中的数据。

解释

执行命令 kafka-topics --list --bootstrap-server ip:端口, kafka客户端会向broker请求kafka broker的所有元数据。 --bootstrap.servers实际上是引导地址,而不是客户端真正建立长链接的地址。也就是说,客户端会根据引导地址去broker询问集群的所有broker信息,拿到返回的broker服务信息之后,再向指定的broker发起链接请求。此时由于kafka borker的advertised_listeners配置的是hostname,那么返回给客户端的元信息中的地址也是hostname,当客户端准备根据这个hostname建立长连接请求数据的时候,发现并解析不了该hostname。 于是当在主机etc/hosts文件中添加该hostname的ip映射之后便会根据域名解析找到ip建立连接。–bootstrap.servers是指向kafka broker的,如果使用–zookeeper便是向zk请求kafka broker的元数据了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。