讨论:无法访问不同网段的Kafka问题

问题

X同学:A网段的机器,访问B网段部署的Kafka集群,中间做了网络映射,映射成A网段可以访问的IP地址,A网段程序里配置bootstrap.servers就是这些可以访问的地址。但是最后发现还是无法访问,并且日志里看到了B网段的IP地址。请问怎么处理。

解决办法

kafka可以配置成注册的IP是公网IP:

listeners=INSIDE://<内网IP>:9092,OUTSIDE://<公网IP>:端口 advertised.listeners=INSIDE://内网IP:9092,OUTSIDE://<公网IP>:端口 listener.security.protocol.map=INSIDE:SASL_PLAINTEXT,OUTSIDE:SASL_PLAINTEXT inter.broker.listener.name=INSIDE

试试这个方案,行的话,就不用多做一层映射了。

进一步深入讨论此类问题

如果你们的网络映射配置的没错,那么感觉是跟redis cluster一样的问题。kafka集群的节点之间是使用的内网段地址进行交互,他们压根儿不知道有映射的这个外网地址。

解决问题的办法有几种,简单点的是:让client端的网络上再加一层转换,可以把kafka的内网IP解析成作了映射的外网IP。

更一般化的来看:两个机器A和B在不通的两个网段,IP分别为:10.1.1.101和10.1.2.102。现在想让A能访问B的端口9092。

为了实现这个目标我们已经实现了A和B同时都能访问P(IP 10.1.0.202),那么我们设置对于10.1.0.202:9092的映射转到B,即可实现A通过配置访问P来间接访问到B。

然后我们发现B在一个集群里,还有一个节点C IP为10.1.2.103,A请求B后,会拿到这个C的信息,也就是10.1.2.103,然后发起访问。这时候我们会发现A是无法访问C的,而且上面的办法也不能对C来使用,因为C的IP地址是B给的。

我们新增一个映射到C的IP 10.1.0.203,没地方修改成一个新的映射地址。此时,可以通过修改iptables规则,让A对于10.1.2.103的访问自动转到10.1.0.203。

iptables -t nat -A POSTROUTING -p tcp --dport 9092 -d 10.1.0.203 -j SNAT --to-source 10.1.2.103

类似这种,但是这个办法的一个不足之处是,所有访问的机器都要加这个路由条件。

这个问题的本质是,redis/kafka 集群不是被设计成跨不同的网络访问区来使用的。

相关推荐
白露与泡影8 小时前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存
Steadfast_GG8 小时前
Redis典型应用 - 缓存,缓存更新策略,内存淘汰策略,缓存预热,缓存穿透,缓存雪崩,缓存击穿
redis·缓存穿透·缓存击穿·缓存雪崩·缓存预热·缓存更新策略·内存淘汰策略
ACP广源盛139246256739 小时前
IX8024@ACP# 搭配此芯 AI 服务器 + 爱芯元智产品完整方案
大数据·运维·服务器·人工智能·分布式·嵌入式硬件
李昊哲小课12 小时前
ubuntu26.04搭建kafka集群
分布式·kafka
snow@li13 小时前
Redis:数据库语法速查表 / 全景梳理
数据库·redis·缓存
Alluxio14 小时前
Alluxio + Anyscale Ray框架,实现跨区域训练数据读取速度20倍提升
人工智能·分布式·机器学习·缓存·ai
csdn2015_17 小时前
kafka如何保证消息的顺序
分布式·kafka
云技纵横19 小时前
Redis 延迟双删还是读到脏数据?一次缓存一致性事故
redis·后端·面试
csdn2015_19 小时前
kafka如何确保消息不丢失
数据库·分布式·kafka
9523620 小时前
RabbitMQ - 高级特性
java·spring boot·分布式·后端·rabbitmq