#4sysadmins

Inicio » GNU/Linux » Monitorizar procesos java con JConsole (2/3) : JMX/RMI JConsole remota

Monitorizar procesos java con JConsole (2/3) : JMX/RMI JConsole remota

Últimas Entradas

Follow #4sysadmins on WordPress.com

Segunda parte de las entradas relacionadas con la JDK. Ahora toca el turno a JMX (Java Management Extension). Aprenderemos a levantar un MBean server al que poder conectar para monitorizar un proceso java remoto. En la primera entrada vimos como conectar con un proceso java de forma local a través de la herramienta jconsole. En este caso haremos esto de manera que la jconsole sea iniciada en otra máquina para que no afecte al rendimiento del servidor en el que corren las aplicaciones java.

Java

JMX (Java Management Extension)

JMX es un estándar definido por tres capas (Instrumentación, Agente y Servicios) útil para gestionar y monitorizar componentes hardware/software con Java.

Para que un recurso sea gestionado por JMX debe de contar con un software que provea de la instrumentación necesaria para tal fin, por ejemplo, si lo que queremos monitorizar/gestionar es un periférico como una impresora, este software deberá de contar con métodos para imprimir, ver la cola de impresión, eliminar elementos de la cola, etc… y propiedades como el tamaño del papel, estado de la impresora, etc…

Este software especializado recibe el nombre de MBean (ManagedBean) y no es mas que un objeto java. Existen diferentes MBean: Standar, Dynamic, Open y Model (estos dos últimos son una extensión del Dynamic Beans).

La plataforma java proporciona un set de MBeans para monitorizar y administrar la JVM y el loggin fácilmente:

javaplataform

Nota: Cada set MBeans proporciona la capacidad de monitorizar y administrar atributos como la memoria, el uso de CPU, el recolector de basura GC (Garbage Collection), etc…

Para controlar los recursos necesitados por la capa de instrumentación (MBeans) y mantener una relación entre ellos, JMX cuenta con la capa Agente. Un componente imprescindible de esta capa es el servidor MBeans mediante el cual podremos conectar a las aplicaciones Java de forma remota.

Por último la capa de servicios distribuidos se necesitará para que los agentes interactúen con los objetos de la capa de instrumentación.

mbeans

 

Configurar JMX/RMI

Bueno ya vimos en la primera entrada que para conectar a un proceso java basta con encontrarnos en la misma máquina donde se está ejecutando la aplicación java y ejecutar jconsole [pid]. Esto tiene el inconveniente de que la herramienta jconsole impacta sobre el rendimiento del sistema por lo que no es la mejor forma de monitorizar y gestionar un proceso java en un entorno de producción.

Si queremos que jconsole se levante en nuestra máquina cliente y conecte con un proceso remoto, deberemos de configurar el servidor remoto, mas concretamente la aplicación java, para que levante un servidor MBean que escuchando en un determinado puerto nos permita conectar.

A tener en cuenta:

  • En el servidor remoto (servidor que ejecuta la aplicación java) debemos de tener configurado un MBean server
  • Para tener un cierto nivel de seguridad, necesitaremos crear un archivo de acceso y otro de usuario/clave para autenticarnos
  • Podemos autenticar a través de SSL mediante certificado digital

 

Activar el agente JMX (MBserver)

Esto se hace al lanzar la aplicación java desde la línea de comandos mediante la propiedad com.sun.management.jmxremote y com.sun.management.jmxremote.port, o bien seteando estos parámetros en el archivo de configuración $JRE_HOME/lib/management/management.properties.

Importante: Los parámetros pasados por línea de comandos en el momento de la ejecución sustituyen a los seteados en el archivo de configuración.

Para activar el acceso local al agente JMX podríamos hacerlo tal que así (en momento de ejecución):

$ java -Dcom.sun.management.jmxremote -jar tuaplicación.jar

Si queremos setearlo de forma permanente, pues usaremos este mismo parámetro en el archivo $JRE_HOME/lib/management/management.properties o en el archivo de configuración del entorno java de la propia aplicación (veremos esto mas adelante)

En nuestro caso nos interesa conectar nuestra jconsole (en el equipo cliente) con un proceso java corriendo en un servidor remoto. Para ello deberemos de utilizar el parámetro anterior acompañado de este otro en el que se indica el puerto de escucha:

com.sun.management.jmxremote.port=portNum

En este punto tendríamos un agente JMX a la escucha. Por defecto se activa la capa SSL, la cual podemos desactivarla con la propiedad:

com.sun.management.jmxremote.ssl=false

Si además también queremos desactivar la autenticación por usuario, aplicaremos la siguiente propiedad:

com.sun.management.jmxremote.authenticate=false

En este punto tendremos el agente JMX “in-securizado”. Sería accesible para todo usuario que conozca la ip/hostname y el puerto de escucha.

Para lanzar la consola desde nuestro equipo cliente haremos:

$ jconsole hostname:puerto

 

Securizando la conexión remota

Autenticación por ususario/password

Podemos como primer paso, crear un rol de usuario con ciertos privilegios para poder monitorizar y gestionar el proceso java. De esta forma conseguiremos una primera barrera de autenticación. Para comenzar deberemos de setear a true la siguiente propiedad:

com.sun.management.jmxremote.authenticate=true

Lo siguiente es crear los archivos de acceso y contraseñas. Algo que haremos copiando de las plantillas existentes:

$ cd $JAVA_HOME/jre/lib/management
$ sudo cp jmxremote.password.template jmxremote.password
$ sudo chmod 600 jmxremote.password
$ sudo cp jmxremote.access.template jmxremote.access

Con los archivos creados, relacionaremos a los usuarios con unos niveles de acceso:

$ sudo vi $JAVA_HOME/jre/lib/management/jmxremote.password
 monitorRole unapassword
 controlRole otrapassword
$ sudo vi $JAVA_HOME/jre/lib/management/jmxremote.access
 monitorRole readonly
 controlRole readwrite

Importante: Un rol debe de tener una entrada en cada archivo para que sea funcional y además conservar el orden en ambos archivos

Nota: El rol que monitoriza le bastaría con permisos de lectura (readonly), mientras que para gestionar los recursos necesitaremos permisos de escritura (readwrite).

 

Autenticación con certificado digital

Si queremos securizar la conexión mediante SSL deberemos de setear a true la siguiente propiedad:

com.sun.management.jmxremote.ssl=true

y generar un certificado digital. Podemos crear un par de claves con la herramienta keytool:

  1. Crear un par de claves con el comando keytool -genkey
  2. Crear una petición de firmado de este certificado a una CA con el comando keytool -certreq
  3. Importar el certificado firmado dentro del keystore con keytool -import
  4. Configurar la capa SSL en el sistema. Para ello necesitaremos setear las siguientes propiedades:
    javax.net.ssl.keyStore | | Localización del keystore
    javax.net.ssl.trustStore | | Localización del truestore
    javax.net.ssl.keyStoreType | | Tipo del keystore por defecto
    javax.net.ssl.keyStorePassword | | Contraseña del keystore por defecto
    javax.net.ssl.trustStoreType | | Tipo del truestore por defecto
    javax.net.ssl.trustStorePassword | | Contraseña del truestore por defecto
  5. Habilitar el uso de SSH: com.sun.management.jmxremote.ssl.need.client.auth=true

Ahora solo faltaría disponer del certificado digital en ambas partes (servidor – cliente) y conectar con jconsole indicando el hostname y puerto

 

Ejemplo de prueba

Todo lo visto anteriormente es para conocer los parámetros, los archivos de configuración y la aproximación del procedimiento a seguir. Ahora cuando veáis este ejemplo os daréis cuenta que cada aplicación puede tener sus archivos de configuración pero al final todo es mas o menos igual.

En este ejemplo voy a levantar un conector JMX RMI para acceder a un proceso java remoto (HRegionserver, proceso esclavo del cluster HBase) utilizando la jconsole de mi equipo personal, de manera que no tendrá impacto en el rendimiento del servidor remoto en producción.

  • Creamos los archivos de rol:
$ cd $HBASE_HOME/conf
$ vi jmxremote.passwd
 monitorRole estaesmipass
 controlRole estaesmipass
$ chmod 600 jmxremote.passwd
$ vi jmxremote.access
 monitorRole readonly
 controlRole readwrite
  • Configuramos la JMX para que levante el conector al inicio de la aplicación (añadimos al final del archivo):
$ vi $HBASE_HOME/conf/hbase-env.sh
 HBASE_JMX_OPTS="$HBASE_JMX_OPTS -Dcom.sun.management.jmxremote.password.file=$HBASE_HOME/conf/jmxremote.passwd"
 HBASE_JMX_OPTS="$HBASE_JMX_OPTS -Dcom.sun.management.jmxremote.access.file=$HBASE_HOME/conf/jmxremote.access"

 export HBASE_REGIONSERVER_OPTS="$HBASE_JMX_OPTS -Dcom.sun.management.jmxremote.port=10102"
 export HBASE_JMX_BASE="-Dcom.sun.management.jmxremote.ssl=false
 -Dcom.sun.management.jmxremote.authenticate=true"
 export HBASE_JMX_OPTS="$HBASE_JMX_OPTS
 -Dcom.sun.management.jmxremote.password.file=$HBASE_HOME/conf/jmxremote.passwd"
 export HBASE_JMX_OPTS="$HBASE_JMX_OPTS -Dcom.sun.management.jmxremote.access.file=$HBASE_HOME/con
 /jmxremote.access"
 export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE $HBASE_JMX_OPTS
 -Dcom.sun.management.jmxremote.port=10101"
 export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE
 $HBASE_JMX_OPTS -Dcom.sun.management.jmxremote.port=10102"
  • Reiniciamos el proceso que queremos monitorizar. Yo en este caso voy a reiniciar el cluster completo:
$ stop-hbase.sh
$ start-hbase.sh
  • Ahora desde mi PC lanzo jconsole para posteriormente conectarme al proceso deseado:
$ jconsole

jconsole

Ahora debemos de indicar la IP:PUERTO y las credenciales con las que queremos acceder, en mi caso accederé con el rol de monitoreo:

consoleremota

Listo ahora ya sabemos conectar desde una jconsole local a un proceso java remoto de forma que no tenga impacto en un servidor.

 

 

Anuncios

Deja un comentario, Gracias!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: