Вы находитесь на странице: 1из 36

+

Interconexin y
Despliegue
Sistemas Distribuidos
Rodrigo Santamara

+ Interconexin y Despliegue

Fase 1
Despliegue
FAQ

Fase 1
Fases y prctica obligatoria
n

Realizar el algoritmo distribuido planteado como prctica


obligatoria requiere de varios componentes, por ello lo
dividimos en tres fases para estudiar sus conceptos
fundamentales:

Por ese motivo lo dividimos en tres fases


n

1) Despliegue e interconexin
2) Tiempos: algoritmo NTP

3) Tiempos y acuerdo: Lamport, Ricart y Agrawala

La primera fase se usa en las otras dos, y la segunda se usa


en la tercera: son un modo de dividir la complejidad

Fase 1
Detalles
n

Cada una de las fases se realizar en parejas


n

La misma pareja para todas las fases

Obligatorio, salvo causas de fuerza mayor

Las fases 1 y 2 sirven como chequeo del aprendizaje prctico


n
n

Son opcionales (evaluacin continua)


Se discutirn en clase tras la entrega, centrndonos en los
problemas e implementaciones de los que entreguen
n

Antes de explicar la fase siguiente

Fase 1
Entrega
n

En Studium, est prevista la entrega de las fases 1, 2 y 3


Tipo

Semana

Entrega

Carcter

Fase 1 Interconexin

4 (7-8 mar)

20 marzo

Opcional

Fase 2 Tiempos

6 (21-22 mar) 17 abril

Opcional

Fase 3 Coordinacin

9 (18-19 abr)

Obligatorio

14 mayo

La fecha de entrega es hasta las 23:55 del da listado

Detalles
Entrega
l

Deben entregarse los ficheros fuente del programa, comprimidos


l
l
l

Un fichero por clase java utilizada (slo los .java)


Scripts de lanzamiento
Cualquier otro documento que consideris oportuno
l
.jar, informes, etc.

La entrega se realizar por Studium (ambos miembros de la


pareja deben realizar la entrega)
l

El nombre del fichero comprimido debe ser


Apellido1Nombre1Apellido2Nombre2
l
Apellido1 y Nombre1 se refieren al primer apellido y nombre
del primer miembro de la pareja (segn orden alfabtico del
primer apellido)
l
Apellido2 y Nombre2 al primer apellido y nombre del otro

Fase 1
Carrera 100m lisos (versin distribuida)
n

Implementar una carrera por relevos distribuida


l

Tenemos 8 Atletas dispuestos a correr


4 en un ordenador y 4 en otro
Tenemos una clase principal Carrera

l
l

Ejecutndose en uno de dichos ordenadores


Todos los atletas comienzan pero se quedan parados
esperando el pistoletazo de salida

l
l

Mediante una llamada a un mtodo en la interfaz registrada


en RMI de la carrera

Al llegar a meta notifican a la carrera su dorsal y terminan

Fase 1
Carrera 100m lisos (versin distribuida)
n

La carrera debe implementar una interfaz con los mtodos


n

preparado(dorsal):
n

incrementa el nmero de dorsales preparados y deja al


proceso atleta bloqueado

cuando el nmero de dorsales preparados es igual al total de


atletas, libera a todos los atletas

listo(dorsal): igual que preparado(dorsal)


n La liberacin de todos los atletas es equivalente al pistoletazo
de salida

llegada(dorsal, tiempo)
n

Imprime por pantalla el dorsal y el tiempo

Fase 1
Carrera 100m lisos (ejemplo con 2 procesos)
Carrera
A1

A2
preparado

preparado

numPreparados++
numPreparados++

listo

listo

numListos++
numListos++

9-11s
llegada
llegada

> A2: 9.23s


> A2: 10.07s

10

Fase 1
Carrera 100m lisos: recomendaciones
n

El hilo de la carrera debe estar arrancado antes que los


procesos de los atletas
n

Se puede dar un tiempo de espera antes de arrancar los atletas

Divide y entenders: realizad el ejercicio por fases:


n

Primero haced el ejercicio en una sola mquina, sin RMI


n

n
n

Los 8 atletas en la misma mquina

Luego modificadlo en una sola mquina, con RMI


Por ltimo modificadlo en dos mquinas, con RMI

11

Fase 1
Carrera 100m lisos: recomendaciones
n

S respetuoso con la red y tus compaeros. La red del


laboratorio es potente, pero puede colgarse si:
n

Dejas hilos corriendo eternamente


n

Asegurate de que terminan su ejecucin

Si los encuentras todava corriendo, kill -9 es tu amigo


Lanzas mltiples registros con rmiregistry
n

n
n

Realizas pruebas iniciales con mltiples procesos


n Primero, asegrate de que funciona en una mquina
n

Luego, asegrate de que funciona con 2 mquinas (1 proceso


en cada mquina)

Finalmente, prueba con el nmero total de mquinas y


procesos

12

Fase 1
Carrera 100m lisos: anlisis
n

Es una carrera justa? Por qu?

Cmo se podran solucionar los problemas identificados?

+ Interconexin y Despliegue

Ejemplo
Despliegue
FAQ

13

14

Despliegue
n

Inicialmente, tenemos que lanzar de algn modo los


procesos a ejecutar en cada computador
n

Y el registro RMI en la mquina en la que se ejecute el servidor

Y terminar limpiamente en todos los computadores a la


finalizacin o en caso de fallo

Queremos hacerlo de manera centralizada


n

No vamos a ir ordenador a ordenador arrancando los procesos

Un posible mtodo: scripts de la shell


n

rmiregistry [port] para lanzar el registro rmi

ssh host rdenes para ejecutar rdenes en hosts remotos

scp origen host:destino para copiar ficheros en hosts remotos

15

Despliegue
Posible solucin
n

Un script para lanzar en cada host: lanzarLocal.sh


n

java ruta/Atleta [parametros]

Un script para lanzar en el servidor: lanzar.sh


n

javac ruta/Carrera.java

n
n

javac ruta/Atleta.java
scp ruta/* host:ruta (para cada host)

Basta con copiar los .class (o .jar) del Atleta y de la Interfaz


java ruta/Carrera
n

n
n
n

Si no se lanza desde Java, lanzar antes rmiregistry [port]

sleep 5
ssh host lanzarLocal.sh (para cada host)

16

Java RMI
Despliegue
n

La clase Atleta puede tener un mtodo main que permita


argumentos (p. ej. el n de dorsal)
n

La mayora de opciones que se pueden realizar por el


terminal se pueden realizar desde Java
n

Ese mtodo puede lanzar tantos objetos Atleta como se requiera

ver FAQ: terminal y opciones de la JVM

Todo esto son guas sobre cmo hacer el despliegue


n

El nico requisito es que se realice desde un nico terminal

17

Java RMI
Despliegue: claves
n

Cada vez que hacis una conexin SSH, os va a pedir la clave


n

Puede resultar un tanto tedioso para realizar pruebas, etc.

Autorizar la clave en SSH nos hace perder seguridad, no


automatizarla nos hace perder eficiencia
n

Solucin: sistema de clave pblica y privada:


1.

Crear un par de claves (pblica,privada) ssh-keygen

2.

Copiar la clave pblica al ordenador al que queramos conectarnos


va SSH scp

3.

Conectarnos por primera vez (pide el passphrase) ssh

4.

Arrancar un agente SSH ssh-agent

5.

Aadir nuestra clave al agente ssh-add

6.

A partir de este punto, las claves quedan confirmadas y


almacenadas, cualquier ssh se podr realizar sin password

18

Java RMI
Despliegue: claves
n

Tutorial sobre el proceso de generacin y distribucin de claves


n

http://www.mtu.net/~engstrom/ssh-agent.php

Tutorial equivalente, pero directamente en cdigo Java


n

http://docs.oracle.com/javase/tutorial/security/apisign/step2.html

19

Java RMI
Esquema

compartirClaves.sh
limpiar.sh
compilar.sh
distribuir.sh
ordenador A

rmiregistry [puerto]
lanzar.sh

scp

clave pblica
limpiar.sh
*.class
*.sh
lanzarLocal.sh

limpiar.sh
limpiar.sh

ordenador B

+ Interconexin y Despliegue

Fase 1
Despliegue
FAQ

20

21

FAQ
Informacin adicional
l

Dnde puedo encontrar informacin adicional?


l

Los tutoriales de Oracle sobre RMI son muy recomendables:


-

Sobre codebase:
http://download.oracle.com/javase/1.4.2/docs/guide/rmi/
codebase.html

Sobre RMI
l
l

http://download.oracle.com/javase/tutorial/rmi/
http://download.oracle.com/javase/1.4.2/docs/guide/rmi/
getstart.doc.html

Si no encontramos la solucin, ni pensando, ni con los


tutoriales, probablemente alguien habr tenido el mismo
error y lo habr posteado en un foro: Google es tu amigo.

22

FAQ
Errores frecuentes
l

Hay varios errores tpicos al implementar un protocolo RMI


l

En el servidor:
-
-
-

No haber iniciado el registro RMI


No tener definido el path al codebase de RMI
No utilizar rmiregistry, java y javac de la misma
distribucin (cuidado con sus rutas por defecto)

En servidor y cliente
-

No utilizar las mismas clases compiladas para la interfaz

Si enviamos clases no definidas en el API:


l No tener implementada una poltica de seguridad
l

O tenerla, pero con un nivel de seguridad incorrecto

23

FAQ
Compartiendo la interfaz
l

Cmo compartimos la clase que hace de interfaz?


l

Con RMI conseguimos llamar a un objeto desde otro


ordenador, sin necesidad del cdigo del objeto, pero s de su
interfaz. Por tanto, la clase interfaz (bien el cdigo .java, bien
compilada importando la carpeta con los .class o en un .jar),
debe ser importada por el servidor y el cliente (ambos deben
tener copia de esos ficheros).
Ojo, en caso de usar el cdigo sin compilar, no funcionar si
tenemos interfaces que no son idnticas en servidor y cliente,
e incluso puede no funcionar an siendo iguales (si las
versiones de la JVM son distintas, por ejemplo).

24

FAQ
Servicio de seguridad
l

Es necesario implementar siempre el servicio de


seguridad?
l

No. La poltica de seguridad es slo necesaria si los mtodos


de nuestra interfaz tienen como argumentos (o devuelven)
clases que no estn en el API estndar.
Si este es el caso (lo cual no es muy frecuente), tenemos que
poner el cdigo para el SecurityManager y establecer en
un fichero la poltica de privacidad (ver el .pdf de la
presentacin para ms informacin)

25

FAQ
Codebase
l

Es necesario establecer el codebase?


l

S, el servidor debe decirnos dnde est el cdigo base del


objeto(s) remoto(s), mediante la propiedad
java.rmi.server.codebase, que apunta a una url con
file://, en cuyo caso los objetos remotos debern estar en la
misma mquina que el servicio, o con una url con http://, en
cuyo caso podrn estar en mquinas distintas al servidor.
l

Sin embargo esta segunda opcin puede fallar (ver FAQ:


Localizacin remota)

El codebase se puede establecer como argumento a la JVM (Djava.rmi.server.codebase=url) o desde el propio


programa:
l

System.setProperty("java.rmi.server.codebase",
"url"))

26

FAQ
Localizacin remota
l

Puedo enlazar objetos que se encuentran en una mquina


distinta al registro RMI?
l

En principio s, por ello tanto Naming.bind/rebind como


Registry.bind/rebind aceptan una URL como parmetro
Sin embargo, es muy posible que no funcione:
-

java.rmi.AccessException:
Registry.Registry.rebind disallowed; origin /
212.128.169.73 is non-local host

Esto depende del tipo de registro RMI que utilicemos,


muchos no lo soportan o hacen falta cambios en sus
configuraciones para que acepten enlaces remotos

27

FAQ
Terminal y opciones de la JVM
l

Se pueden incluir en Java algunas de las tareas de


terminal o de las opciones de la VM?
l

S, por ejemplo:
-

Puedes, en general, lanzar cualquier orden del sistema con


Runtime().getRuntime.exec()

Puedes crear el registro RMI con Runtime.getRuntime


().exec(rmiregistry) o con
LocateRegistry.createRegistry()

Puedes conocer tu IP con InetAddress.getLocalHost


().getHostAddress()

Puedes pasar propiedades como por ejemplo


java.rmi.server.codebase con
System.setProperty(propiedad, valor)

28

FAQ
Connection refused
l

En LocateRegistry.getRegistry(), obtengo el error:


l

l
l

java.rmi.ConnectException: Connection refused


to host: 212.128.169.73;

Esto suele ocurrir si el registro RMI no se ha iniciado.


Se puede iniciar desde un terminal con
-

rmiregistry [port]

O desde java con


- Runtime.getRuntime().exec
("rmiregistry");
O, mejor, desde java con
- LocateRegistry.createRegistry(int port);
Ojo con iniciar un registro cuando ya hay otro corriendo

29

FAQ
Connection refused (II)
l

En registro.rebind(), obtengo el error:


l

java.rmi.ConnectException: Connection refused


to host: 212.128.169.73;

Esto suele ocurrir si iniciamos el registro RMI en un


puerto distinto de aqul por defecto (1099) y luego
simplemente obtenemos el registro RMI con
LocateRegistry.getRegistry()
Si usamos un puerto distinto de 1099 (p.ej. el 6060)
debemos usar LocateRegistry.getRegistry(6060)

30

FAQ
$Proxy0 cannot be cast
En UnicastRemoteObject.exportObject(), obtengo:

java.lang.ClassCastException: $Proxy0 cannot be


cast to carreraDistribuida.Carrera

$Proxy0 indica una clase compilada por java durante la


ejecucin, se refiere al stub que creamos.
n Esto suele ocurrir si estamos intentando convertir el stub
a la clase que implementa la interfaz
n

El stub, a nivel de clase, es la interfaz en s, no la clase que


implementa la interfaz. Debemos hacer el casting por tanto a
la clase que implementa la interfaz

31

FAQ
UnmarshalException
l

En registro.rebind() tengo el error:


l

java.rmi.UnmarshalException: error unmarshalling


arguments; nested exception is:
java.lang.ClassNotFoundException: rmi.Corredor

Esto puede ocurrir porque el servidor no encuentra los


codebase para las clases registradas en RMI
Hay que definir la ruta a los codebases para RMI de una de
estas maneras:
-

-Djava.rmi.server.codebase=urlClases

System.setProperty("java.rmi.server.codebase",
"file:/Users/rodri/Documents/workspace/assoo/
bin/");

Ojo: debe ser una url, apuntar a las clases compiladas (/bin/), y
terminar en /

Ojo: necesitamos el codebase para hacer el stub, as que la


llamada debe estar ANTES de ese punto

32

FAQ
UnmarshalException (II)
l

En registro.rebind() tengo el error:


l

java.rmi.UnmarshalException: error unmarshalling


arguments; nested exception is:
java.lang.ClassNotFoundException: rmi.Corredor

Esto tambin puede ocurrir porque el servidor RMI que


ejecutamos no es el correspondiente a la versin de java con
la que ejecutamos el programa
Hay que tener cuidado con que los comandos rmiregistry, java
y javac sean todos de la misma versin de java.
Esto es especialmente importante en el laboratorio, donde, al
menos en Fedora (ver siguiente error), puede haber hasta tres
versiones de java distintas, ms otras instalaciones que
contienen rmiregistry

33

FAQ
UnmarshalException (III)
l

En el laboratorio, en Fedora, tengo este error:


l

java.rmi.UnmarshalException: error unmarshalling


arguments; nested exception is:
java.lang.ClassCastException:
java.io.ObjectStreamClass cannot be cast to
java.lang.String

Es un error bastante puetero, pues no nos da informacin


relevante de lo que est pasando.
El problema es que tenemos varias rdenes instaladas para
ejecutar un servicio de registro RMI. En particular, en los
Fedora del laboratorio tenis dos rdenes para rmiregistry:
-
-

[p1777026@labhp10 ~]$ whereis rmiregistry


rmiregistry: /usr/bin/rmiregistry /opt/jdk1.6.0/bin/rmiregistry

Y se ejecuta por defecto el de /usr/bin. Esta no es la misma


implementacin que la de la JDK 1.6, as que tendremos que
correr el de la jdk para solventar el problema

34

FAQ
Fedora: Connection refused to host 127.0.0.1
l

En el laboratorio, en Fedora, el cliente falla con:


l

java.rmi.ConnectException: Connection refused to


host: 127.0.0.1;...

Esto ocurre por una mala configuracin en Fedora del /etc/


hosts
-

Es decir, labhp10 seala a 127.0.0.1, as que si el cliente


accede va RMI a labhp10, est accediendo realmente a
127.0.0.1, que en el cliente se referir a s mismo y no al
servidor.
El modo de solucionarlo es editar /etc/hosts:
-
-

l
l

127.0.0.1 localhost labhp10

127.0.0.1 localhost
172.20.2.21 labhp10

(para saber vuestra ip en fedora: /sbin/ifconfig -a)


Otra opcin (quizs ms inteligente) es publicar el servicio
con la ip en vez de con el nombre

35

FAQ
AccessControlException
l

En el servidor o el cliente, tengo el error:


l

java.security.AccessControlException: access denied


(java.net.SocketPermission 127.0.0.1:1099
connect,resolve)

Hemos activado el gestor de seguridad, pero tiene una


seguridad muy alta/indadecuada
Crear un fichero file.policy con la poltica de la seguridad
y enlazarlo con -Djava.security.policy como se vio en

los ejemplos ms arriba


La poltica de seguridad deber implementarse en
cliente y servidor

Recordad que la poltica de seguridad en principio slo es


necesaria si usamos como parmetro/valor de retorno en los
mtodos remotos algn objeto que no est en la API

36

Вам также может понравиться