2017-10-05 147 views
0

上午看到這個例外在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 
+0

我讀過這個鏈接:http://www.techstacks.com/howto/troubleshoot-jgroups-and-multicast-ip-issues.html。但我不確定如何對鏈接本地地址應用相同的建議。 – eminemence

回答

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根本沒有關係,只是由於本地鏈接地址不好造成的。

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

+0

感謝您的回覆。我試過LINK_LOCAL和NON_LOOPBACK,但仍然得到相同的錯誤。我正在使用JGroups的3.6.3-最終版本。 – eminemence

相關問題