的JGroups没有加入任何群RHEL上运行与我的代码时形成的JGroups集群链路本地IPv6地址
上午看到这个例外在RHEL 7.3.1。在日志中看到以下异常。的JGroups没有加入任何群RHEL上运行与我的代码时形成的JGroups集群链路本地IPv6地址
[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版本?
我正在使用JGroups的3.6.3-Final版本。
的省略IPv4的标志
我们省略-Djava.net.preferIPv4Stack =真实的,因为我们要测试我们的客户在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
因此,这是由于恶劣的本地链路地址的所有失败。
第一个错误是使用现在已经过时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
正如你可以看到这里列出被标记为tentative dadfailed
IPv6本地链路地址。这意味着这些地址不能用于任何事情。所以下一步就是去掉这些不好的地址并添加我们自己的唯一本地地址。我做了以下步骤来实现:
#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根本没有关系,只是由于本地链接地址不好造成的。
哪个版本的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
挑选任何链路本地地址。
感谢您的回复。我试过LINK_LOCAL和NON_LOOPBACK,但仍然得到相同的错误。我正在使用JGroups的3.6.3-最终版本。 – eminemence
我读过这个链接:http://www.techstacks.com/howto/troubleshoot-jgroups-and-multicast-ip-issues.html。但我不确定如何对链接本地地址应用相同的建议。 – eminemence