jGroups不会使用链接本地ipv6地址

时间:2017-10-05 14:00:02

标签: ubuntu-14.04 ipv6 rhel jgroups

在运行我的代码以形成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

2 个答案:

答案 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%eth0ifconfig -a)。请注意,您可以使用bind_addr=link_local选择任何链接本地地址。

[1] http://www.jgroups.org/manual4/index.html#Transport

答案 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无关,只是由糟糕的本地链接地址引起。

相关问题