问题背景

  • 前段时间,遇到一个kafka集群部署在k8s中,而kafka客户端在另一个k8s集群的pod的容器中,kafka集群中配置的advertised_listeners便是hostname。然而当时我只知道kafka集群的ip地址,当在客户端直接使用ip操作broker的时候便报错无法解析一个hostname。
  • 当时不知道什么原因,只听同事说需要在kafka客户端对应的yaml文件中添加HostAliases字段然后重新部署kafka客户端所在的pod。 然后便可以访问了。
  • 不明所以然的我,查了一下hostAliases的使用发现没什么特别之处。然后查了listeners的使用也没有说是可以携带域名之类的
  • 最后查了一下kafka客户端的请求过程才明白是怎么回事(笔者接触kafka不久只是阅读过文档并没有了解到其客户端的请求过程和步骤,所以迷惑了这么久 - _ -)

kafka broker配置介绍

kafka listeners及其相关配置项的作用

先来看一下官方文档对kafka broker中有关listeners配置项的介绍:

名称 描述 类型 默认值 有效值 重要性
listeners 监听器列表 - 使用逗号分隔URI列表和监听器名称。如果侦听器名称不是安全协议,则还必须设置listener.security.protocol.map。指定主机名为0.0.0.0来绑定到所有接口。留空则绑定到默认接口上。合法监听器列表的示例:PLAINTEXT:// myhost:9092,SSL://:9091 CLIENT://0.0.0.0:9092,REPLICATION:// localhost:9093 string null
advertised.listeners 监听器发布到ZooKeeper供客户端使用,如果与listeners配置不同。在IaaS环境,这可能需要与broker绑定不通的接口。如果没有设置,将使用listeners的配置。与listeners不同的是,配置0.0.0.0元地址是无效的。 string null
listener.security.protocol.map 侦听器名称和安全协议之间的映射。必须定义为相同的安全协议可用于多个端口或IP。例如,即使两者都需要ssl,内部和外部流量也可以分开。具体的说,用户可以定义名字为INTERNAL和EXTERNAL的侦听器,这个属性为:internal:ssl,external:ssl。 如图所示,键和值由冒号分隔,映射条目以逗号分隔。 每个监听者名字只能在映射表上出现一次。 通过向配置名称添加规范化前缀(侦听器名称小写),可以为每个侦听器配置不同的安全性(ssl和sasl)设置。 例如,为内部监听器设置不同的密钥仓库,将会设置名称为“listener.name.internal.ssl.keystore.location”的配置。 如果没有设置侦听器名称的配置,配置将回退到通用配置(即ssl.keystore.location)。 string PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
inter.broker.listener.name broker间通讯的监听器名称。如果未设置,则侦听器名称由security.inter.broker.protocol定义。 同时设置此项和security.inter.broker.protocol属性是错误的,只设置一个。 string null
security.inter.broker.protocol broker之间的安全通讯协议,有效值有:PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL。同时设置此配置和inter.broker.listener.name属性会出错 string PLAINTEXT

简单解释

  • listeners : 监听器配置,通俗的说就是给kafka配置一个监听器,告诉外部连接者需要通过什么样的协议、什么样的地址、什么样的端口进行连接kafka broker
  • advertised_listeners: 这组监听器是 Broker 用于对外发布的,advertised_listeners 监听器会注册在 zookeeper 中。
    • 当我们对172.17.2.3:9092建立请求连接的时候,kafka broker会通过zk找到注册的INSIDE监听器,然后通过listeners找到对应的ip和端口 : 172.17.2.3:9092
    • 当我们对<公网 ip>:端口建立请求连接的时候,kafka broker会通过zk找到注册的OUTSIDE监听器,然后通过listeners找到对应的ip和端口: 172.17.2.3:9094
    • 更多关于listeners介绍:Kafka Listeners
listeners: INSIDE://172.17.2.3:9092,OUTSIDE://172.17.2.3:9094
advertised_listeners: INSIDE://172.17.2.3:9092,OUTSIDE://<公网 ip>:端口listener_security_protocol_map: "INSIDE:SASL_PLAINTEXT,OUTSIDE:SASL_PLAINTEXT"
inter_broker_listener_name: "INSIDE"
  • 1
  • 2
  • 3

DNS介绍

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

hostname

域名及域名解析

kafka中使用hostname(这是本篇文章的重点)

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

listeners: INSIDE://my-hostname:9092,OUTSIDE://my-hostname:9094
advertised_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的元数据了。

转载于 为什么kafka客户端需要配置 /etc/hosts文件__txg的博客-CSDN博客

  • host.name
    已弃用。 仅当listeners属性未配置时被使用,已用listeners属性代替。表示broker的hostnamejava

  • advertised.host.name
    已弃用。仅当advertised.listeners或者listeners属性未配置时被使用。官网建议使用advertised.listeners。该配置的意思是这册到zookeeper上的broker的hostname或ip。是提供给客户端与kafka通讯使用的。若是没有设置则使用host.nameweb

  • listeners
    须要监听的URL和协议,如:PLAINTEXT://myhost:9092,SSL://:9091 CLIENT://0.0.0.0:9092,REPLICATION://localhost:9093。若是未指定该配置,则使用java.net.InetAddress.getCanonicalHostName()函数的的返回值bootstrap

  • advertised.listeners
    注册到zookeeper上并提供给客户端的监听器,若是没有配置则使用listeners。若是listeners也没有配置则使用java.net.InetAddress.getCanonicalHostName()函数的的返回值ruby

从上诉配置咱们很清楚的了解了该如何配置hostname,可是咱们如何把外网ip注册到zookeeper呢,答案是不可能的,由于内网是不识别外网ip的。服务器

网上一些道友的解决方法以下:svg

<span style="background-color:#f8f8ff"><span style="color:#000000">advertised<span style="color:#999999"><strong>.listeners</strong></span>=PLAINTEXT<span style="color:#990073">://</span><span style="color:#0086b3"><span style="color:#990073">x</span></span><span style="color:#999999"><strong>.x</strong></span><span style="color:#999999"><strong>.x</strong></span><span style="color:#999999"><strong>.<span style="color:#990073">x</span></strong></span><span style="color:#990073">:</span><span style="color:#40a070"><span style="color:#40a070">9092</span></span></span></span>

x.x.x.x为外网ip。
想法很丰满,直接把外网ip注册给zookeeper,这样客户端就能够识别到外网ip进行访问了。但现实很骨感,内网是不识别外网ip的,这样把外网ip配置进去,不报错才怪。函数

解决方案

一、修改server.properties配置文件ui

<span style="background-color:#f8f8ff"><span style="color:#000000">advertised.listeners=PLAINTEXT<span style="color:#990073"><span style="color:#990073">://kafka1</span></span><span style="color:#990073"><span style="color:#990073">:</span></span><span style="color:#40a070"><span style="color:#40a070">9092</span></span></span></span>

二、修改aws上broker的/etc/hosts文件

<span style="background-color:#f8f8ff"><span style="color:#000000">[内网ip]    <span style="color:#000080"><span style="color:#000080">kafka1</span></span></span></span>

三、修改外网访问服务器上的/etc/hosts文件

<span style="background-color:#f8f8ff"><span style="color:#000000">[外网ip]    <span style="color:#000080"><span style="color:#000080">kafka1</span></span></span></span>

这样外部生产/消费的时候只要指定kafka1,就能够进行访问了。

<span style="background-color:#f8f8ff"><span style="color:#000000">props<span style="color:#999999"><strong>.put</strong></span>(<span style="color:#219161"><span style="color:#219161">"bootstrap.servers"</span></span>, <span style="color:#219161"><span style="color:#219161">"kafka1:9092"</span></span>)<span style="color:#408080"><em>;</em></span></span></span>

为什么kafka客户端需要配置 /etc/hosts文件相关推荐

  1. 本地域名配置:hosts文件的位置和作用

    我的系统盘是C盘,位置在 C:\Windows\System32\drivers\etc 这里面,有五个文件(个别操作系统没有hosts文件,可能你的操作系统是盗版的,别介,我原先也没有,好办,把se ...

  2. 怎样配置修改hosts文件(学习篇)

    解决办法 1.点击此电脑 2.点击c盘 3.点击windows 4.点击System32 5.点击drives 6.点击etc 7.点击hosts,使用记事本打开 8.在下面进行修改配置

  3. System学习笔记004---Windows系统中hosts文件的作用_Zookeeper在SpringBoot中报错需要配置一下这个文件

    JAVA技术交流QQ群:170933152 1.Zookeeper在SpringBoot中报错需要配置一下这个文件 2018-07-25 20:01:39.563  INFO 187364 --- [ ...

  4. Windows10配置hosts文件后被莫名还原

    最近由于在外驻场支持项目上线,配置了几条域名映射记录,但是第二天重启电脑后,发现配置的hosts文件莫名其妙地被还原到之前的版本了,连修改日期都变成之前的. 在网上查找资料,说用notepad++编辑 ...

  5. 关于IP地址与主机名映射的/etc/hosts文件配置

    为什么要这样做? 首先,在hadoop工作就像是一个社团帮派,master是老大,而slave1.slave2等就是master的小弟.但是,slave并没有像我们那么聪明一眼就能分辨出自己的老大,它 ...

  6. 简单配置hosts文件

    我们在使用网络的时候或许遇到过这样一些情况:安装完的软件会时不时跳出一个广告框,很烦人:在局域网中IP地址可以ping通,但是却访问不了另一台机器的http服务:又或者以ip地址访问网络非常不方便,我 ...

  7. 系统hosts文件配置

    系统hosts文件的作用 hots文件是对IP地址和Host name(主机名)的映射关系维护,它规定要求每段只能包括一个映射关系,格式是:IP地址 + 空格 + 映射的Host name(主机名)[ ...

  8. hosts文件详解--localhost和127.0.0.1

    localhost是一个域名,127.0.0.1为IP地址.Windows系统中,约定127.0.0.1为本地IP地址.localhost是其对应的域名.配置是在hosts文件中设置的,Windows ...

  9. 浅谈hosts文件的作用

    最近学习了Nginx,做一些必要的笔记,一来是对自己学习的知识的巩固,二来对有同样问题的人有参考作用 文章目录 一 http请求过程 二 hosts文件定义 三 hosts文件作用 四 hosts文件 ...

  10. 修改C:\WINDOWS\system32\drivers\etc\hosts 文件有什么作用

    host是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会 ...

最新文章

  1. pgsql 筛选中文字符正则_「每日一练」巧用Python对字符串进行筛选
  2. 在Java中使用Protocol Buffers
  3. bzoj 1753: [Usaco2005 qua]Who's in the Middle【排序】
  4. 《实现领域驱动设计》读书笔记
  5. RabbitMQ延迟消息的极限是多少?
  6. 航空机票预订c#代码_航空公司座位预订问题的C ++程序
  7. runtime—新手必学
  8. TensorFlow中multiply和matmul的区别
  9. leetcode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
  10. 信息系统项目管理师 - 项目沟通管理
  11. Android版微信跳一跳小游戏如何利用技术手段达到高分!
  12. PyCharm 下载/上传gitlab 代码
  13. day03_20170514_字符编码/文件存储/函数(一)
  14. mt7697芯片hdk资料mt7697芯片教程资料
  15. 人与人之间的交往艺术
  16. 外设驱动调试经验汇总--每天加一点
  17. DC/DC转换器设计中接地线的布线技巧
  18. 杰理之独立音量控制【篇】
  19. konka电视怎么修改服务器,康佳网络电视如何升级 简单五步就搞定
  20. IPD核心思想和框架

热门文章

  1. 产品运营 第一章(黄有璨)
  2. 地磅称重软件与ERP系统的实现
  3. 李沐动手学深度学习v2/总结3
  4. 我只会SQL,到底能不能找到工作?
  5. 【已解决】Mac每次重启,谷歌Chrome都会丢失所有的扩展程序/extensions/插件
  6. 新浪短网址生成java_新浪短网址(T.cn)/腾讯短链接(Url.cn)在线生成以及API接口申请的教程...
  7. oracle中的rownumber,oracle中row_number和rownum的区别和联系(翻译)
  8. tableau数据汇总/明细/分-总的行列展示— Lee桑的学习笔记
  9. android融云客服功能,客服开发指南 - 融云 RongCloud
  10. 2018-ECCV-Beyond Part Models:Person Retrieval with Refined Part Pooling论文笔记