inter conex i on

36
+ Interconexión y Despliegue Sistemas Distribuidos Rodrigo Santamaría

Upload: jonh-leiva

Post on 16-Aug-2015

239 views

Category:

Documents


2 download

TRANSCRIPT

+Interconexin y Despliegue Sistemas Distribuidos Rodrigo Santamara +Interconexin y Despliegue Fase 1 Despliegue FAQ 2+Fase 1 !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 !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 Fases y prctica obligatoria 3+Fase 1 !Cada una de las fases se realizar en parejas !La misma pareja para todas las fases !Obligatorio, salvo causas de fuerza mayor !Las fases 1 y 2 sirven como chequeo del aprendizaje prctico !Son opcionales (evaluacin continua) !Se discutirn en clase tras la entrega, centrndonos en los problemas e implementaciones de los que entreguen !Antes de explicar la fase siguiente Detalles 4+Fase 1 !En Studium, est prevista la entrega de las fases 1, 2 y 3 !La fecha de entrega es hasta las 23:55 del da listado Entrega 5TipoSemanaEntregaCarcter Fase 1Interconexin4 (7-8 mar)20 marzoOpcional Fase 2Tiempos6 (21-22 mar)17 abrilOpcional Fase 3Coordinacin9 (18-19 abr)14 mayoObligatorio +Detalles " Deben entregarse los ficheros fuente del programa, comprimidos " Un fichero por clase java utilizada (slo los .java) " Scripts de lanzamiento " Cualquier otro documento que consideris oportuno" .jar, informes, etc. " La entrega se realizar por Studium (ambos miembros de la pareja deben realizar la entrega) " El nombre del fichero comprimido debe ser Apellido1Nombre1Apellido2Nombre2 " Apellido1 y Nombre1 se refieren al primer apellido y nombredel primer miembro de la pareja (segn orden alfabtico del primer apellido) " Apellido2 y Nombre2 al primer apellido y nombre del otro Entrega +Fase 1 !Implementar una carrera por relevos distribuida " Tenemos 8 Atletas dispuestos a correr " 4 en un ordenador y 4 en otro " Tenemos una clase principal Carrera " Ejecutndose en uno de dichos ordenadores " Todos los atletas comienzan pero se quedan parados esperando el pistoletazo de salida " 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 Carrera 100m lisos (versin distribuida) 7+Fase 1 !La carrera debe implementar una interfaz con los mtodos !preparado(dorsal): !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) !La liberacin de todos los atletas es equivalente al pistoletazo de salida !llegada(dorsal, tiempo) !Imprime por pantalla el dorsal y el tiempo Carrera 100m lisos (versin distribuida) 8+Fase 1 Carrera 100m lisos (ejemplo con 2 procesos) A1A2 Carrera preparado preparado listo listo 9-11s llegada > A2: 9.23s llegada > A2: 10.07s numPreparados++ numPreparados++ numListos++ numListos++ 9+Fase 1 !El hilo de la carrera debe estar arrancado antes que los procesos de los atletas !Se puede dar un tiempo de espera antes de arrancar los atletas !Divide y entenders: realizad el ejercicio por fases: !Primero haced el ejercicio en una sola mquina, sin RMI !Los 8 atletas en la misma mquina !Luego modificadlo en una sola mquina, con RMI !Por ltimo modificadlo en dos mquinas, con RMI Carrera 100m lisos: recomendaciones 10+Fase 1 !S respetuoso con la red y tus compaeros. La red del laboratorio es potente, pero puede colgarse si: !Dejas hilos corriendo eternamente !Asegurate de que terminan su ejecucin !Si los encuentras todava corriendo, kill -9 es tu amigo !Lanzas mltiples registros con rmiregistry !Realizas pruebas iniciales con mltiples procesos !Primero, asegrate de que funciona en una mquina !Luego, asegrate de que funciona con 2 mquinas (1 proceso en cada mquina) !Finalmente, prueba con el nmero total de mquinas y procesos Carrera 100m lisos: recomendaciones 11+Fase 1 !Es una carrera justa? Por qu? !Cmo se podran solucionar los problemas identificados? Carrera 100m lisos: anlisis 12+Interconexin y Despliegue Ejemplo Despliegue FAQ 13+Despliegue !Inicialmente, tenemos que lanzar de algn modo los procesos a ejecutar en cada computador !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 !No vamos a ir ordenador a ordenador arrancando los procesos !Un posible mtodo: scripts de la shell !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 14+Despliegue !Un script para lanzar en cada host: lanzarLocal.sh !java ruta/Atleta [parametros] !Un script para lanzar en el servidor: lanzar.sh !javac ruta/Carrera.java!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 !Si no se lanza desde Java, lanzar antes rmiregistry [port] !sleep 5 !ssh host lanzarLocal.sh (para cada host) Posible solucin 15+Java RMI !La clase Atleta puede tener un mtodo main que permita argumentos (p. ej. el n de dorsal) !Ese mtodo puede lanzar tantos objetos Atleta como se requiera !La mayora de opciones que se pueden realizar por el terminal se pueden realizar desde Java !ver FAQ: terminal y opciones de la JVM !Todo esto son guas sobre cmo hacer el despliegue !El nico requisito es que se realice desde un nico terminal Despliegue 16+Java RMI !Cada vez que hacis una conexin SSH, os va a pedir la clave !Puede resultar un tanto tedioso para realizar pruebas, etc. !Autorizar la clave en SSH nos hace perder seguridad, no automatizarla nos hace perder eficiencia !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 Despliegue: claves 17+Java RMI !Tutorial sobre el proceso de generacin y distribucin de claves !http://www.mtu.net/~engstrom/ssh-agent.php !Tutorial equivalente, pero directamente en cdigo Java !http://docs.oracle.com/javase/tutorial/security/apisign/step2.htmlDespliegue: claves 18+Java RMI Esquema ordenador Aordenador BcompartirClaves.sh limpiar.sh compilar.sh distribuir.sh rmiregistry [puerto] lanzar.sh limpiar.sh scp lanzarLocal.sh limpiar.sh *.class *.sh clave pblica limpiar.sh 19+Interconexin y Despliegue Fase 1 Despliegue FAQ 20+FAQ "Dnde puedo encontrar informacin adicional? " 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 " 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. Informacin adicional 21+FAQ "Hay varios errores tpicos al implementar un protocolo RMI " 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: " No tener implementada una poltica de seguridad " O tenerla, pero con un nivel de seguridad incorrecto Errores frecuentes 22+FAQ "Cmo compartimos la clase que hace de interfaz? " 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). Compartiendo la interfaz 23+FAQ "Es necesario implementar siempre el servicio de seguridad? " 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) Servicio de seguridad 24+FAQ "Es necesario establecer el codebase? " 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. " 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: " System.setProperty("java.rmi.server.codebase", "url")) Codebase 25+FAQ "Puedo enlazar objetos que se encuentran en una mquina distinta al registro RMI? " 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 Localizacin remota 26+FAQ "Se pueden incluir en Java algunas de las tareas de terminal o de las opciones de la VM? "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) Terminal y opciones de la JVM 27+FAQ "En LocateRegistry.getRegistry(), obtengo el error: " 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

Connection refused 28+FAQ "En registro.rebind(), obtengo el error: " 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) Connection refused (II) 29+FAQ "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. !Esto suele ocurrir si estamos intentando convertir el stub a la clase que implementa la interfaz !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 $Proxy0 cannot be cast 30+FAQ "En registro.rebind() tengo el error: " 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 UnmarshalException 31+FAQ "En registro.rebind() tengo el error: " 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 UnmarshalException (II) 32+FAQ "En el laboratorio, en Fedora, tengo este error: " 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 rmiregistryrmiregistry: /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 problemaUnmarshalException (III) 33+FAQ " En el laboratorio, en Fedora, el cliente falla con: " java.rmi.ConnectException: Connection refused to host: 127.0.0.1;... " Esto ocurre por una mala configuracin en Fedora del /etc/hosts127.0.0.1 localhost labhp10 " 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: 127.0.0.1 localhost172.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 Fedora: Connection refused to host 127.0.0.1 34+FAQ "En el servidor o el cliente, tengo el error: " 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 AccessControlException 3536