您现在的位置是:首页 > 正文

Kafka的监听地址配置

2024-01-30 22:28:22阅读 0

本文就用Kafka 2.8.

有时我们会碰到网络是通畅的,但却连不上Kafka,特别是在多网卡环境或者云环境上很容易出现。这个其实和Kafka的监听配置有关系。本文介绍监听相关的配置。目前监听相关的参数主要有下面几个:

  • listeners
  • advertised.listeners
  • listener.security.protocol.map
  • inter.broker.listener.name
  • security.inter.broker.protocol
  • advertised.host.name (历史遗留,已废弃,勿使用)
  • advertised.port (历史遗留,已废弃,勿使用)
  • host.name (历史遗留,已废弃,勿使用)

其中最重要的就是 listeners 和 advertised.listeners :集群启动时监听listeners配置的地址,并将 advertised.listeners 配置的地址写到Zookeeper里面,作为集群元数据的一部分。我们可以将客户端(生产者/消费者)连接Kafka集群进行操作的过程分成2步:

  1. 通过 listeners 配置的连接信息(ip/host)连接到某个Broker(broker会定期获取并缓存zk中的元数据信息),获取元数据中 advertised.listeners 配置的地址信息。
  2. 通过第1步获取的 advertised.listeners 连接信息和Kafka集群通信(读/写)。

所以在存在内外网隔离的虚拟化环境中(比如Docker、公有云),外部客户端经常会出现可以连接到Kafka(第1步),但发送/消费数据时报连接超时(第2步),就是因为 listeners 配置的是外网地址,而 advertised.listeners 配置的却是内网地址。那这几个参数该如何配置呢?

先看连接信息的配置格式: {listener名字}://{HOST/IP}:{PORT} 。HOST/IP、PORT很清楚,主要是这个“ listener名字 ”字段。要理解这个得了解 listener.security.protocol.map 这个配置项:它的用途是配置listener名字和协议的映射(所以它是一个key-value的map),key是“listener名字”,value是“协议名称”,其默认值是“listener名字”和“协议名称”一样。有点绕,举个例子,比如:PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,冒号前面是key,即协议名字;后面是value,即协议名称。listener名字我们可以随便起,而协议名称则是固定可枚举的一个范围。所以如果我们自定义了listener名字,那就需要显式的设置其对应的协议名。

inter.broker.listener.name 和 security.inter.broker.protocol 都是用于配置Broker之间通信的,前者配置名称(即 listener.security.protocol.map 中的key),后者配置协议(即 listener.security.protocol.map 中的value),默认值是 PLAINTEXT 。这两个配置项同时只能配置一个。

为什么一个连接要搞这么复杂呢?主要是为了各种不同的场景需求。下面举一个复杂一点的应用场景进行说明。比如我们在一个公有云上面部署了一个Kafka集群,该环境有一个外网地址 external_hostname 和一个内网地址 internal_hostname ;且在内部中是无法获取外网地址的(公有云大多都是这样的)。然后想实现内部客户端访问集群时走内部地址,且不需要加密;而外部客户端访问时则走外部地址,且需要加密。要实现这个需求,可以对集群进行如下配置:

listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:SSL
listeners=INTERNAL://0.0.0.0:19092,EXTERNAL://0.0.0.0:9092
advertised.listeners=INTERNAL://{internal_hostname}:19092,EXTERNAL://{external_hostname}:9092
inter.broker.listener.name=INTERNAL

其实更进一步,我们还可以通过可选的control.plane.listener.name参数单独定制集群Controller节点与其他Broker节点的连接,那配置信息就变为:

listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:SSL,CONTROL:SSL
listeners=INTERNAL://0.0.0.0:19092,EXTERNAL://0.0.0.0:9092
advertised.listeners=INTERNAL://{internal_hostname}:19092,EXTERNAL://{external_hostname}:9092,CONTROL://{control_ip}:9094
inter.broker.listener.name=INTERNAL
control.plane.listener.name=CONTROL

最后给出这些配置项的默认值和一些注意事项:

  1. listeners 如果不显式的配置,那会监听所有网卡,相当于配置了0.0.0.0。该配置项里面listeners名字和端口都必须是唯一的,不能重复。
  2. advertised.listeners 如果不配置,默认使用 listeners 配置的值。如果 listeners 也没有显式配置,则使用 java.net.InetAddress.getCanonicalHostName() 获取的IP地址。 如果 listeners 配置的是0.0.0.0,则必须显式的配置 advertised.listeners ,因为这个配置项必须是一个具体的地址,不允许是0.0.0.0(因为客户端无法根据这个地址连接到Broker) 。另外,advertised.listeners 中的端口允许重复。
  3. 对于 listeners 和 advertised.listeners ,有多个地址的时候,每一个地址都必须按照 {listener名字}://{HOST/IP}:{PORT} 格式进行配置,多个地址用英文逗号分隔。
  4. 如果集群所有节点的hostname在客户端和服务端各节点之间可以正确解析,优先使用hostname,而不是IP。因为代码里面使用了 java.net.InetAddress.getCanonicalHostName() ,有时使用IP会出现访问不通的情况。

总结: listeners 地址是用于首次连接的; advertised.listeners 的地址是会写到zk里面,客户端通过listeners地址建立连接获取该地址信息,然后通过该地址和集群交互。所以对于客户端,这2个地址必须都是可以访问的才可以。

网站文章

  • 【大一程序设计基础作业】P266Ex3

    【大一程序设计基础作业】P266Ex3

    遍历则是让这个小机器人通过循环语句顺着一个个结点走下去,在循环语句结束之后,他会停在这一系列结点的后面,此时我们就要把它收回来,让他休息一下,也就是让ptr指向空指针。最值则是先读取头结点中的数据,装...

    2024-01-30 22:28:14
  • LeNet模型——tensorflow实现

    LeNet模型——tensorflow实现

    文章目录MNIST数据集MNIST数据集简介MNIST数据集加载MNIST数据集可视化数据集格式转换tendorflow模型类ModelSequetial卷积类Conv2D池化类AveragePool...

    2024-01-30 22:27:44
  • CCNP-第六篇-OSPF高级版(三)

    CCNP-第六篇-OSPF高级版(三)

    CCNP-第六篇-OSPF高级版(三) 这一节差不多都是密码认证了,还有个NSSA和OE1,OE2 OSPF默认路由 OSPF认证问题 OSPF特殊区域,NSSA,STUB OSPF下发默认路由 其实...

    2024-01-30 22:27:37
  • tornado mysql 操作_tornado 数据库操作

    tornado是python的web框架,web程序开发中数据库操作是必须的。安装:tornado的官方文档中提供的说明比较少,而且提供的模块中未找到数据库方面的模块,难道没有针对数据库操作进行封装?百度查询了一下才发现,tornado在升级过程中把数据库模块独立出来了。模块为torndb模块。模块git地址:https://github.com/bdarnell/torndb 官方文档地址...

    2024-01-30 22:27:29
  • 各种排序算法的时间复杂度和空间复杂度

    各种排序算法的时间复杂度和空间复杂度

    2024-01-30 22:27:20
  • 机器学习入门与Python实战(四):K近邻分类(KNN)

    机器学习入门与Python实战(四):K近邻分类(KNN)

    目录现实问题:“物以类聚,人以群分”一.KNN算法概述二.KNN算法介绍K近邻分类模型算法步骤距离计算方式KNN分类图K值选择三.KNN特点KNN算法的优势和劣势知识巩固Python实战:KNN数据分...

    2024-01-30 22:26:51
  • HTTP1.0 HTTP 1.1 HTTP 2.0主要区别

    HTTP1.0 HTTP 1.1主要区别长连接HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。节约带宽HTTP 1.1支持只发送he...

    2024-01-30 22:26:45
  • Ansible安装与配置(自动化运维管理工具) 热门推荐

    Ansible安装与配置(自动化运维管理工具) 热门推荐

    原文链接:http://blog.csdn.net/xyang81/article/details/51568227Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N...

    2024-01-30 22:26:39
  • 在Vue中封装一个select组件 热门推荐

    在Vue中封装一个select组件 热门推荐

    我们使用iview封装一个select组件 封装的是每一个select下拉框 <template> <div class='select'> <i-select :model.sync='selecteddata' :placeholder='placeholdertext' filterable multiple...

    2024-01-30 22:25:59
  • jsp ajax不返回数据,【100分】ajax在jsp页面接受不到数据解决方法

    当前位置:我的异常网» Java Web开发»【100分】ajax在jsp页面接受不到数据解决方法【100分】ajax在jsp页面接受不到数据解决方法www.myexceptions.net网友分享于:2013-03-20浏览:42次【100分】ajax在jsp页面接受不到数据大家帮我看看是哪的问题啊 ,我刚接触ajax-------jsp页面--------var xmlHttp;f...

    2024-01-30 22:25:53