首页 > 其他分享 >KAFAK 配置内外网分流,实现同时支持内网,外网,其他网络

KAFAK 配置内外网分流,实现同时支持内网,外网,其他网络

时间:2023-09-20 18:23:55浏览次数:47  
标签:ip 9092 kafka 网卡 分流 listeners KAFAK 内外 节点

这里的内网和外网并不必须是是我们通常说的公司内部网络和公网,只要是两块网卡都可以,不管是这两块网卡是公网、内网、甚至是k8s的虚拟网络两个网段的主要目的是实现分流,一个负责节点间通信,一个负责对外收发消息

总结一句话:

listeners 指明 kafka 当前节点监听本机的哪个网卡
advertised.listeners 指明客户端通过哪个 ip 可以访问到当前节点

1. kafka的两个配置listeners和advertised.listeners

1.1 listeners:

kafka监听的网卡的ip,假设你机器上有两张网卡,内网192.168.0.213和外网101.89.163.1
如下配置
listeners=PLAINTEXT://192.168.0.213:9092

那么kafka只监听内网网卡,即只接收内网网卡的数据,如果如下配置:
listeners=PLAINTEXT://101.89.163.1:9092

那么kafka只监听外网网卡,即只接收外网网卡的数据。
当然ip可以配置成0.0.0.0,监听所有网卡。
总结:
listeners 解决的是 kafka 监听来自于哪个网卡的请求。
1.2 advertised.listeners
一般配置成这样:

listeners=PLAINTEXT://192.168.0.213:9092
advertised.listeners=PLAINTEXT://101.89.163.1:9092

配置过 zookeeper 的都知道, zookeeper 的配置文件中写明了所有 zookeeper 节点的 ip 地址,以便启动后节点之间的互相通信。我们观察 kafka 的配置文件 server.properties,会发现里面并没有记录其他 kafka 节点的地址,即各个节点都不知道其他节点的 ip 地址。那么 kafka 集群的各个节点之间是怎么通信的呢?

kafka 节点启动后,会向 zookeeper 注册自己,同时告诉 zookeeper 自身的通信地址,这个地址就是配置文件中的 advertised.listeners,如果没有配置 advertised.listeners,就会使用listeners。同时从 zookeeper 中获取兄弟节点的这个地址,以便与兄弟节点通信。即 kafka 节点是从 zookeeper 获取的其他节点的通信地址。

我们使用客户端以一个 ip 地址首次连接 kafka 节点后,节点返回给客户端的 kafka 集群地址就是从 zookeeper 中获得的这些地址,也就是各个节点配置的 advertised.listeners,包括当前连接的节点。所以可能客户端后续访问当前节点的 ip 地址有可能和首次连接的 ip 地址并不一样。

2. 三种情景,搭配使用这两个配置

2.1. 只需要内网访问kafka

这个很简单,只配置 listeners 并且使用内网 ip

listeners=PLAINTEXT://192.168.0.213:9092

客户端访问 kafka 节点,以及与其他节点通信都用这个 ip 地址。

2.2 需要外网访问

2.2.1 机器有外网网卡

最简单的一个方法,只配置 listeners 并且使用外网 ip

listeners=PLAINTEXT://101.89.163.1:9092

所有请求都走外网网卡,虽然有问题(所有流量走外网),但是能够正常使用。

2.2.2 机器没有外网网卡

如果机器是通过转发或者映射搞出来的外网ip(例如你访问腾讯新闻某个页面使用的 ip,这个 ip 和实际的网卡并不在为你提供首页内容的那台机器上),此时kafka无法监听这个外网ip,启动就会报错。
需要配置一下 advertised.listeners,例如:

listeners=PLAINTEXT://192.168.0.213:9092
advertised.listeners=PLAINTEXT://101.89.163.1:9092

此时 kafka 客户端访问 kafka 集群的一个完整流程是:

客户端访问 101.89.163.1:9092,该请求被发送到 kafka 节点宿主机的内网地址 192.168.0.213:9092 上(也可以是其他 kafka 节点,效果是一样的),第一次请求成功,此次请求申请获得 kafka 集群的所有节点的地址。
kafka 从 zookeeper 拿到自己和其他兄弟节点注册在 zookeeper 的 advertised.listeners,作为 kafka 集群各个节点的的服务 ip 返回给客户端。
客户端拿这些返回的服务 ip 访问kafka集群,该请求从 实际拥有该 ip 的机器被转发到被具体 kafka 节点所在的内网ip,访问到了 kafka 节点,
当然有外网网卡时你也可以配置

listeners=PLAINTEXT://101.89.163.1:9092
advertised.listeners=PLAINTEXT://101.89.163.1:9092

但是这毫无意义。

2.2.3 为什么客户端需要在第一次请求中获取 kafka 各个节点的服务 ip

因为你可以在启动客户端时只配置一个 kafka 节点的地址而不是列出所有节点(这样是不推荐的),但是客户端必须具有访问集群中的每一个节点的能力(收消息、发消息都可能面向所有节点)。
对于 2.2 的情况,如果去掉

advertised.listeners=PLAINTEXT://101.89.163.1:9092

你会发现虽然你在启动 kafka 客户端时配置的访问地址是101.89.163.1:9092,但是 kafka 客户端启动时报错:

Connection to node -1[192.168.0.213:9092] could not be established. Broker may not be available.

为什么明明配置的是101.89.163.1:9092启动时连接的是192.168.0.213?这就是因为不配置advertised.listeners 则使用listeners 代替并注册到zookeeper 中,客户端拿到的 kafka 节点 ip 就是listeners配置的内网 ip 192.168.0.213。

3. 内外网分流

2中两种情况都有一个问题,所有请求包括 kafka 节点之间的通信都走的外网,这既不方便(外网访问的各种权限控制很麻烦),也不经济,更不安全。
这时候就要配置内外网。
配置1(针对没有实际的外网网卡,即2.2的情况):

listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://192.168.0.213:19092
advertised.listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
inter.broker.listener.name=INTERNAL

配置2(针对有实际的外网网卡,即2.1的情况):

listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
advertised.listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
inter.broker.listener.name=INTERNAL

这两配置的区别是只有 listeners 的 EXTERNAL 使用的 ip 不一样,一个使用内网 ip ,一个使用外网 ip 。

对内网 INTERNAL 的配置就不说了,主要用于节点间通信,无论 listeners 还是 advertised.listeners 都配置成内网 ip,自然所有请求都走内网;主要是外网 EXTERNAL 配置:

1)如果机器的外网 ip 是映射来的,listeners 的 EXTERNAL 使用内网ip,客户端拿到的是 advertised.listeners 配置的外网 ip,对于该外网 ip 的请求会被转发到对应的内网 ip,即访问到了对应的 kafka 节点,请求完成闭环。不要问怎么转发的,既然机器被映射了外网 ip,自然能够转发,有问题问网管
2)如果你的kafka宿主机有外网网卡,listeners 的EXTERNAL 使用用外网ip,客户端拿到的是 advertised.listeners 配置的外网 ip,直接就访问到了对应的 kafka 节点。

标签:ip,9092,kafka,网卡,分流,listeners,KAFAK,内外,节点
From: https://www.cnblogs.com/wangcc7/p/17718020.html

相关文章

  • DC电源模块保护内外部电路至关重要
    BOSHIDADC电源模块保护内外部电路至关重要DC电源模块是现代电路设计中经常使用的设备,它能够将交流电转化成为直流电并提供给电路中的各种电子设备使用。在现代电子设备中,大部分都需要稳定可靠的直流电源才能正常工作。然而,如果DC电源模块出现故障,将会对设备和使用者造成不可估量......
  • 一套UWB室内外高精度定位系统源码
    智慧工厂是现代工厂信息化发展的新阶段,基于UWB定位技术,融合位置物联网、GIS可视化等技术,实现对人员、物资精确管理。在重点区域设置电子围栏,无权限人员进入即刻告警;对人员超/缺员、串岗滞留等规范化管理,提升工厂的秩序管理及生产效率。定位能力:支持零维、一维、二维等多种定位方式,......
  • LFU缓存算法(理解容易,主要是代码实现内外双map+双双向链表)
    packagearithmetic;importjava.util.HashMap;publicclassFaceTest82{//LFU缓存置换算法//比较词频,词频相同看时间点//置换之后,词频重新开始累计publicFaceTest82(intk){capacity=k;size=0;records=newHashMap<Integer,FaceTest82.Node>();heads=newH......
  • kafaka
    那不是解耦,是负载均衡和削峰 【chatgpt】Kafka是一种分布式流处理平台,最初由LinkedIn开发并于2011年开源。它被设计为一个高吞吐量、低延迟的分布式消息系统,旨在处理大规模的实时数据。Kafka的主要特点是可扩展性、高性能和持久性。它可以处理数百个服务器节点和数百万个消息......
  • spring boot 结合 kafaka
    SpringBoot可以与ApacheKafka集成:添加Maven依赖:在您的SpringBoot项目的pom.xml文件中添加以下Maven依赖:<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.8.1</......
  • C++ 类和结构体内外的Static
    类和结构体外的Static这里的static指的是在类外的static,意味着你要声明的是static的符号,链接将只在内部。(换句话说作用域只在他所在的.cpp文件)。下面是几组例子来理解:例子1:main.cpp#include<iostream>usingnamespacestd;voidfun(){cout<<"fun()inmain.cpp"......
  • Kafaka启动不起来如何解决
    要检查__consumer_offsets主题的数据目录和存储状态,可以按照以下步骤进行:找到Kafka的配置文件,通常是config/server.properties。在配置文件中找到log.dirs参数,该参数指定了Kafka存储数据的目录列表。例如,log.dirs=/opt/kafka/data。进入log.dirs指定的目录,找到名为......
  • Dify 加入更多国内外优秀模型,轻松调用 Llama2、ChatGLM 等热门开源模型
    Dify的朋友们,不少细心的网友在周末的时候就已经发现了我们产品上的更新--模型供应商上新增了一大批新模型,这也是很多朋友翘首以盼的版本--V0.3.13。此前Dify已经陆续支持了全球前列的模型优秀代表:OpenAI的GPT系列、Anthropic的Claude系列、AzureOpenAI系列。本次更新......
  • 2023.8.16 关于先前函数内外声明变量差异问题的答案
    答案:编译器无法在编译时求得一个非常量的值,它只能在运行时通过读取变量地址来间接得到变量的值,而全局变量在编译时就必须确定其值,故C有静态存储区数据必须用常量初始化的规定。在编译时只能用常量去初始化一个静态存储区的数据,而不能用“读取某个变量的内容”来初始化。来源:外部......
  • 大厂都在用的国内外知名组态软件
    组态软件,又称监控组态软件,译自英文SCADA,即Supervision,ControlandDataAcquisition(数据采集与监视控制),组态软件的应用领域很广,实际上,这些软件也是一种通用级的软件工具,可以通过灵活的配置快速建立工业自动控制系统的监控功能。广泛应用于机械、汽车、石油、化工、造纸、水处理......