Kafka可以跨越不同网段消费吗?

I'm CxY 发表于: 2017-12-25   最后更新时间: 2017-12-25 16:54:06   8,088 游览

现有服务器三台:
A:172.16.33.33
B:10.1.33.33(对A)/192.168.33.1(对C)
C:192.168.33.33

其中A和B可以相互通信,使用网卡1
B和C可以互相通信,使用网卡2
A和C不能直接连通
现在要以A作为生产者,C作为消费者
B使用kafka作为消息中间件
请问C能消费到A的消息吗
如果可以 应该做哪些配置?

以下是一些失败的尝试

尝试1:
在B上对server.properties的listener选项配置
但是PLAINTEXT协议只能使用一次,还必须指定不同的端口
这就导致只能一边连通
即A的消息B能模拟消费,但是C消费不到

尝试2:
开2个Kafka组成一个小的kafka集群,配置两个不同的server.properties
但结果AC两边都收不到B模拟发出的消息
只有B能收到自己的消息了

发表于 2017-12-25
添加评论

试下listeners=PLAINTEXT://0.0.0.0:9092

I'm CxY -> 半兽人 6年前

改了之后仍然没有效果。。改成0.0.0.0之后 只有本机发的本机能收到了 即A发只有A能收。。

I'm CxY -> I'm CxY 6年前

改成0.0.0.0看端口状态 对两边来说9092是都开放了 但是就是收不到消息 C模拟消费的时候还报错 提示找不到leader 模拟发送直接请求超时。。

半兽人 -> I'm CxY 6年前

把ZK的数据清除了 在试下。

I'm CxY -> 半兽人 6年前

好像还是不可以。。都提示fail to find leader。。

I'm CxY -> 半兽人 6年前

Fetching topic metadata with correlation id 0 for topics [Set(aaa)] from broker [BrokerEndPoint(0,0.0.0.0,9092)] failed
java.net.SocketTimeoutException
.....(后面是failed to find leader的错误)

看样子好像是连接问题?无法访问0.0.0.0的9092端口?

半兽人 -> I'm CxY 6年前

先telnet下端口。看看通不通。

I'm CxY -> 半兽人 6年前

telnet可以连接 用nmap扫描也能发现端口是开放的

I'm CxY -> I'm CxY 6年前

在A上telnet 10.1.33.33的2181和9092 在C上telnet 192.168.175.1的2181和9092 这些操作没错吧

半兽人 -> I'm CxY 6年前

在A和C上,
telnet 10.1.33.33 9092

I'm CxY -> 半兽人 6年前

A可以 C不可以 10.1.33.33是网卡1对应的IP地址啊。。C应该不能连通的

半兽人 -> I'm CxY 6年前

对,看错了,
C telnet 192.168.33.1 9092

I'm CxY -> 半兽人 6年前

这个是可以连接的 没毛病。。

半兽人 -> I'm CxY 6年前

那说明都可以的,C机器,kafka broker地址写的是192.168.33.1:9092吧?

I'm CxY -> 半兽人 6年前

您是指用C模拟生产者的时候填的那个broker吗?如果是的话 我写的的确是这个 但是一旦发送消息 就提示
Error when sending message to topic aaa with key:null,value:1 bytes with error :(org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

org.apache.kafka.common.errors.TimeoutException:Expiring 1 records for aaa-1 due to 1511ms has passed since batch creation plus linger time

半兽人 -> I'm CxY 6年前

这个错还是网络问题,我现在没场景模拟你的场景。

I'm CxY -> 半兽人 6年前

我是这样模拟的。。A是一台外网服务器,B是我的电脑,C是我电脑开的虚拟机。。这样AB BC都能连,AC连不了

半兽人 -> I'm CxY 6年前

自己建的双网卡?

I'm CxY -> 半兽人 6年前

VMWare自带虚拟网卡啊。?

半兽人 -> I'm CxY 6年前

ok,那我知道了。

首先,B机器是kafka服务器也是你电脑本机,
B机器有一个内网IP:192.168.33.1。
外网IP:10.1.33.33
你的listener设置为192.168.33.1:9092。

你的虚拟机C,直接连192.168.33.1:9092。

先测试好C之后,再回到A。
A你说是外网机器,那么你就访问外网地址 10.1.33.33:9092。(ps:现在先不解释,你先试试)

I'm CxY -> 半兽人 6年前

这样还是不行。。按照您的方法,BC模拟收发没有问题,但提示A连接10.1.33.33超时,检查发现由于未开启监听,扫描10.1.33.33的9092端口为关闭状态。 关于这个listener的设置 我试过好几种情况了 



①0.0.0.0:虽在两边都开启监听,但AC都不能收到B的消息; 

②10.1.33.33:AB可以互相收发消息,C找不到leader; 

③192.168.33.1:BC可以互相收发消息,A找不到leader。 



我在三台机子上同时进行模拟和消费。理想状态是ABC任一主机发送消息,三者均能消费到,但是实际并不是这样的,最多只能有两边连通。

I'm CxY -> 半兽人 6年前

三台机器上的模拟生产和消费 的命令是这样写的,您看一下是不是我哪里写错了: 



A(172.16.33.33): 

./kafka-console-producer.sh --broker-list 10.1.33.33:9092 --topic aaa 

./kafka-console-consumer.sh --bootstrap-server 10.1.33.33:9092 --topic aaa ; 



B(windows)(10.1.33.33/192.168.33.1): 

kafka-console-producer.bat --broker-list 10.1.33.33:9092,192.168.33.1:9092 --topic aaa 

kafka-console-consumer.bat --bootstrap-server (上述两者任一均可) --topic aaa ; 



C(192.168.33.33): 

./kafka-console-producer.sh --broker-list 192.168.33.1:9092 --topic aaa ./kafka-console-consumer.sh --bootstrap-server 192.168.33.1:9092 --topic aaa ;

半兽人 -> I'm CxY 6年前

A,B之间的网络关系是什么?



1、A是外部机器,是局域网内,还是要经过外网出口,访问B?

2、B的内网地址、和外网地址是否如我所说的?(ps:我指的外网地址,是在ip138查到的一致)



因为,如果你不是双网卡,你在B机器启动kafka时,只需要绑定B机器的内网地址,就可内外均可访问。(外网地址需要进行路由映射,防火墙等,才能访问)

I'm CxY -> 半兽人 6年前

1、是局域网内,为了避免其他因素的影响,我换了一台服务器10.1.33.34替代之前的172.16.33.33进行测试。

新的服务器与B在同一网段,网关是10.1.33.254,问题依旧存在。 



2、很遗憾,我是在一个大的工作环境的内网,不能连到外部互联网。B对大内网而言地址的确是10.1.33.33,对我本机和虚拟机组成的小内网而言也的确是192.168.33.1.抱歉之前可能描述有问题,“外网服务器”实际指的是与我本机不同的大内网环境的另一台测试用服务器。



可以肯定的是我的物理网卡只有一个,对于VMware的虚拟网卡是否算多网卡,这点我不能确定

半兽人 -> I'm CxY 6年前

抛开你的虚拟机,现在假设你有2个网段的机器,



A、10.0.1.1 (生产者)

B、10.0.2.1 (kafka集群)



B设置listener=10.0.2.1就可以了。



kafka集群正常,A访问10.0.2.1:9092, 能不能访问,是跟网关有关。

I'm CxY -> 半兽人 6年前

抱歉我没太理解您想表达的意思,如您所说A在10.0.1.0/24网段中,B在10.0.2.0/24网段中,假设网关都是10.0.x.254.那么只要10.0.1.254能和10.0.2.254连通,理论上10.0.1.1就可以和10.0.2.1连通,在没有其他限制的情况下A当然可以访问10.0.2.1:9092。您是想说 由于10.1.33.0/24的网关不是我(10.1.33.33),而是另外某台机器,但它无法连接我机器的虚拟机,所以无法和192.168.33.0/24(这个网关是我,192.168.33.1)连接?

半兽人 -> I'm CxY 6年前

B是你的kafka机器,并且不是虚拟机,在这种情况下,如果A,B网关相通,那么A就可以正常消费发送kafka。

I'm CxY -> 半兽人 6年前

您这么说 倒是指出问题了。我在自己电脑上试了一下 新建了一个192.168.34.34的虚拟机,网关设为我自己本机192.168.34.1;发现33和34的网关无法连通。。

您好,问题解决了吗?我现在有同样的问题,场景一模一样,求私聊
Q:602359733

I'm CxY -> 空白 5年前

抱歉 没有解决。由于此问题不是生产遇到的问题 所以此问题暂时搁置了

空白 -> I'm CxY 5年前

我解决了。。改配置文件就可以。我只试了两个网段的,按道理应该多个网段也可以配置的

你的答案

查看kafka相关的其他问题或提一个您自己的问题