2013-10-02 32 views
5

Konfiguruję JMX na jednej z usług działających na instancji Amazon EC2, ale nie działa ona poprawnie. Używam VisualVM do połączenia i po krótkim okresie oczekiwania nie uda się z przekroczeniem limitu czasu. Wygląda na to, że nie działa z powodu brakujących danych odpowiedzi lub opóźnień. Sprawdziłem, czy port JMX jest włączony w grupie zabezpieczeń, a także wypróbowałem z innym portem bez włączonego JMX, a także z portem nie włączonym w ustawieniach grupy zabezpieczeń i oba ulegają natychmiastowej usterce, więc wygląda inaczej. Moja instancja EC2 i komputer mają zainstalowane Ubuntu 12.04 i JDK 7.Dlaczego połączenie JMX z Amazon EC2 nie działa?

Okazuje się, że porty nie mają sensu, ponieważ połączenie jest zabezpieczone protokołem SSL. Mam klucz prywatny i nie mam pojęcia, jak go używać z JConsole lub VisualVM.

+0

możliwy duplikat [sposobu łączenia się z instancjami Java działającymi w EC2 przy użyciu JMX] (http://stackoverflow.com/questions/13734646/how-to-connect-to-java-instances-running-on-ec2- using-jmx) – Gray

Odpowiedz

3

To działa dla mnie. Ustaw opcje JMX na serwerze:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=<some port> 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=localhost 

otworzyć tunel SSH:

ssh -i /path/to/key -D <some port> [email protected]_dns_address 

Rozpocznij VisualVM:

jvisualvm -J-Dnetbeans.system_socks_proxy=localhost:<some port> -J-Djava.net.useSystemProxies=true 

Dodaj zdalnego połączenia z serwerem. Dodaj połączenie JMX za pomocą portu określonego dla JMX.

Aby było jasne, we wszystkich trzech powyższych przypadkach powinien być ten sam port.

+0

Nie próbowałem, ale o ile rozumiem, używa ssh jako lokalnego proxy. Mam 8 różnych instancji EC2 i oznacza to, że muszę uruchomić 8 różnych VisualVMs? –

+1

Zgadza się. To, co zrobiłem w tej sytuacji, to otworzyć jedno VisualVM, aby uzyskać szczegółowe informacje na temat MBeans, które chcę obejrzeć, a następnie napisać skrypt, aby uzyskać je lokalnie z każdego komputera. W szczególności instaluję JRuby i wykorzystuję klejnot JMX do wysyłania zapytania do JMX na komputerze lokalnym i drukowania wyników do konsoli lub wysyłania ich do systemu zdalnego w celu pobrania. Tworzy to trochę obciążenia systemów, w których uruchomiony jest skrypt, więc musisz to rozważyć. – Peter

+0

To działa dla mnie! Dziękuję bardzo. –

10

JMX potrzebuje rejestru RMI działającego na otwartym porcie. Domyślnie port rejestru RMI wybierany jest losowo w momencie uruchamiania i nie działa dobrze w przypadku zapór ogniowych. Od JDK7u4 można użyć

-Dcom.sun.management.jmxremote.rmi.port=<port> 

ustawić port RMI być używany. Następnie możesz włączyć ten port w grupie zabezpieczeń.

Należy zanotować część powyższego ustawienia, ponieważ zazwyczaj jest ona mylona z ustawieniem com.sun.management.jmxremote.port. Powinieneś nie!

+0

Okazuje się, że porty nie mają sensu, ponieważ połączenie jest zabezpieczone SSL. Mam klucz prywatny i nie mam pojęcia, jak go używać z JConsole lub VisualVM –

+0

Powinna to być najlepsza odpowiedź, ponieważ nie wymaga tunelu SSH lub otwarcia całego zakresu portów od 0-65535 (jak widziałem zasugerowałem gdzie indziej). – mmindenhall