您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

Kafka如何进行内外网分流(超详细建议收藏)

时间:2022-04-14 17:27:52  来源:  作者:石臻臻的杂货铺
  • 参数详解listenersadvertised.listenerslistener.security.protocol.mapinter.broker.listener.namesecurity.inter.broker.protocolcontrol.plane.listener.name示例说明
  • 几种场景的配置方式1. 一台机器部署一套集群2. 内网环境多机器部署集群3. 内网和外网分流3. 内网和外网和Controller分流

Kafka运维管控平台LogiKM ✏️更强大的管控能力✏️ 更高效的问题定位能力 更便捷的集群运维能力 更专业的资源治理 更友好的运维生态

1参数详解

listeners

侦听器列表,这里配置的监听器底层调用的是


ServerSocketAdaptor.bind(SocketAddress local)

那么这个说明什么意思呢?说明你配置的监听器将被用于监听网络请求。 简单理解就是你建立监听一个通道,别人能够通过这个通道跟你沟通。 所以我们需要设置 IP:Port.

这个属性的格式为:

 listeners = listener_name://host_name:port,listener_name2://host_nam2e:port2
  1. 可以同时配置多个, 并且用逗号隔开
  2. 监听器的名称和端口必须是唯一的,端口相同,就冲突了
  3. host_name如果为空,例如(listeners = ://host_name:port),则会绑定到默认的接口(网卡),一般情况下是localhost,底层调用的是JAVA.NET.InetAddress.getCanonicalHostName()
  4. 将host_name设置为0.0.0.0 则会绑定所有的网卡, 也就是说不管从哪个网卡进入的请求都会被接受处理。但是请注意,假如你设置的是0.0.0.0,那么advertised.listeners 必须要设置,因为advertised.listeners默认请看下使用的是listeners的配置发布到zk中,发布到zk中是给其他Brokers/Clients 来跟你通信的,你设置0.0.0.0,谁知道要请求哪个IP呢, 所以它必须要指定并明确 IP:PORT。具体详情请看下面 示例3
  5. listener_name 是监听名,唯一值, 他并不是安全协议(大部分人都会搞错),因为默认的4个安全协议已经做好了映射, 例如 :PLAINTEXT ==> PLAINTEXT . 所以你经常看到的配置## 这个PLAINTEXT是监听名称,刚好他对应的安全协议就是 PLAINTEXT
    ## 当然这个是可以自定义的, 详细情况 后面的配置listener.security.protocol.map
    listeners = PLAINTEXT://your.host.name:9092
  6. 可动态配置该属性

advertised.listeners

发布公开的监听器, 啥叫发布公开的监听器? 就是,让Brokers和Clients们都能够知道的监听器,你想想看,listeners是Broker用来监听网络请求的

那么,其他Broker或者客户端想要与它通信,则需要知道具体的IP:PORT吧? 所以,为了让别人知道自己的监听器,那么就需要公开出去,当然这个公开的形式,是通过zk来共享数据。

看看broker到zk节点/brokers/{brokerid}/ 下面的信息示例

{
 "features": {},
 "listener_security_protocol_map": {
  "PLAINTEXT": "PLAINTEXT"
 },
 "endpoints": ["PLAINTEXT://localhost:9092"],
 "jmx_port": -1,
 "port": 9092,
 "host": "localhost",
 "version": 5,
 "timestamp": "1647337490945"
}

其中endpoints就是我们发布出去的监听器。 这个属性的格式为:


advertised.listeners = listener_name://host_name:port,listener_name2://host_nam2e:port2

  1. 默认情况下,advertised.listeners不设置会自动使用listeners属性
  2. advertised.listeners不支持0.0.0.0这种形式, 所以如果listeners属性设置成0.0.0.0,则必须设置advertised.listeners属性。具体请看 示例3 因为0.0.0.0是表示的是监听Broker上任意的网卡的, 你将这个发布出去,那么别的Broker和客户端怎么知道你具体的ip和端口呢?
  3. 可以同时配置多个, 并且用逗号隔开
  4. 可动态配置该属性

listener.security.protocol.map

监听器名称和安全协议之间的映射关系集合。

listeners=PLAINTEXT://localhost:9092

看看上面的配置, PLANINTEXT是监听器名称,那么它对应的安全协议是什么呢? 它对应的安全协议是 PLANINTEXT, 为什么呢? 那是因为默认情况下,已经有了他们的映射关系。

默认集合:
PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL

属性格式:

监听名称1:安全协议1,监听名称2:安全协议2

现有的安全协议,有4种, 分别如下, 下为默认监听器名称映射对应的安全协议情况。

  1. PLAINTEXT => PLAINTEXT 不需要授权,非加密通道
  2. SSL => SSL 使用SSL加密通道
  3. SASL_PLAINTEXT => SASL_PLAINTEXT 使用SASL认证非加密通道
  4. SASL_SSL => SASL_SSL 使用SASL认证并且SSL加密通道

当然你也可以自己重新映射监听器名称和安全协议, 比如: 示例4

inter.broker.listener.name

用于Broker之间通信的listener的名称。如果未设置,则listener名称由 security.inter.broker.protocol定义(security.inter.broker.protocol默认值是PLAINTEXT)。

同时设置 这个和 security.inter.broker.protocol 属性是错误的。

默认值:空

不可动态配置。

特别注意:这个属性表示是Broker之间的网络通信使用的监听器, 比如 Broker2Broker 但是还有一种就是Controller2Broker、如果没有配置control.plane.listener.name ,那么走的也是inter.broker.listener.name 这个监听器。

根据本地配置的监听器名称, 去查找其他Broker的监听器的EndPoint。所以一般所有Broker的监听器名称都必须一致,否则的话就找不到具体的EndPoint,无法正确的发起请求。

security.inter.broker.protocol

用于在代理之间进行通信的安全协议。

有效值为:PLAINTEXTSSLSASL_PLAINTEXTSASL_SSL

同时设置 该属性和 inter.broker.listener.name 属性是错误的。

默认值:PLAINTEXT (纯文本)

注意这个跟inter.broker.listener.name是有区别的, 这个配置只有四个选项,是安全协议 而inter.broker.listener.name是监听名称, 是需要通过这个监听名称去找到它映射的 安全协议 还有 IP:PORT

如果inter.broker.listener.name没有配置,则默认使用security.inter.broker.protocol的配置. 对inter.broker.listener.name而言,最终还是要去找到对应的 IP:PORT

一般自定义了监听器名称, inter.broker.listener.name就是必须要设置的, 不能使用security.inter.broker.protocol 来代替。

control.plane.listener.name

用于Controller和Broker之间通信的监听器名称, Broker将会使用control.plane.listener.name 来定位监听器列表中的EndPoint

如果未设置,则默认使用inter.broker.listener.name来通信,没有专门的链接。

详情请看:Kafka的客户端NetworkClient如何发起的请求

示例说明

1 . 绑定一个IP, 客户端使用另外的IP访问

让broker 监听localhost:9092. 然后客户端访问broker的具体IP.

listeners=PLAINTEXT://localhost:9092

启动之后查看一下监听情况

linux命令: netstat -anp |grep 9092 mac环境命令:netstat -AaLlnW

Kafka如何进行内外网分流(超详细建议收藏)

 

在这里插入图片描述

当然,如果你这台机器刚好还是Controller的话,除了了LISTEN, 还能看到ESTABLISHED状态的连接,因为Controller也会给这台Broker建立连接发起请求的,比如通知Broker更新元信息之类的。

Kafka如何进行内外网分流(超详细建议收藏)

 

在这里插入图片描述

我们使用生产者客户端来生产几条消息

sh bin/kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092  --topic Topic4
## 或者
sh bin/kafka-console-producer.sh --bootstrap-server localhost:9092  --topic Topic4

Kafka如何进行内外网分流(超详细建议收藏)

 


Kafka如何进行内外网分流(超详细建议收藏)

 

可以发现正常发送消息。

那么接下来,使用使用具体IP发起请求


sh bin/kafka-console-producer.sh --bootstrap-server 10.xxx.xx.128:9092  --topic Topic4

Kafka如何进行内外网分流(超详细建议收藏)

 

在这里插入图片描述

[2022-03-16 12:59:07,024] WARN [Controller id=1000, targetBrokerId=1000] Connection to node 1000 

(/10.xxx.xxx.xx:9092) could not be established. Broker may not be available. (org.Apache.kafka.clients.NetworkClient)

可以看到,客户端提示说不能跟这个ip:port建立连接。

2. listeners 和 advertised.listeners 配置的IP不一样


listeners=PLAINTEXT://xx.xx.xxx.01:9092

advertised.listeners=PLAINTEXT:/xx.xx.xxx.02:9092

假设你本地监听和发布的监听不一样, 那么就会造成其他broker和客户端跟这台broker不能正确的建立链接。

如果你这台Broker刚好还是Controller,那么他也会对自己建立连接, 都是根据advertised.listeners的配置来建立的,同样会失败。其他broker也一样。


[2022-03-16 12:59:07,024] WARN [Controller id=1000, targetBrokerId=1000] Connection to node 1000 

(/10.xxx.xxx.xx:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

3 . listeners监听任意可用IP, advertised.listeners发布指定IP

在示例2中,我们指定 listeners 监听器和advertised.listeners发布的监听器不一致会导致异常。 那么,我们只需要将监听器的和发布的监听器一致就行了

当然,我们还可直接设置监听器监听任意可用IP(该Broker上的可用IP)

listeners=PLAINTEXT://0.0.0.0:9092

当然,如果只是将host设置为 0.0.0.0. 那么会报错

java.lang.IllegalArgumentException: requirement failed: advertised.listeners cannot use the nonroutable meta-address 0.0.0.0. Use a routable IP address.
 at kafka.server.KafkaConfig.validateValues(KafkaConfig.scala:1789)

因为默认情况下,advertised.listeners不设置的话,则默认使用listeners的属性,然而advertised.listeners是不支持0.0.0.0的,所以需要指定暴露的监听器,如下

listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://xx.xx.xx.128:9092

这样子配置就不会报错了,其他Broker和客户端会通过advertised.listeners发布的监听器来跟该Broker建立链接。

注意: 这个时候你还可以在这台Broker的机器上使用 localhost 来进行访问。比如:


 sh bin/kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092  --topic Topic4
 
Kafka如何进行内外网分流(超详细建议收藏)

 

在这里插入图片描述

可以看到也是可以正常发送消息的。

4 . listeners配置多个监听器,内外网分流


listeners = INSIDE://内网IP:9091,OUTSIDE://外网IP:9092

#把OUTSIDE 的安全协议映射成PLAINTEXT INSIDE也映射成PLAINTEXT
listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT

# Broker之间的连接用 INSIDE 监听器
inter.broker.listener.name=INSIDE

设置了2个监听器 ①. INSIDE 监听内网IP ②. OUTSIDE 监听外网IP

因为这个是我们自己定义的监听名称,listener.security.protocol.map默认映射中并没有对应的映射关系 所以我们就需要主动设置这个映射关系 listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:SSL

不然会抛异常

Caused by: java.lang.IllegalArgumentException: No security protocol defined for listener INSIDE

 at kafka.cluster.EndPoint$.$anonfun$createEndPoint$2(EndPoint.scala:48)

注意:自定义了监听器,则必须要配置inter.broker.listener.name

确定好内部的broker之间通信的监听器. 并确保能够正常访问。

这样Broker直接就会通过内网互相连接, 客户端除了可以通过内网连接(如果在内网环境的话),也可以通过外网连接。

2几种场景的配置方式

1. 一台机器部署一套集群

这种场景一般是自己开发测试的时候, 比如自己搭建一个集群,学习学习,但是又没有那么多机器,那么就可以在一台电脑上部署多个Broker。

只配置listeners属性


listeners = 监听名称://your.host.name:port

关于监听名称,默认的映射关系有4种。

  1. PLAINTEXT => PLAINTEXT 不需要授权,非加密通道
  2. SSL => SSL 使用SSL加密通道
  3. SASL_PLAINTEXT => SASL_PLAINTEXT 使用SASL认证非加密通道
  4. SASL_SSL => SASL_SSL 使用SASL认证并且SSL加密通道

简单一点,用PLAINTEXT就够了, 这里我们可以把host给去掉, 或者使用localhost


listeners = PLAINTEXT://:port
或者
listeners = PLAINTEXT://localhost:port

如果没有配置host,会调用java.net.InetAddress.getCanonicalHostName()获取本机host. 默认情况下就是localhost.

这里之所以建议你不填写具体的host,是因为一般自己搭建玩玩的时候可能网络IP会经常变动(例如家里的和公司), 如果绑定了具体的IP的话,每次重启都要更换配置就很麻烦。

可以看看Broker启动后注册到zk中的配置如下

{
 "features": {},
 "listener_security_protocol_map": {
  "PLAINTEXT": "PLAINTEXT"
 },
 "endpoints": ["PLAINTEXT://localhost:9092"],
 "jmx_port": -1,
 "port": 9092,
 "host": "localhost",
 "version": 5,
 "timestamp": "1647337490945"
}

这个endpoints 就是broker注册到zk的访问地址, 如果其他Broker或者客户端要跟这台Broker发生网络请求话, 就是拿的这里面的值。

所以,你想想看,如果是不同机器上,你配置的host是 localhost, 是不是就访问不了?

当然,listeners属性的host,我们也可以自己去hosts文件里面配置别的域名。配置域名指向的具体IP, 这样的话那还能奏效。就是每个Broker和客户端都要配置host,这就比较麻烦,所以还不如直接配置IP呢。

2. 内网环境多机器部署集群

这种是绝大部分的场景, 一般公司部署集群都是在公司内网环境下, Broker之间和Broker与客户端之间都在同一个网络环境。并且安全协议都是直接PLAINTEXT(明文)或者其他


listeners=PLAINTEXT://ip:port

3. 内网和外网分流


listeners=INTERNAL://内网ip:port1,EXTERNAL://外网ip:port2

#把OUTSIDE 的安全协议映射成PLAINTEXT INSIDE也映射成PLAINTEXT
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT

# Broker之间的连接用 INSIDE 监听器
inter.broker.listener.name=INTERNAL

配置了两个监听器,每个Brokerinter.broker.listener.name=INTERNAL 使用内网交流。

其他的客户端例如Producer和Consumer 请求的时候直接访问外网IP.

3. 内网和外网和Controller分流


listeners=INTERNAL://内网ip:port1,EXTERNAL://外网ip:port2,CONTROLLER://内网ip:port3,

#把OUTSIDE 的安全协议映射成PLAINTEXT INSIDE也映射成PLAINTEXT
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT

# Broker之间的连接用 INSIDE 监听器
inter.broker.listener.name=INTERNAL
control.plane.listener.name=CONTROLLER

这样配置

  1. Controller2Broker或者Broker2Controller
  2. Broker2Broker
  3. Clients2Broker

他们都会会有独立的网络通信线程



Tags:Kafka   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  Search: Kafka  点击:(93)  评论:(0)  加入收藏
如何使用Python、Apache Kafka和云平台构建健壮的实时数据管道
译者 | 李睿审校 | 重楼在当今竞争激烈的市场环境中,为了生存和发展,企业必须能够实时收集、处理和响应数据。无论是检测欺诈、个性化用户体验还是监控系统,现在都需要接近即时...【详细内容】
2024-01-26  Search: Kafka  点击:(49)  评论:(0)  加入收藏
深入浅出Kafka:高可用、顺序消费及幂等性
在我们旅行于数据海洋的途中,如果把 Kafka 比作是一艘承载无数信息航行的快船,前文《Kafka实战漫谈:大数据领域的不败王者》已经讲述了如何搭建起这艘快船,让它在起风的早晨开始...【详细内容】
2023-12-18  Search: Kafka  点击:(179)  评论:(0)  加入收藏
7k Star,一款开源的 Kafka 管理平台,功能齐全、页面美观!
Apache Kafka UI 是一个免费的开源 Web UI,用于监控和管理 Apache Kafka 集群,可方便地查看 Kafka Brokers、Topics、消息、Consumer 等情况,支持多集群管理、性能监控、访问控...【详细内容】
2023-12-15  Search: Kafka  点击:(137)  评论:(0)  加入收藏
利用Apache Kafka、Flink和Druid构建实时数据架构
译者 | 陈峻审校 | 重楼如今,对于使用批处理工作流程的数据团队而言,要满足业务的实时要求并非易事。从数据的交付、处理到分析,整个批处理工作流往往需要大量的等待,其中包括:等...【详细内容】
2023-12-11  Search: Kafka  点击:(241)  评论:(0)  加入收藏
运维兄弟!Kafka怎么又"超时"了?
现象凌晨,当运维刚躺下,就被业务研发的电话叫醒,"哥们!kafka服务又异常了?影响到业务了,快看看",业务研发给出的异常日志如下:基本分析 集群检查:立即确认kafka集群以及涉及到topic健...【详细内容】
2023-12-07  Search: Kafka  点击:(142)  评论:(0)  加入收藏
图解Kafka适用场景,全网最全!
消息系统消息系统被用于各种场景,如解耦数据生产者,缓存未处理的消息。Kafka 可作为传统的消息系统的替代者,与传统消息系统相比,kafka有更好的吞吐量、更好的可用性,这有利于处...【详细内容】
2023-11-29  Search: Kafka  点击:(184)  评论:(0)  加入收藏
Kafka有哪些应用场景?你能说上来几个?
下面我们来总结一下Kafka的一些应用场景:1、日志处理与分析(最常用的场景)下图显示了典型的 ELK(Elastic-Logstash-Kibana)堆栈。Kafka 有效地从每个实例收集日志流。ElasticSe...【详细内容】
2023-11-28  Search: Kafka  点击:(166)  评论:(0)  加入收藏
Kafka:解锁大数据时代的搜索与分析
在当今大数据时代,数据湖作为一种新兴的数据存储和分析解决方案,正受到越来越多企业的青睐。而作为一种高性能、可扩展的事件流平台,Kafka在数据湖领域发挥着重要的作用。本文...【详细内容】
2023-11-24  Search: Kafka  点击:(294)  评论:(0)  加入收藏
解密Kafka主题的分区策略:提升实时数据处理的关键
Kafka几乎是当今时代背景下数据管道的首选,无论你是做后端开发、还是大数据开发,对它可能都不陌生。开源软件Kafka的应用越来越广泛。面对Kafka的普及和学习热潮,哪吒想分享一...【详细内容】
2023-11-21  Search: Kafka  点击:(186)  评论:(0)  加入收藏
▌简易百科推荐
手机就可以修改WiFi密码,进行网络提速,还能防止别人蹭网
随着网络的普及和使用频率的增加,很多人可能遇到了一些网络管理上的问题,比如忘记了WiFi密码、网络速度缓慢、或者发现有不明设备在家中蹭网。相信朋友们也曾遇到过吧?但是,你知...【详细内容】
2024-04-03  老毛桃    Tags:WiFi密码   点击:(9)  评论:(0)  加入收藏
手机WiFi信号满格却接收消息延迟?这里有妙招帮你解决!
在现代社会,手机已经成为了我们生活中不可或缺的一部分。无论是工作、学习还是娱乐,手机都扮演着重要的角色。然而,有时我们会遇到一些令人烦恼的问题,比如明明手机WiFi信号满格...【详细内容】
2024-04-03  蔡前进    Tags:手机WiFi   点击:(8)  评论:(0)  加入收藏
SASE技术应用落地的五个关键趋势
在Gartner 最新发布的《2023网络技术成熟度曲线》报告中认为,SASE技术已经开始走出最初的技术炒作期,将逐步迈向新一轮的实用落地阶段。在Gartner发布的《Hype Cycle for Ente...【详细内容】
2024-04-01    安全牛  Tags:SASE   点击:(12)  评论:(0)  加入收藏
提示“该网站安全证书存在问题,连接可能不安全”如何解决
在你输入网址并浏览网页时,如果你的浏览器弹出一个警告,提示“网站的安全证书存在问题”,或是显示一个红色的锁标志,这些都是网站不安全的警示。这些提示通常是由HTTPS协议中的S...【详细内容】
2024-03-18  倏然间    Tags:网站安全证书   点击:(10)  评论:(0)  加入收藏
如何有效排除CAN总线错误
控制器局域网(CAN)控制器局域网(CAN)是现代车辆中电子元件无缝运行的基础。在远程信息处理领域,CAN总线系统的效率至关重要,其能够实现支撑当今汽车技术的复杂功能。然而,CAN总...【详细内容】
2024-02-20    千家网  Tags:CAN   点击:(52)  评论:(0)  加入收藏
网络连接受限或无连接怎么办?这里提供几个修复办法
可能错误提示 连接受限或无连接:连接具有有限的连接或无连接。你可能无法访问Internet或某些网络资源。 连接受限。排除和解决“连接受限或无连接”错误此错误可能由计算机上...【详细内容】
2024-02-06  驾驭信息纵横科技    Tags:网络连接受限   点击:(50)  评论:(0)  加入收藏
如何将Mac连接到以太网?这里有详细步骤
在Wi-Fi成为最流行、最简单的互联网连接方式之前,每台Mac和电脑都使用以太网电缆连接。这是Mac可用端口的标准功能。如何将Mac连接到以太网如果你的Mac有以太网端口,则需要以...【详细内容】
2024-02-03  驾驭信息纵横科技    Tags:Mac   点击:(67)  评论:(0)  加入收藏
简易百科之什么是端口映射
端口映射,也称为端口转发,是一种网络通信中的技术手段,通过将内网中的一个端口上的数据流量转发到另一个端口,使得外部网络能够访问到内部网络中的特定服务。在实现上,端口映射通...【详细内容】
2024-01-26    简易百科  Tags:端口映射   点击:(163)  评论:(0)  加入收藏
ip因频繁登陆已被禁止访问 无法显示图片 怎么办
首先,我们要明白,部分网站为了有效遏制数据爬取和非法攻击,保证访问速度和普通用户查询,会在系统中增加网络安全设备,加强安全防护机制,并提前设置安全访问规则。因此,一旦用户的行...【详细内容】
2024-01-20  何福意思    Tags:ip   点击:(68)  评论:(0)  加入收藏
电脑连上wifi却上不了网怎么办
当电脑连接上 WiFi 却无法上网时,可能会让人感到困惑和沮丧。这个问题通常会有多种可能的原因,包括网络配置问题、路由器故障、无线适配器问题等。在面对这个问题时,可以尝试以...【详细内容】
2024-01-16  编程资料站    Tags:wifi   点击:(72)  评论:(0)  加入收藏
站内最新
站内热门
站内头条