nginx反向代理kafka集群实现内外网隔离访问 —— 筑梦之路

背景说明

我们在使用Kafka客户端连接到Kafka集群时,即使连接的节点只配置了一个集群的Broker地址,该Broker将返回给客户端集群所有节点的信息列表。然后客户端使用该列表信息(Topic的分区信息)再与集群进行数据交互。这里Kafka列表信息为服务配置文件service.propertiesadvertised.listeners配置项中的信息。例如:

advertised.listeners=PLAINTEXT://192.168.1.1:9092

这样在通信中就存在一个网络连通性问题。如果Kafka位于内网环境,而客户端位于外网环境,即使内外网配置了IP地址映射(网络层面的NAT),由于返回给外网客户端的IP列表是内网地址,客户端和Broker第一次通讯获取集群元数据中包含是advertised.listeners配置中的内网地址信息,由于内外网隔离,就会出现客户端和集群的通信无法通讯的报错。

通常对于这种情况的解决方案是Kafka集群的advertised.listeners配置项使用主机名方式。例如:

advertised.listeners=PLAINTEXT://Kafka.node1:9092

在实际业务场景中,系统架构上确实存在需要使用Nginx的场景,这时候就需要我们在架构设计上要符合Kafka的通讯机制。

kafka集群服务端

1. 配置kafka集群

# kafka1 节点1cat server.properties |grep -v ^# | grep -v ^$
broker.id=0
listeners=INTERNAL://192.168.100.100:9093,EXTERNAL://kafka1:9092
inter.broker.listener.name=INTERNAL
advertised.listeners=INTERNAL://192.168.100.100:9093,EXTERNAL://kafka1:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.100.100:2181,192.168.100.101:2181,192.168.100.102:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0# kafka2 节点2cat server.properties |grep -v ^# | grep -v ^$
broker.id=0
listeners=INTERNAL://192.168.100.101:9093,EXTERNAL://kafka2:9092
inter.broker.listener.name=INTERNAL
advertised.listeners=INTERNAL://192.168.100.101:9093,EXTERNAL://kafka2:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.100.100:2181,192.168.100.101:2181,192.168.100.102:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0# kafka3 节点3cat server.properties |grep -v ^# | grep -v ^$
broker.id=0
listeners=INTERNAL://192.168.100.102:9093,EXTERNAL://kafka3:9092
inter.broker.listener.name=INTERNAL
advertised.listeners=INTERNAL://192.168.100.102:9093,EXTERNAL://kafka3:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.100.100:2181,192.168.100.101:2181,192.168.100.102:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0

2. 配置hosts映射

# 三个节点均需要配置主机名映射cat  /etc/hosts192.168.100.100 kafka1
192.168.100.101 kafka2
192.168.100.102 kafka3

3. 启动命令示例

./bin/kafka-server-start.sh  -daemon config/server.properties 

Nginx中间代理

nginx代理作为kafka服务端和客户端隔离的中转,因此需要两边的网络都能访问。

1. 配置hosts主机名映射

192.168.100.100  kafka1
192.168.100.101  kafka2
192.168.100.102  kafka3

2. 配置TCP四层代理

nginx四层代理需要使用stream模块,因此nginx一般建议使用rpm包安装或编译安装开启此模块。

# nginx 实例1
stream {server{listen 9092;proxy_pass node1;}upstream node1{server kafka1:9092 weight=1;}
}# nginx实例2stream {server{listen 9092;proxy_pass node2;}upstream node2{server kafka2:9092 weight=1;}
}# nginx实例3stream {#1server{listen 9092;proxy_pass node3;}upstream node3{server kafka3:9092 weight=1;}
}

kafka客户端

1. 配置hosts主机名映射

cat /etc/hosts192.168.200.100  kafka1
192.168.200.101  kafka2
192.168.200.102  kafka3192.168.200.x 为nginx节点所在ip

2. 访问测试验证

# 查看有哪些topickafka-topics.sh --bootstrap-server kafka1:9092 --list# 创建一个topickafka-topics.sh --bootstrap-server kafka1:9092 --create --replication-factor 2 --partitions 30 --topic test-topic# 生产一条消息echo '{"key":"value"}' | kafka-console-producer.sh --broker-list kafka1:9092 --topic test-topic# 消费数据kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic test-topic --from-beginning --max-messages 3

架构说明

 数据流说明

(1)客户端通过Nginx代理获取到Kafka集群的元数据信息。

(2)元数据信息中包含的是集群的主机名信息,客户端获取到主机名后,在hosts文件中进行解析。例如:kafka1映射为对应的Nginx实例地址:192.168.200.100。这样数据流就会再次Nginx进行交互,相当于对Kafka客户端进行了"欺骗"

总结

 使用Nginx代理Kafka集群,架构并没有较少对外暴露服务的实例数量。架构上主要能实现内外网隔离安全。例如外网Kafka客户端不用开通到内网Kafka集群的直连火墙。只需要将Nginx集群的地址暴露给外网客户端。

架构上可以将Kafka集群中三个节点的监听端口分别配置成不同端口,例如:

advertised.listeners=PLAINTEXT://kafka1:9092
advertised.listeners=PLAINTEXT://kafka2:9093
advertised.listeners=PLAINTEXT://kafka3:9094

在一台节点服务器上运行一个Nginx,然后配置三个不同的server分别监听不同的端口:

stream {#1server{listen 9092;proxy_pass node1;}upstream node1{server kafka1:9092 weight=1;}#2server{listen 9093;proxy_pass node2;}upstream node2{server kafka2:9093 weight=1;}#3server{listen 9094;proxy_pass node3;}upstream node3{server kafka3:9094 weight=1;}
}

在资源上我们只需要部署一台对外暴露的Nginx服务器IP和三个端口即可

192.168.200.100 kafka1
192.168.200.100 kafka2
192.168.200.100 kafka3

这样客户端就避免和Kafka Broker直连,而是通过nginx进行了路由。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1424138.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

街道治安新利器:EasyCVR智能视频管理方案助力城市安全新高度

一、背景分析 随着城市化进程的加快和社会治安形势的日趋复杂,街道治安管理面临着前所未有的挑战。对于街道治安的管理,面临着街道上机动车、非机动车违停、游商摊贩、垃圾堆积、人员监管等问题,既影响市容市貌,又有安全隐患。传…

SpringBoot(一)之初始化

SpringBoot(一)之初始化 文章目录 SpringBoot(一)之初始化SpringBoot框架 SpringBoot简化配置1. 创建SpringBoot项目关于初始化错误 2. SpringBoot项目结构主类pom.xml1. 关于spring-boot-starter-parent2. 关于spring-boot-starter-web3. 关于spring-boot-starter-test4. 关于…

NFC交友名片源码

NFC交友名片源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 <html lang"en"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

解决Word文档中页眉有部分有,有部分没有的问题

问题描述&#xff1a;一个Word文档中&#xff0c;在页眉上添加文档名称和页码&#xff0c;但是有的有&#xff0c;有的没有&#xff0c;选择“链接到前一节”也无法解决该问题。 原因分析&#xff1a;页眉页脚中&#xff0c;勾选了“首页不同”的选项&#xff0c;如下图&#…

AI交互数字人赋能农业数字化、智能化推广营销

2024陵水荔枝文化节上“数字新农人”陵小荔身着黎族服饰、佩戴银器亮相开幕式现场&#xff0c;AI交互数字人生动地以互动式推介和歌舞等形式&#xff0c;带领宾客们了解陵水荔枝的发展历程、产业布局、未来愿景等。如今&#xff0c;越来越多农产品品牌通过3D虚拟数字人定制&…

【Java基础】集合(2) —— List

List 存储的对象是有序的&#xff08;集合中存储对象的顺序和使用add方法添加对象的顺序一致&#xff09;&#xff0c;存储的对象是可重复的。 List的特有的功能: 都是可以操作索引的功能。 增: void add(int index, E element )boolean addAll(int index, Collection<? …

MS5173M-16bit、单通道、200kSPS、 SAR 型 ADC

MS5173M 是单通道、 16bit 、电荷再分配逐次 逼近型模数转换器&#xff0c;采用单电源供电。 MS5173M 包含一个低功耗、高速数据采样且 无失码的真 16 位 SAR ADC 和一个内部转换时钟。 MS5173M 使用通用的串口接口实现转换结果 的接收&#xff0c;还包含低噪声、宽…

【C语言】自定义类型之---结构体超详解(结构体的定义使用、指针结构体,内存对齐,......代码详解)

目录 前言&#xff1a; 一&#xff1a;结构体 1.1&#xff1a;什么是结构体&#xff1f; 1.2&#xff1a;结构体类型的声明 1.3&#xff1a;结构体变量的定义 1.4&#xff1a;结构体的内存对齐 1.5&#xff1a;结构体传参 二&#xff1a;位段 2.1&#xff1a;位段是什…

4 软件定义安全综合:使用c/s模式进行控制器数据安全交互管理

在SDN三层结构中&#xff0c;我们通过OpenFlow 协议可以控制数据转发设备的相关行为&#xff08;包括收集设备的信息&#xff09;&#xff0c;那么控制器上的数据能否通过应用层的程序进行管理调用呢&#xff1f; SDN&#xff08;软件定义网络&#xff09;的北向开发是指通过编…

Arduino红外遥控器,控制继电器水泵

我们将讨论如何使用Arduino和IRremote库来实现通过红外遥控器控制继电器的开关。通过这个项目&#xff0c;你将学会如何接收和解码红外信号&#xff0c;并根据接收到的信号控制继电器&#xff08;这里的继电器可以换成其他传感器&#xff09;的状态。 项目简介 我们将使用Ard…

【Linux网络编程】IO多路转接之poll

poll 1.poll初始2.poll函数接口3.poll服务器4.poll的优点缺点 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.poll初始 poll也是一种linux…

静态IP代理:网络世界的隐秘通道

在数字化时代&#xff0c;网络安全和隐私保护日益受到重视。静态IP代理作为一种网络服务&#xff0c;为用户提供了一个稳定且可预测的网络连接方式&#xff0c;同时保护了用户的在线身份。本文将从五个方面深入探讨静态IP代理的概念、优势、应用场景、技术实现以及选择时的考量…

英语单词量测试

网址&#xff1a;https://preply.com/en/learn/english/test-your-vocab 测试结果&#xff1a; 细节&#xff1a;英语母语者有20000-35000个单词的词汇量&#xff0c;8岁孩子的词汇量在8000个左右。而不是我们教育系统里说的&#xff0c;6000个单词足够用了。足够用&#xff0…

基于EBAZ4205矿板的图像处理:05均值滤波算法

基于EBAZ4205矿板的图像处理&#xff1a;05均值滤波算法 项目全部文件已经上传&#xff0c;是免费的 先看效果 可以明显看到图像变糊了&#xff0c;这就是均值滤波的特点&#xff0c;将噪声均摊到每个点上的同时&#xff0c;也会让图像丢失细节。 算法讲解 均值滤波&#x…

Mini Cheetah 代码分析(八)基于零空间的任务分级

一、主要公式 二、源代码注释 三、相关原理解释 一、主要公式 二、源代码注释 该功能的实现在文件KinWBC.cpp中的FindConfiguration函数&#xff0c;主要看注释&#xff0c;与公式是能够对应起来的&#xff0c;由第0个任务&#xff0c;也就是接触任务开始进行迭代&#xff0…

基于SSM的“羽毛球馆管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“羽毛球馆管理系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统结构图 登录界面 后台用户添加 后台用户管理 球场添加 球场…

「前端」性能优化问题总结

前言 本文主要介绍一些前端通用的性能优化方案总结&#xff0c;非写代码阶段的性能优化。 分包 React router V6.4 数据路由新特性 <Route path/xx lazy{async()>{const module await import(./xx)const XX module.defaultreturn{element:(<Suspense fallback…

C++(week3):C语言文件操作

文章目录 (十二) 文件1.流(1)流模型(2)程序员视角的文件(3)缓冲区类型(4)标准流(5)二进制文件 与 文本文件(6)文件流的接口(API) 2.打开/关闭文件(1)fopen(2)fclose(3)示例代码 3.读/写文件(1)fgetc / fputc&#xff1a;读写文本文件&#xff0c;一个字符一个字符地读写(2)fget…

校园防欺凌平台

校园霸凌事件很难被发现&#xff0c;发现者又可能迫于威胁而不敢告发&#xff0c;被霸凌者又因各种原因而选择忍耐&#xff0c;所以&#xff0c;如果能够在发生校园霸凌的时候&#xff0c;做出及时的预警&#xff0c;也许能够拯救挽回无数个家庭。本平台结合防欺凌设备&#xf…

什么是Serverless ?

目录&#xff1a; 1、服务器发展阶段 2、Serverless定义 3、Serverless理解