现有服务器三台:
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能收到自己的消息了
试下listeners=PLAINTEXT://0.0.0.0:9092
改了之后仍然没有效果。。改成0.0.0.0之后 只有本机发的本机能收到了 即A发只有A能收。。
改成0.0.0.0看端口状态 对两边来说9092是都开放了 但是就是收不到消息 C模拟消费的时候还报错 提示找不到leader 模拟发送直接请求超时。。
把ZK的数据清除了 在试下。
好像还是不可以。。都提示fail to find leader。。
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端口?
先telnet下端口。看看通不通。
telnet可以连接 用nmap扫描也能发现端口是开放的
在A上telnet 10.1.33.33的2181和9092 在C上telnet 192.168.175.1的2181和9092 这些操作没错吧
在A和C上,
telnet 10.1.33.33 9092
A可以 C不可以 10.1.33.33是网卡1对应的IP地址啊。。C应该不能连通的
对,看错了,
C telnet 192.168.33.1 9092
这个是可以连接的 没毛病。。
那说明都可以的,C机器,kafka broker地址写的是192.168.33.1:9092吧?
您是指用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
这个错还是网络问题,我现在没场景模拟你的场景。
我是这样模拟的。。A是一台外网服务器,B是我的电脑,C是我电脑开的虚拟机。。这样AB BC都能连,AC连不了
自己建的双网卡?
VMWare自带虚拟网卡啊。?
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:现在先不解释,你先试试)
这样还是不行。。按照您的方法,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任一主机发送消息,三者均能消费到,但是实际并不是这样的,最多只能有两边连通。
三台机器上的模拟生产和消费 的命令是这样写的,您看一下是不是我哪里写错了:
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 ;
A,B之间的网络关系是什么?
1、A是外部机器,是局域网内,还是要经过外网出口,访问B?
2、B的内网地址、和外网地址是否如我所说的?(ps:我指的外网地址,是在ip138查到的一致)
因为,如果你不是双网卡,你在B机器启动kafka时,只需要绑定B机器的内网地址,就可内外均可访问。(外网地址需要进行路由映射,防火墙等,才能访问)
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的虚拟网卡是否算多网卡,这点我不能确定
抛开你的虚拟机,现在假设你有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, 能不能访问,是跟网关有关。
抱歉我没太理解您想表达的意思,如您所说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)连接?
B是你的kafka机器,并且不是虚拟机,在这种情况下,如果A,B网关相通,那么A就可以正常消费发送kafka。
您这么说 倒是指出问题了。我在自己电脑上试了一下 新建了一个192.168.34.34的虚拟机,网关设为我自己本机192.168.34.1;发现33和34的网关无法连通。。
您好,问题解决了吗?我现在有同样的问题,场景一模一样,求私聊
Q:602359733
抱歉 没有解决。由于此问题不是生产遇到的问题 所以此问题暂时搁置了
我解决了。。改配置文件就可以。我只试了两个网段的,按道理应该多个网段也可以配置的
你的答案