在运行我的代码以形成jGroups集群时,我在RHEL 7.3.1中看到了这个异常。在日志中可以看到以下异常。
[DEBUG] 2017-10-03 20:23:01.339 [pool-10-thread-1] client.jgroups - Creating new Channel
[WARN ] 2017-10-03 20:23:01.342 [pool-10-thread-1] stack.Configurator - JGRP000014: TP.loopback has been deprecated: enabled by default
[DEBUG] 2017-10-03 20:23:01.343 [pool-10-thread-1] stack.Configurator - set property UDP.bind_addr to default value /fe80:0:0:0:2d57:389e:e4fe:9520%eth0
[DEBUG] 2017-10-03 20:23:01.345 [pool-10-thread-1] stack.Configurator - set property UDP.diagnostics_addr to default value /ff0e:0:0:0:0:0:75:75
[DEBUG] 2017-10-03 20:23:01.346 [pool-10-thread-1] client.jgroups - STATE OPEN
[DEBUG] 2017-10-03 20:23:01.347 [pool-10-thread-1] protocols.UDP - sockets will use interface fe80:0:0:0:2d57:389e:e4fe:9520%eth0
[ERROR] 2017-10-03 20:23:01.374 [pool-10-thread-1] client.jgroups - Catching
java.lang.Exception: failed to open a port in range 40000-40255
at org.jgroups.protocols.UDP.createDatagramSocketWithBindPort(UDP.java:500) ~[xxx-xxx.jar:2.0.1]
at org.jgroups.protocols.UDP.createSockets(UDP.java:361) ~[xxx-xxx.jar:2.0.1]
at org.jgroups.protocols.UDP.start(UDP.java:270) ~[xxx-xxx.jar:2.0.1]
at org.jgroups.stack.ProtocolStack.startStack(ProtocolStack.java:965) ~[xxx-xxx.jar:2.0.1]
at org.jgroups.JChannel.startStack(JChannel.java:891) ~[xxx-xxx.jar:2.0.1]
at org.jgroups.JChannel._preConnect(JChannel.java:553) ~[xxx-xxx.jar:2.0.1]
at org.jgroups.JChannel.connect(JChannel.java:288) ~[xxx-xxx.jar:2.0.1]
at org.jgroups.JChannel.connect(JChannel.java:279) ~[xxx-xxx.jar:2.0.1]
现在,相同的客户端代码在Ubuntu 14.04计算机上运行完美。另外需要注意的是,两种情况都没有提供以下标志。
-Djava.net.preferIPv4Stack=true
此外,在这两种情况下都使用链接本地IPv6地址。 如何使相同的代码在RHEL上工作?
为@ bela-ban提出的问题添加以下信息: 在config xml中尝试选项。
我试过LINK_LOCAL& NON_LOOPBACK,但仍然得到相同的错误。
JGroups版本?
我使用的是3.6.3-JGroups的最终版本。
省略IPv4标志
我们省略-Djava.net.preferIPv4Stack = true,因为我们想在IPv6客户端环境中测试我们的客户端。
运行ifconfig -a
同样运行命令ifconfig -a,提供以下输出:
ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.66.194.103 netmask 255.255.252.0 broadcast 10.66.195.255
inet6 fe80::4b16:4a66:2bc3:c505 prefixlen 64 scopeid 0x20<link>
inet6 fe80::30cb:2f41:5e04:51c2 prefixlen 64 scopeid 0x20<link>
inet6 fe80::2d57:389e:e4fe:9520 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:b8:65:47 txqueuelen 1000 (Ethernet)
RX packets 8485475 bytes 1961303302 (1.8 GiB)
RX errors 0 dropped 109087 overruns 0 frame 0
TX packets 49088 bytes 4169469 (3.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 154252 bytes 11261136 (10.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 154252 bytes 11261136 (10.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
答案 0 :(得分:0)
您使用的是哪个版本的JGroups? (java -cp jgroups.jar org.jgroups.Version
将版本打印到stdout)。
使用系统属性-Djava.net.preferIPv4Stack=true
将强制使用IPv4地址。在您的情况下,在RHEL上,您似乎省略了此属性,因此使用IPv6地址。
确保您拥有地址fe80:0:0:0:2d57:389e:e4fe:9520%eth0
(ifconfig -a
)。请注意,您可以使用bind_addr=link_local
选择任何链接本地地址。
答案 1 :(得分:0)
因此,由于本地链接地址错误,所有这些都失败了。
第一个错误是使用现在过时的ifconfig
命令。如果分配的本地链接地址有效,则不提供任何信息。
要使用的正确命令是ip address
。在我的情况下,此命令返回以下内容:
# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:15:5d:b8:65:47 brd ff:ff:ff:ff:ff:ff
inet 10.66.194.103/22 brd 10.66.195.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::2d57:389e:e4fe:9520/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::30cb:2f41:5e04:51c2/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::4b16:4a66:2bc3:c505/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
如您所见,此处列出的ipv6本地链接地址标记为tentative dadfailed
。这意味着这些地址不能用于任何事情。因此,下一步是清除这些不良地址并添加我们自己唯一的本地地址。我做了以下步骤来完成此任务:
#add the new unique local address. Again this can be duplicate, so chose wisely. A reboot may be required after this.
$nmcli c mod eth0 ipv6.addresses fc00::10:8:8:71/7 ipv6.method manual
# Remove out the old local link addresses
$ip address delete fe80::4b16:4a66:2bc3:c505/64 dev eth0
$ip address delete fe80::30cb:2f41:5e04:51c2/64 dev eth0
$ip address delete fe80::2d57:389e:e4fe:9520/64 dev eth0
在此之后,我们可以再次验证上述步骤是否有效
ip address show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:15:5d:b8:65:47 brd ff:ff:ff:ff:ff:ff
inet 10.66.194.103/22 brd 10.66.195.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fc00::10:8:8:71/7 scope global
valid_lft forever preferred_lft forever
不再查看tentative dadfailed
。
因此,总结一下这根本与JGroups无关,只是由糟糕的本地链接地址引起。