CURSO SISTEMAS DISTRIBUIDOS Sistemas Distribuidos 1 Ing. Einar TURPO AROQUIPA 1. Introducción: 1.1. Fundamentos: ¿Qué es un Sistema Distribuido? Antes de definir lo que es un Sistema Distribuido, vamos a definir un término más general: La Computación Distribuida, podemos definirla de muchas maneras, este término se utiliza indiscriminadamente para referirse a cualquier sistema en el que múltiples agentes autónomos, cada uno con capacidades de cómputo individual, se comunican entre sí y afectan mutuamente su comportamiento. Los agentes, usualmente llamados procesadores, procesos o nodos, pueden ser desde computadoras completas hasta autómatas celulares con capacidad de cómputo y memoria muy limitados que se pueden comunicar mediante mensajes. La Computación Distribuida hace referencia a cualquier evento en el cual se maneja un sistema en una red de computadoras y trata de describir las tendencias hacia la funcionalidad distribuida: sistemas distribuidos, procesamiento distribuido, bases de datos distribuidas y cualquier otro término computacional que sea distribuido. Podemos decir entonces, que la Computación Distribuida se refiere a los servicios que provee un Sistema de Computación Distribuido. Una de las primeras caracterizaciones de un Sistema Distribuido fue realizada por Enslow, ya en 1978, que le atribuye las siguientes propiedades: o Está compuesto por varios recursos informáticos de propósito general, tanto físicos como lógicos, que pueden asignarse dinámicamente a tareas concretas. o Estos recursos están distribuidos físicamente, y funcionan gracias a una red de comunicaciones. o Hay un sistema operativo de alto nivel, que unifica e integra el control de los componentes. o El hecho de la distribución es transparente, permitiendo que los servicios puedan ser solicitados especificando simplemente su nombre (no su localización). o El funcionamiento de los recursos físicos y lógicos está caracterizado por una autonomía coordinada. A pesar del tiempo transcurrido, esta definición sigue siendo, en esencia, válida. Así, para Coulouris un sistema distribuido es aquél que está compuesto por varias computadoras autónomas conectadas mediante una red de comunicaciones y equipadas con programas que les permitan coordinar sus actividades y compartir recursos. Bal ofrece una definición muy similar: ``Un sistema de computación distribuida está compuesto por varios procesadores autónomos que no comparten memoria principal, pero cooperan mediante el paso de mensajes sobre una red de comunicaciones''. Y según Schroeder, todo sistema distribuido tiene tres características básicas: Sistemas Distribuidos 2 Ing. Einar TURPO AROQUIPA o Existencia de varias computadoras. En general, cada una con su propio procesador, memoria local, subsistema de entrada/salida y quizás incluso memoria persistente. o Interconexión. Existen vías que permiten la comunicación entre las computadoras, a través de las cuales pueden transmitir información. o Estado compartido. Las computadoras cooperan para mantener algún tipo de estado compartido. El funcionamiento correcto del sistema se describirse como el mantenimiento de una serie de invariantes globales que requiere la coordinación de varias computadoras. Como lo hemos observado, el término de Computación Distribuida se define de varias maneras y lo mismo se aplica al término de Sistema Distribuido, así que en lugar de seguir dando más definiciones de estos términos, nos concentraremos en el análisis de las características más importantes de los Sistemas Distribuidos, de esta manera podremos construir una definición propia de lo que es un Sistema Distribuido al finalizar este capítulo. Una característica muy importante es que las diferencias entre las computadoras y las maneras en que estas se comunican no son transparentes para el usuario final, esto mismo aplica para la organización interna del sistema distribuido. Otra característica importante es que los usuarios y las aplicaciones pueden interactuar con un Sistema Distribuido de manera consistente y uniforme, sin importar donde y cuando se lleve a cabo la interacción. Todo Sistema Distribuido bebe también ser relativamente fácil poder expandir, lo cual se logra al tener computadoras independientes, pero al mismo tiempo “esconder” las funciones de dichas computadoras en el sistema. Normalmente un sistema distribuido debe de estar siempre disponible a pesar de que ciertas partes que lo conforman puedan no estar funcionando. Los usuarios y las aplicaciones no deben de notar en ningún momento que estas partes están siendo reemplazadas o reparadas, o que se han agregado nuevas partes al sistema para poder dar servicio a más usuarios o aplicaciones. Características de un Sistema Distribuidos: Cualquier diseñador de sistemas debe tener los conocimientos necesarios para enfrentarse a todas las complicaciones que pueden surgir al momento de considerar los requerimientos para el desarrollo de un sistema distribuido. A continuación explicaremos cada una de las características de los Sistemas Distribuidos, según Coulouris son estas características, los desafíos que presentan los sistemas distribuidos. a) Heterogeneidad: Al hablar de heterogeneidad nos referimos a la variedad y diferencia que podemos encontrar en los elementos que componen una red de computadoras sobre la que se ejecuta un sistema distribuido, dicha heterogeneidad no sólo se aplica a las redes y al hardware de las computadoras, sino también a los Sistemas Distribuidos 3 Ing. Einar TURPO AROQUIPA sistemas operativos, los lenguajes de programación y las implementaciones en las que trabajan los diferentes desarrolladores. Un ejemplo de esto lo podemos ver muy claro en Internet, ya que es una red que esta conformada por muchos tipos de redes (Figura 1) cuyas diferencias se encuentran enmascaradas, puesto que todas las computadoras que se conectan a este utilizan los protocolos de Internet para comunicarse una con otra, así una computadora conectada a una red Ethernet puede comunicarse con otra computadora conectada a una red TokenRing, basta con que se haga una implementación de los protocolos de Internet para cada una de esas redes. Figura 1. Un esquema clásico de la conexión a Internet Otro ejemplo lo podemos ver en los lenguajes de programación y en las aplicaciones escritas por diferentes programadores; en el caso de los lenguajes de programación es importante tener en cuenta las diferencias que puede haber en la representación de los caracteres y estructuras de datos como cadenas de caracteres y registros, las cuales pueden variar y pueden ocasionar conflictos entre programas que necesitan comunicarse entre ellos. De igual manera dos programas que son desarrollados por programadores diferentes tienen que utilizar estándares comunes para la comunicación en red y para la representación de los datos elementales y las estructuras de datos en los mensajes, ya que si no se cuenta con dichas similitudes, los programas no podrán comunicarse entre sí aunque se hayan desarrollado en el mismo lenguaje de programación. Un término que no podemos dejar de mencionar al hablar de heterogeneidad es el de Middleware (Figura 2); este término se aplica a la capa de software que provee una abstracción de programación, así como un enmascaramiento de la heterogeneidad subyacente de las redes, hardware, sistemas operativos y lenguajes de programación; además, el Middleware proporciona un modelo computacional uniforme al alcance de programadores de servidores y Sistemas Distribuidos 4 Ing. Einar TURPO AROQUIPA aplicaciones distribuidas que permite la invocación sobre objetos remotos, notificación de eventos remotos, acceso a bases de datos remotas y procesamiento distribuido de transacciones. Algunos ejemplos de Middleware son CORBA y Java RMI. Figura 2. Un sistema distribuido organizado como Middleware Otro término importante para este apartado es el de código móvil, que se emplea para referirse al código que pude ser enviado de una computadora a otra para que esta última la ejecute, un ejemplo de un código móvil son los applets de java, que son enviados del servidor a la computadora del cliente para que este los ejecute en su explorador de Internet. Al implementar un código de este tipo podemos encontrarnos con el problema de que el conjunto de instrucciones (a nivel máquina) de una computadora puede no ser el apropiado para otra máquina, por ejemplo, un usuario de una PC puede enviar un archivo ejecutable a un usuario de Linux y este último no será capaz de ejecutar dicho archivo. Para solucionar este problema se han creado lo que se conocen como máquinas virtuales, las cuales proveen un modo de crear código ejecutable sobre cualquier hardware, ya que el compilador de un lenguaje concreto generará un código para una máquina virtual y esta se encargará de “traducir” dicho código al apropiado para un hardware particular, así, un compilador de Java producirá un código para la máquina virtual de Java, y esta última sólo necesitará ser implementada una sola vez para cada máquina en la que se va a ejecutar. b) Extensibilidad y Apertura: La extensibilidad y la apertura son dos características de un sistema distribuido que están ampliamente ligadas la una con la otra. Algunos autores dicen que un sistema abierto debe de ser extensible y otros sostienen que un sistema extensible puede ser etiquetado como un sistema abierto. De cualquier manera lo que es importante saber y tener en cuenta es que un sistema distribuido debe de contar con ambas características. Un sistema distribuido abierto es un sistema que ofrece servicios desarrollados de acuerdo a reglas estandarizadas que describen la sintaxis y la semántica de dichos servicios. Por ejemplo, en una red de computadoras, estas reglas son las que regulan el formato, contenido y significado de los mensajes que se envían y se reciben a través de dicha red. Estas reglas son Sistemas Distribuidos 5 Ing. Einar TURPO AROQUIPA formalizadas en protocolos. En el caso de los sistemas distribuidos, los servicios se especifican generalmente a través de interfaces que por lo general son descritas en un Lenguaje de Definición de Interfaz (IDL por sus siglas en ingles), dicho lenguaje especifica los nombres de las funciones que están disponibles así como los parámetros de entrada, los valores de salida y los posibles errores que pueden obtenerse al invocarse dichas funciones. Si la definición de una interfaz se hace de manera adecuada, esta permitirá que dos procesos puedan comunicarse entre sí, siempre y cuando ambos procesos cuenten con la misma interfaz. Esto también permite que cada dos desarrolladores independientes construyan su propia implementación de dichas interfaces, lo cual conlleva al desarrollo de dos sistemas distribuidos desarrollados por separado que operan de la misma manera. Una especificación se considera adecuada cuando es completa y neutral. Completa significa que todo lo necesario para hacer una implementación de la interfaz ha sido especificado y que no será necesario que el propio desarrollador sea quien agregue detalles específicos de la implementación. Neutral significa que las especificaciones no deben tener ninguna tendencia hacia como se debe de hacer la implementación de dicha especificación. La completitud y la neutralidad son muy importantes para la interoperabilidad y la portabilidad, que son características que complementan la apertura de un sistema distribuido. La interoperabilidad, también conocida como compatibilidad, caracteriza el grado en el que la implementación de sistemas o componentes de diferentes fabricantes pueden coexistir y trabajar juntos, siempre y cuando se utilicen los servicios como este especificado por el estándar común bajo el cual dichos sistemas fueron desarrollados. La portabilidad por su parte caracteriza a que nivel puede ser ejecutada una aplicación desarrollada para un sistema distribuido “A” sobre un sistema distribuido “B” que implementa las mismas interfaces del sistema “A”, pero sin hacerle modificaciones. Uno de los principales objetivos que se persiguen al desarrollar un sistema operativo abierto, es que este sea flexible, lo que implica que dicho sistema puede ser integrado por diferentes componentes (tanto de hardware como de software), posiblemente de diferentes proveedores, que nuevos componentes pueden agregarse al sistema y que componentes existentes pueden ser reemplazados sin afectar el funcionamiento de los componentes ya existentes, en otras palabras, un sistema distribuido abierto debe de ser extensible. Para lograr la flexibilidad en un sistema distribuido abierto es necesario que el sistema este organizado en módulos o componentes relativamente pequeños y fáciles de reemplazar, esto implica que además de definir las especificaciones y la documentación de las interfaces de alto nivel a las que tienen acceso los usuarios y las aplicaciones, también es necesario definir las especificaciones de las interfaces de las partes internas que componen el sistema y describir de que manera interactúan entre sí. Sistemas Distribuidos 6 Ing. Einar TURPO AROQUIPA c) Seguridad: La gran mayoría de la información que maneja un sistema distribuido tiene un alto valor para los usuarios de dicho sistema, y es por eso que la seguridad de la información juega un papel clave al momento de desarrollar dicho sistema. La seguridad de la información es todo lo que concierne a asegurar que no ocurrirán cosas malas con los mensajes que envían los clientes para solicitar información a un servidor, y por su puesto, con la información que estos reciben como respuesta a sus peticiones. No basta con asegurar que estos mensajes serán transmitidos de forma oculta, sino que también hay que asegurar que la información sea entregada únicamente a quien debe de ser entregada y que esto se hará siempre de forma correcta y en el momento en que se requiere. La seguridad es relativa a la amenaza que cada sistema afronta, afecta a todos los puntos del sistema y debe de ser fácil de obtener. La seguridad debe ofrecer los siguientes servicios: o Confidencialidad, es decir, el manejo privado de la información: proteger la información de ser accedida por usuarios no autorizados. o Autentificación, o capacidad de asegurar la identidad de un usuario. o Integridad, que asegura que la información que empleamos no ha sido manipulada, alterada o corrompida desde el origen. o No repudio, de una operación de emisión y recepción de información por parte de los agentes. o Control de acceso a la información y/o recursos administrados por un sistema. o Disponibilidad de los recursos necesarios de un sistema cuando estos sean requeridos, lo que protege la información contra interferencia con los procedimientos de acceso a los recursos. El alto valor de que tiene la información es la razón principal por la que esta se puede ver amenazada de muchas formas, entre las principales podemos encontrar: Interrupción: Destruye la información o la inutiliza. Ataca la disponibilidad. Interceptación: Obtiene acceso a información. Ataca la confidencialidad. Sistemas Distribuidos 7 Ing. Einar TURPO AROQUIPA Modificación: Modifica la información. Ataca la integridad. Fabricación: Falsifica la información. Ataca la autenticidad. Para defenderse de este tipo de amenazas se han desarrollado diversas técnicas de encriptación, firmas digitales, implementación de barreras perimetrales (firewalls), modelos de seguridad internos y externos, etc. Sin embargo, estas técnicas parecen no ser suficientes para evitar que intrusos logren interferir con el flujo de información óptimo de un sistema, ya que encuentran formas de “brincarse” las barreras de seguridad de muchas organizaciones y además siguen ideando nuevas formas de atacar y amenazar la información, un ejemplo de estos nuevos ataques son los ataques de denegación de servicio. Estos ataques consisten en bombardear un servicio con un gran número de peticiones simultáneas (y por lo general inútiles) de modo que el sistema se colapse, obstaculizando el servicio a los usuarios que desean utilizarlo. Como hoy en día la capacidad de los sistemas distribuidos ha crecido mucho, en ocasiones resulta muy difícil o incluso imposible bloquear el servicio utilizando una sola computadora atacante, por lo que ahora se han desarrollado los ataques de denegación de servicio distribuidos, los cuales hacen uso de miles o incluso millones de computadoras para generar las peticiones al sistema que se desea bloquear, por lo que bloquear un ataque de esta magnitud resulta sumamente complicado. Si bien no podemos asegurar que un sistema distribuido sea cien por ciento seguro, es importante contar con un esquema de seguridad lo más robusto posible, que a pesar de no ser inmune a todo tipo de ataques, si será capaz de frenar la gran mayoría de dichos ataques. Algunas recomendaciones muy útiles para los desarrolladores, administradores e implementadotes de un sistema distribuido se presentan a continuación: Sistemas Distribuidos 8 Ing. Einar TURPO AROQUIPA o Efectuar un análisis de riesgos Esto se suele mencionar en la literatura como el primer paso a realizarse cuando se plantea la seguridad en un sistema. La idea es muy sencilla: trazar todos los elementos que conforman nuestro sistema (hardware y software) y observar cuáles involucran más o menos riesgo. Esto desembocará en un plan de seguridad cuyo objetivo es disminuir el riesgo total del sistema, que se puede modelar como la suma de los riesgos de sus componentes: RIESGO TOTAL = RIESGO (componente 1) + RIESGO (componente 2)... El riesgo de cada componente está en función directa a las pérdidas que ocasionaría el que éste deje de operar, así como en función de cuán vulnerable es dicho componente en este momento. Por ejemplo, una base de datos de clientes involucra un gran riesgo debido al gran valor que la información representa para una organización; pero una simple PC Windows de la misma organización conectada directamente al Internet (sin firewall/proxy de por medio) también lo representa, debido a que puede ser objeto de un ataque desde el exterior, con el posible riesgo de fácil propagación hacia otros computadores de nuestra red. o Lo más valioso debe alejarse de lo más vulnerable En la fórmula del "riesgo" propuesta arriba, es evidente que los componentes de nuestro sistema con alto valor y alta vulnerabilidad serán de lejos los que presenten mayor riesgo. Sin embargo, en muchos casos no es sencillo disminuir el valor de cierto componente (y por tanto la pérdida en caso de problemas), y tampoco se puede eliminar completamente la vulnerabilidad del mismo (por ejemplo, si está de cara a Internet.) En este caso lo que conviene es separar o dividir este componente en dos partes suficientemente alejadas e independientes a fin de que el riesgo total disminuya. Por ejemplo, los portales de comercio electrónico deben dar cara a Internet (siendo vulnerables en principio) y a la vez manejar información muy costosa (como transacciones con tarjeta de crédito.) Esto los convierte en un sistema de alto riesgo. Sin embargo es casi universal la separación que se efectúa entre los componentes dedicados a dar cara a Internet (como los Web Servers) y los componentes que manipulan la información comercial (generalmente sistemas DBMS.) En términos prácticos, esto significa que el hacker no puede acceder directamente al DBMS (lo que sería catastrófico), y sólo podría atacar al Web Server, lo que en principio no acarrea mayores consecuencias. o Mantener las cosas simples Un sistema complejo es más difícil de asegurar y potencialmente proporciona una mayor cantidad de puertas abiertas a los atacantes. En general, es recomendable intentar dividir el problema mediante la Sistemas Distribuidos 9 Ing. Einar TURPO AROQUIPA simplificación de la configuración, para así identificar los puntos o rutas de control vulnerables para incrementar la seguridad. La seguridad debe estar en todos los niveles. Esto se puede expresar más sencillamente como: no confiar el sistema a un único mecanismo de seguridad. La información fluye a través de los distintos componentes y/o capas del sistema y son muchas las instancias en las que se puede mejorar su seguridad. La recomendación estipula que utilicemos todas estas instancias a pesar de que en principio puedan parecer redundantes. Por lo general los administradores tienden a preocuparse por un único punto de acceso desde donde supuestamente hay una gran probabilidad de ser atacados (por ejemplo, la conexión a Internet.) Por tanto se invierte esfuerzo y dinero en controlar este único punto bajo la asunción de que es la única puerta de entrada a los maleantes y que por tanto, tras asegurarla, todo el sistema quedará seguro. Esto tiene dos problemas: Muchos ataques o "vulnerabilidades" se originan (de forma inocente o intencional) desde dentro de la organización. El sistema que controla la "puerta" siempre puede fallar. Esto obliga a implementar la seguridad no en un único punto evidentemente vulnerable, sino en todos los lugares por donde fluye la información al interior de cada componente involucrado. Encriptar tanto como sea posible La encriptación es un tema complejo pero cuya implementación resulta cada vez más sencilla conforme aparecen más productos. Los cambios del año pasado en la legislación norteamericana con respecto a la exportación de productos que encriptan, son un incentivo claro para que los desarrolladores y vendedores se interesen más en el tema. En general, los canales de comunicación más vulnerables o de mayor cercanía al público requieren una encriptación "más fuerte", es decir, más difícil de descifrar por los curiosos o atacantes. Cierta información conlleva más riesgo que otra, y por tanto requerirá un nivel de encriptación diferenciado. Las herramientas capaces de hacer esto son muchas, dependiendo del contexto en que nos encontremos. Por ejemplo, los sistemas DBMS más avanzados incorporan la encriptación como una opción normal para los datos almacenados, generalmente bajo esquemas propietarios. La tecnología de encriptación de información destinada a pasar a través de la red ha evolucionado bastante, haciéndose popular el término VPN para hacer referencia a canales que encriptan la información de un modo más o menos Sistemas Distribuidos 10 Ing. Einar TURPO AROQUIPA transparente. Hay soluciones propietarias así como estándares relativamente implementados como IP Sec. Ciertas aplicaciones estándares han recibido soluciones de encriptación también estándar. El caso del Web encriptado bajo SSL (HTTPS) junto con la industria de certificados digitales es el caso más conspicuo. De igual modo los estándares para correo electrónico PGP (o derivados) y S/MIME son integrados cada vez con mayor frecuencia en las aplicaciones de los usuarios finales. En nuestra organización deberíamos encriptar todo lo que sea posible. La razón de esto es evidente si de lo que se trata es de enviar un mensaje privado por Internet. Sin embargo, al interior de la organización la encriptación puede ayudar también. Naturalmente hay que sopesar los inconvenientes que trae la encriptación en términos de incomodidad de uso, costo de licencias, ciclos de CPU, etcétera; con el hecho de que cierta información es definitivamente de carácter público y por tanto no tiene sentido que esté encriptada. Además de estas hay muchas más recomendaciones de seguridad que podemos mencionar, por ejemplo: no confiar en la autenticación estándar, no usar la configuración "estándar", educar a los usuarios, ejecutar sólo los servicios imprescindibles, mantenerse al día con las actualizaciones y hacer chequeos regulares, establecer planes de contingencia y sistemas de respaldo, mantener contacto con el proveedor de líneas de comunicación, no permitir conexiones directas desde la red interna a Internet, hacer uso de una red perimétrica o zona desmilitarizada, prácticas de programación segura, vigilancia, establecimiento de políticas, etc. d) Escalabilidad: La escalabilidad es una de las características más importantes para los desarrolladores de un sistema distribuido. Se dice que un sistema es escalable si logra conservar su efectividad cuando hay el número de recursos y el número de usuarios incrementa significativamente. La escalabilidad de un sistema pude medirse en tres aspectos diferentes: Con respecto a su tamaño: lo que significa que se pueden agregar más usuarios y más recursos al sistema de una manera muy fácil. Con respecto a su localización o área de implementación: lo que significa que tanto los usuarios como los recursos pueden estar en locaciones remotas y separadas el uno del otro. Con respecto a su administración: lo que significa que puede ser fácil de administrar a pesar de que se utiliza en diferentes organizaciones independientes que cuentan con diferentes políticas de seguridad y que hacen un uso particular del sistema. Desafortunadamente, un sistema que es escalable en uno o más de estos aspectos por lo general afecta el rendimiento del sistema conforme al crecimiento del mismo. Sistemas Distribuidos 11 Ing. Einar TURPO AROQUIPA Problemas de la Escalabilidad Cuando se necesita escalar un sistema a un nivel más alto es muy común que surja algún tipo de problema. Si consideramos la escalabilidad con respecto al tamaño de un sistema, nos encontramos con las limitaciones que presentan los servicios, los datos y los algoritmos centralizados. En muchos sistemas distribuidos es común encontrar servicios centralizados, es decir, que son implementados en un mismo servidor, lo que puede ocasionar un problema muy obvio: este servidor puede convertirse en un cuello de botella si el número de usuarios crece, y a pesar de tener una capacidad de procesamiento y almacenamiento virtualmente ilimitada, la comunicación con este servidor puede llegar a tener un límite y eventualmente impedir el crecimiento del sistema. Desafortunadamente el uso de un sólo servidor puede ser inevitable, ya que por lo general tenemos servicios que trabajan con información muy sensible y que tiene que ser lo más segura posible, por lo que el tener esta información almacenada en diferentes servidores puede llegar a poner la información en riesgo y hacer el sistema más vulnerable. De la misma manera, el almacenamiento centralizado de la información puede ser un grave problema para un sistema distribuido, ya que a pesar de que un sólo servidor nos puede ofrecer la capacidad de almacenamiento que necesitamos, es muy poco probable que dicho servidor permita el acceso simultáneo a miles o incluso millones de usuarios que desean consultar la información almacenada en él. Un ejemplo de esto es el Sistema de Nombre de Dominio, que a pasar de poder almacenar todos los registros en una sola base de datos de varios gigabytes, no podría dar una respuesta a los millones de usuarios de Internet que accedan este servicio simultáneamente. El uso de algoritmos centralizados es en teoría la solución óptima a un problema de computación distribuida, sin embargo, en la práctica podemos ver que el uso de este tipo de algoritmos en un sistema distribuido grande no es una buena idea, ya que colectar y transportar los datos de entrada y salida del sistema hacia un sólo punto en el que se computan dichos datos pudiese sobrecargar parte de la red con todos los mensajes que necesita enviar y recibir, además de que el computo de toda la información en una sola máquina tiene más riesgo a fallos y puede resultar más tardada. La solución a este problema es el uso de algoritmos descentralizados, los cuales cuentan con ciertas características que los diferencian de los algoritmos centralizados, entre las que podemos mencionar: Ninguna máquina tiene información completa del estado del sistema. Cada máquina toma decisiones propias basándose solamente en información local. Problemas o fallos de una máquina no arruinan el procesamiento de todo el algoritmo. Sistemas Distribuidos 12 Ing. Einar TURPO AROQUIPA No necesariamente se cuenta con un reloj global (algoritmos no sincronizados). A pesar de que en una LAN pudiese sincronizarse la ejecución de un algoritmo descentralizado, este mismo procedimiento pudiese ser muy complicado o incluso imposible si el algoritmo esta distribuido en una red más amplia, por lo que no se debe de depender en la existencia de un reloj global para hacer posible la ejecución de un algoritmo de este tipo. Por otro lado tenemos los problemas de la escalabilidad con respecto a la localización o área de implementación de un sistema distribuido. Una de las principales razones por las cuales resulta difícil escalar los sistemas distribuidos que existen actualmente, es que dichos sistemas fueron diseñados para trabajar redes de acceso locales (LANs) y que están basados en una comunicación síncrona. En este tipo de comunicación el cliente hace la solicitud de un servicio y hace un bloqueo de la comunicación hasta que recibe la respuesta. Este acercamiento por lo general trabaja bien en LANs en las que la comunicación entre dos máquinas por lo general no toma más de algunos cientos de microsegundos. En el caso de las WANs, tenemos que tomar en cuenta que la comunicación entre los procesos pudiese tomar varios cientos de milisegundos, lo que representa un alentamiento muy considerable del sistema. Otro problema a considerar es que la comunicación en una WAN es poco confiable y en la gran mayoría de los casos es punto a punto, al contrario de las redes locales que generalmente son muy confiables y permiten hacer difusiones o transmisiones de tipo “broadcast”, lo que hace mucho más fácil el desarrollo de sistemas distribuidos. La escalabilidad con respecto a la localización o área de implementación esta directamente relacionada con los problemas de soluciones centralizadas comentados anteriormente. Si tenemos un sistema con muchos componentes centralizados, es muy claro que la escalabilidad del área de implementación será imitada gracias a los problemas de desempeño y confiabilidad que trae consigo la implementación en un área de redes extensa. Además, los componentes centralizados también provocan el desperdicio de recursos de red. Finalmente, podemos mencionar los problemas que acarrea la escalabilidad de la administración de un sistema distribuido. Este problema se da cuando un sistema distribuido de expande a otro dominio, que por lo general contará con diferentes políticas de uso y pago de recursos, administración y seguridad. Por lo general cuando esto pasa se deben de tomar al menos dos tipos de medidas de seguridad: El sistema distribuido tiene que protegerse de ataques malignos provenientes del nuevo dominio, y restringir el acceso a los servicios y datos que no están a disponibilidad de los usuarios del mismo. Sistemas Distribuidos 13 Ing. Einar TURPO AROQUIPA El nuevo dominio tiene que protegerse de ataques malignos provenientes del sistema distribuido. Básicamente, el nuevo dominio no sabe que tipo de información puede esperar del código enviado por el nuevo dominio por lo que pudiera decidir limitar los permisos de acceso a dicho código. Técnicas de Escalabilidad Una vez que mencionamos ya los problemas de la escalabilidad, analizaremos algunas maneras de solucionar dichos problemas. Como los problemas de escalabilidad de los sistemas distribuidos se manifiestan como problemas de rendimiento causados por la capacidad limitada de servidores y de las redes de comunicaciones, existen solamente tres técnicas de escalabilidad: eliminar la latencia de las comunicaciones, distribución y replicación. Eliminar la latencia de las comunicaciones es útil en el caso de querer lograr la escalabilidad geográfica de un sistema, la idea básica es simple: tratar de evitar la espera de respuestas a las peticiones que se hagan a servicios remotos lo más que se pueda. Esencialmente, esto significa que se tiene que construir la aplicación que realiza las peticiones de tal manera que use solamente métodos de comunicación asíncronos, es decir, que el cliente envía la petición al servidor, mientras espera la respuesta el cliente aprovecha ese tiempo para realizar tareas locales más importantes y cuando recibe la respuesta del servidor, el proceso que se estaba realizando se interrumpe y se atiende la respuesta recibida. Esta solución parece fácil, sin embargo, hay muchas aplicaciones que no pueden hacer un uso efectivo de la comunicación asíncrona, por ejemplo, aplicaciones interactivas en las que el usuario no tiene nada mejor que hacer más que esperar la respuesta del servidor, por que esta se tiene que dar lo más rápido que sea posible. En dichos casos, es mucho mejor solucionar el problema de la latencia reduciendo el tráfico generado entre el cliente y el servidor cuando se comunican entre sí; esto lo podemos lograr moviendo parte de la computación que normalmente se hace del lado del servidor al cliente, para que así sea el mismo proceso que hace la solicitud del servicio quien tenga que procesarlo. Otra técnica importante para lograr la escalabilidad es la distribución, que consiste en tomar un elemento, separarlo en partes pequeñas y distribuir esas partes en todo el sistema. Un ejemplo de un sistema distribuido que hace uso de la distribución es el servicio de nombre de dominio (DNS), el cual esta distribuido en diferentes servidores que permiten el acceso a la misma información a todos los usuarios, sin necesidad de tener un sólo servidor que proporcione este servicio. En la mayoría de los casos, los problemas de escalabilidad los vemos reflejados en el rendimiento del sistema, por lo que generalmente la replicación de los componentes del sistema distribuido puede resultar ser una buena idea. La replicación aumenta la disponibilidad de los componentes del sistema y además ayuda a balancear la carga entre los componentes que se replican, con lo que se logra una mejora del rendimiento del sistema. Si consideramos un sistema que se encuentra distribuido en una red muy Sistemas Distribuidos 14 Ing. Einar TURPO AROQUIPA extensa, el hecho de tener una copia de algún componente más cerca, también mejora el rendimiento del sistema puesto que soluciona los problemas de latencia de las comunicaciones que ya mencionamos anteriormente. Una forma especial de replicación es el Cacheo, el cual consiste en guardar una copia de algún recurso (por lo general, de datos) de forma temporal en un lugar cercano al cliente, para que éste lo pueda acceder más fácilmente. En contraste con la replicación, el cachear un recurso es una decisión que es tomada por el cliente, y no por los diseñadotes del sistema. Un problema muy serio que puede traer el cacheo, es que las copias que se hacen del recurso (o de datos) pueden no actualizarse a su debido tiempo, por lo que al haber varias copias diferentes del mismo recurso, lo que provoca problemas de consistencia dentro del sistema; el nivel de inconsistencia que pueda ser tolerado por un sistema depende del uso que se le da a al recurso que se esta replicando, en el caso de páginas Web estáticas, por ejemplo, pudiese ser bastante tolerable, sin embargo, en el caso de páginas dinámicas o de sistemas en tiempo real, la replicación puede traer consigo muchos problemas. e) Tratamiento de Fallos: El fallo tanto del hardware como el software es algo prácticamente inevitable, y por más confiable que pueda parecer algún componente, siempre es importante estar preparado para cuando este falle. En un sistema centralizado por lo general el fallo de cualquier componente del sistema provoca que todos los servicios que este ofrece dejen de funcionar, en cambio, en un sistema distribuido, los fallos son parciales, puesto que solo afectan a los servicios que el componente que fallo este prestando, mientras que otros servicios que prestan otros componentes siguen funcionando. El tratamiento de fallos en un sistema distribuido es una tarea difícil, pero que se puede lograr si se utilizan las técnicas adecuadas, según el sistema que se desee proteger. Algunas de las técnicas más comunes son: Detección de Fallos: obviamente no es posible tratar un fallo si este no se ha detectado, sin embargo, la detección de un fallo dentro de un sistema distribuido puede no ser tan sencillo como parece, recordemos que además de componentes de hardware y software, los sistemas distribuidos operan gracias a la transmisión de mensajes, y el funcionamiento del sistema depende en gran parte de estas transmisiones de datos entre los diferentes componentes; un fallo en la transmisión de datos entre componentes no es fácil detectar, pero es algo que podemos esperar (dependiendo del medio por el que se haga la transmisión y otras condiciones) y al saber que existe la posibilidad de ese fallo, podemos monitorear y aplicar técnicas que aseguren que dicha transmisión siempre sea correcta. Enmascaramiento de Fallos: una vez que un fallo es detectado, es importante encontrar la manera para que un usuario del sistema no note dicho fallo y que pueda seguir utilizando el sistema de manera normal, esto es, ocultar los fallos Sistemas Distribuidos 15 Ing. Einar TURPO AROQUIPA del sistema y encargarse de que los servicios que se ofrecen al cliente nunca sean interrumpidos. Son muchos ejemplos del enmascaramiento de fallos, en el caso de un mensaje que se corrompió al ser enviado, una manera de ocultar el fallo es haciendo la solicitud de reenvío del mensaje, y de esta manera el usuario nunca notará que hubo un problema. Otro ejemplo lo dan las técnicas de redundancia que explicaremos más adelante, pero que básicamente consiste en tener disponibles varios elementos que puedan dar el mismo servicio y que en caso de que uno falle, otro este en la disponibilidad de realizar el trabajo en su lugar, esto puede darse cuando fallan componentes de un servidor (discos duros, tarjetas de red, etc.), o incluso cuando fallan las conexiones a la red o los sistemas de bases de datos. Tolerancia a Fallos: es importante saber cuando un sistema puede llegar a tener ciertos problemas sin que estos afecten de manera grave al usuario de los servicios proporcionados, para así, ignorar la ocurrencia de dichos fallos cuando la aplicación lo soporte, o bien, hacer saber al cliente que hay un problema en lugar de gastar tiempo y recursos innecesarios para corregirlo cuando probablemente el problema no se pueda arreglar rápido y el cliente termine por abortar el proceso; Pretender arreglar de manera inmediata todos los problemas que puedan surgir en un sistema puede resultar incluso dañino para el mismo sistema, puesto que hay problemas que mientras son arreglados pueden afectar el rendimiento de otros componentes del sistema que sí están trabajando. Recuperación Frente a Fallos: Una vez que fue detectado un fallo y que se ha decidido arreglarlo, hay que encontrar la mejor manera de hacerlo, y además, de recuperar el estado del sistema antes de que ocurriera el fallo; esto requiere del software adecuado para poder reconstruir o bien retractar los cambios que no fueron completados al momento en que fue interrumpido el sistema, un ejemplo de esto lo podemos ver en los sistemas manejadores de bases de datos, que se sirven de una bitácora de las transacciones que se realizan y de acuerdo a esta bitácora se decide reconstruir o retractar las transacciones hechas sobre la base de datos antes de que se interrumpiera el funcionamiento de la misma. Redundancia: un sistema distribuido puede lograr ser tolerante a fallos gracias a la utilización de componentes redundantes dentro del sistema. La redundancia se logra con la replicación de dichos componentes y con la habilidad del sistema de recurrir a los componentes de respaldo en caso de que el componente de uso primario falle, todo esto por supuesto, sin que el usuario se percate de lo que esta sucediendo. La redundancia se puede dar en muchas partes del sistema: componentes internos de los servidores, servidores de aplicaciones, de Web, de archivos, de correo o de bases de datos, sistemas de almacenamiento, conexiones a la red de comunicación, etc. Es muy importante tomar en cuenta que todos los componentes que estén replicados en el sistema deben mantenerse actualizados para evitar problemas de consistencia, y además, la actualización de la información entre dichos componentes no debe de tener un efecto significativo para las necesidades de transmisión de datos del sistema. Sistemas Distribuidos 16 Ing. Einar TURPO AROQUIPA Las técnicas antes mencionadas no son las únicas, pero si las más utilizadas, estas técnicas deben de proporcionar las herramientas necesarias para aumentar el grado de disponibilidad de cualquier sistema distribuido, ya que al saber como tratar un fallo del sistema, también es posible encontrar la manera de reconfigurar el sistema para que los servicios que este proporciona no sean interrumpidos, o que en el peor de los casos sólo sean afectados los servicios proporcionados por los componentes afectados. f) Concurrencia: El control de concurrencia trata con los problemas de aislamiento y consistencia del procesamiento de transacciones. El control de concurrencia de un sistema distribuido asegura que la consistencia de los datos que se almacenan y que se procesan en el sistema se mantienen en un ambiente distribuido multiusuario. Si las transacciones son internamente consistentes, la manera más simple de lograr este objetivo es ejecutar cada transacción sola, una después de otra. Sin embargo, esto puede afectar mucho el desempeño de un sistema distribuido dado que el nivel de concurrencia se reduce al mínimo. El nivel de concurrencia, es decir, el número de transacciones simultáneas activas, es probablemente el parámetro más importante en sistemas distribuidos. Por lo tanto, los mecanismos de control de concurrencia buscan encontrar un balance entre el mantenimiento de la consistencia de los datos y el mantenimiento de un alto nivel de concurrencia. Si no se hace un adecuado control de concurrencia, se pueden presentar dos anomalías. En primer lugar, se pueden perder actualizaciones provocando que los efectos de algunas transacciones no se reflejen en los datos almacenados. En segundo término, pueden presentarse recuperaciones de información inconsistentes. Las técnicas que se utilizan para asegurar un control de concurrencia de un sistema distribuido, como hilos, semáforos, candados, etc., se discutirán más adelante, en la parte de análisis de la arquitectura de clienteservidor. g) Transparencia: Se dice que un sistema distribuido es transparente, cuando este es capaz de presentarse ante los usuarios y las aplicaciones como si fuese un sistema que corre en una sola computadora, y no como un sistema cuyos procesos y recursos están distribuidos físicamente en varias computadoras. Tipos de Transparencia: Según el Manual de Referencia ANSA y el Modelo de Referencia para el Procesamiento Distribuido Abierto de la Organización Internacional de Estándares (ISO 1995), el concepto de transparencia de puede aplicar a 8 aspectos diferentes de un sistema distribuido: o Transparencia de Acceso: oculta las diferencias entre la representación de los datos y la manera en que los recursos son accedidos. Sistemas Distribuidos 17 Ing. Einar TURPO AROQUIPA o Transparencia de Ubicación: oculta la localización de los recursos y permite el acceso a los mismos sin la necesidad de conocer su localización. o Transparencia de Migración: oculta que un recurso o un cliente del sistema sea reubicado, lo que permite hacer dichas reubicaciones sin afectar la operación de los usuarios y los servicios. o Transparencia de Recolocación: oculta que un recurso o un cliente del sistema pueda moverse a una ubicación diferente mientras están en uso. o Transparencia de Replicación: oculta la existencia de múltiples ejemplares del mismo recurso. o Transparencia de Concurrencia: oculta que un recurso sea compartido por varios usuarios sin interferir entre ellos mismos. o Transparencia Frente a Fallos: oculta el fallo y recuperación de un recurso dentro del sistema, dejando que los usuarios terminen sus tareas a pesar de los fallos de hardware o software que pudieran presentarse. o Transparencia de Persistencia: oculta si un recurso (de software) esta almacenado en memoria o en disco. Desde el punto de vista de los usuarios, la transparencia se logra cuando: o Sus pedidos se satisfacen con ejecuciones en paralelo en distintas máquinas. o Se utilizan una variedad de servidores de archivos. o El usuario no necesita saberlo ni notarlo. La transparencia desde el punto de vista de los programas significa diseñar la interfaz de llamadas al sistema de modo que no sea visible la existencia de varios procesadores. No es transparente un sistema donde el acceso a los archivos remotos se realice mediante: El establecimiento explícito de una conexión en la red con un servidor remoto. El envío posterior de mensajes, donde el acceso a los servicios remotos será distinto al acceso a los servicios locales. Con todo esto en mente es posible diseñar un sistema que cuente con las características necesarias para lograr la transparencia en tantos aspectos como sea posible. Los dos más importantes son la transparencia de acceso y la transparencia de ubicación, la primera se relaciona con la forma en que representamos los datos en un sistema distribuido, es importante presentar al usuario o a los programadores el acceso indistinto a recursos locales o remotos, sin que este se de cuenta de la ubicación de los mismos, lo que al mismo tiempo nos conduce a tener transparencia de ubicación dentro del sistema. Sistemas Distribuidos 18 Ing. Einar TURPO AROQUIPA Como no se sabe donde están localizados los recursos, tampoco se debe de saber si estos se mueven a una nueva ubicación, se este o no utilizando el sistema, esto es lo que se conoce como transparencia de Migración y Recolocación respectivamente. Ejemplos de transparencia de acceso, ubicación y migración es el sistema de nombre de dominio utilizado por los usuarios de Internet, estos utilizan un nombre de dominio como “dominio.com” para acceder este sitio, sin importar en donde este localizado el sitio de Internet, el usuario podrá acceder al servidor en el que se este hospedando la página, y si se decide mover este sitio a otro servidor, basta con redireccionar al cliente al servidor adecuado, sin que el cliente lo note. Por su lado, si el cliente esta accediendo al sitio desde una conexión inalámbrica dentro de su lugar de trabajo y esta en movimiento, es posible seguir proporcionando servicios sin interrupciones al cliente siempre y cuando el sistema sea transparente a la recolocación y permita que el cliente siga conectado a pesar de cambiar su ubicación física. Por otro lado, la replicación juega un papel muy importante dentro de un sistema distribuido, en el caso de los nombre de domino, los servidores DNS trabajan en un sistema de replicación distribuida organizado jerárquicamente que hace posible el acceso simultáneo a millones de usuarios que requieren de la información que contiene esta base de datos, sin embargo, la transparencia de la replicación en el sistema consiste en esconder que existen varias copias de un mismo recurso, y por lo general implica que dentro del mismo sistema se cuenta con transparencia de ubicación, puesto que de otra manera sería imposible acceder a las copias de los recursos con que se cuenta. La idea de un sistema distribuido es poder proporcionar a sus usuarios un servicio simultáneo a un mismo recurso; es entonces muy común que varios usuarios intenten hacer uso del mismo recurso al mismo tiempo y que traten de competir por el uso de dicho recurso; en estos casos la transparencia de concurrencia nos ayuda a ocultar al usuario que además de él, hay otros usando o intentando usar el mismo recurso. El reto más interesante de esta parte del diseño de un sistema distribuido es que también se tiene que considerar la consistencia de los datos que se almacenarán en el sistema, por lo que habrá que tomar decisiones en cuanto a las técnicas de candados y de uso de semáforos a utilizarse para lograr tener un sistema concurrente y a su vez consistente. La transparencia frente a fallos consiste en esconder cualquier falla que ocurra en el sistema para que el usuario pueda hacer uso del mismo a pesar de que alguno de sus componentes no este trabajando como es debido, uno de los retos más desafiantes de esta tarea es saber distinguir entre recursos que están fallando y recursos que simplemente están siendo accedidos por muchos usuarios y cuya respuesta puede alentarse. Es importante tener un buen esquema de replicación y de balanceo de cargas para evitar estas situaciones, pero al ser prácticamente inevitables es necesario considerar que hacer cuando el sistema esta en una situación como la antes mencionada, y Sistemas Distribuidos 19 Ing. Einar TURPO AROQUIPA sobre todo determinar que tipo de respuesta enviar al cliente para que este no se de cuenta de las fallas del sistema. Grado de Transparencia: A pesar de que la transparencia es una característica generalmente deseable para cualquier sistema distribuido, hay situaciones en las que el pretender enmascarar todos los aspectos relacionados con la distribución de los componentes del sistema puede no ser lo más óptimo; en algunas ocasiones es mejor hacer del conocimiento del usuario que el sistema esta compuesto por varios elementos y que por más óptima que sea la transmisión de mensajes o la distribución y replicación de componentes, habrá cierto tiempo de respuesta mínimo entre cada transacción que es imposible evitar. Hay también una relación directa entre el nivel de transparencia y el rendimiento de un sistema distribuido, por lo que lo ideal es encontrar un bien equilibrio entre ambos factores. Por ejemplo, si pretendemos garantizar la transparencia de replicación en un sistema, es necesario que el usuario sepa que para garantizar la consistencia de la información es necesario actualizar todos los componentes replicados cuando se hace un cambio, por lo que el acceso al sistema puede verse interrumpido por algunos segundos mientras esta operación se lleva a cabo. Es muy importante considerar la transparencia como uno de los principales objetivos del diseño e implementación de un sistema distribuido, sin embargo, es importante tener en consideración otros factores que pueden ser afectados por la transparencia, principalmente el desempeño general del sistema. 1.2. Ventajas y Factores de Distribución: En general, los sistemas distribuidos exhiben algunas ventajas sobre los sistemas centralizados que se describen enseguida. a) Factores Estratégicos: Hoy en día, los clientes, proveedores y compañías se encuentran generalmente en diferentes localidades alejados los unos de los otros. Debido a que todos estos utilizan computadoras, las redes de información que los unen y que les permiten interactuar pueden ofrecer a las empresas mayor competitividad. b) Costos de Equipo: El cociente precio/desempeño de la suma del poder de los procesadores separados, contra el poder de uno solo centralizado, es mejor cuando están distribuidos, esto lo podemos calcular con base al costo promedio de MIPs (Millones de Instrucciones por Segundo), el cual es mucho mayor en Sistemas Distribuidos 20 Ing. Einar TURPO AROQUIPA mainframes que en un número fijo de estaciones de trabajo. Sin embargo, cabe mencionar que los mainframes soportan cientos de dispositivos y permiten que miles de clientes compartan los mismos recursos computacionales del mismo, aunque la diferencia en costos es enorme. c) Conocimiento y control de los usuarios: La gran mayoría de los usuarios de los servicios computacionales son cada vez más cultos y competentes por lo que dichos usuarios desean operar sus propios sistemas, a su manera, por lo que no están contentos con los sistemas centralizados que llevan el control sobre los sistemas que son desarrollados, cuándo, cómo y por quiénes son operados. La computación distribuida ofrece a los usuarios estar más cerca de los procesos y de los datos. d) Costos de Desarrollo: Cuando se trabaja con un sistema distribuido que cuenta con diferentes módulos de software que pueden integrase como parte de un solo sistema, los usuarios finales interesados en desarrollar sus propias aplicaciones pueden hacerlo utilizando sus propias máquinas, lo que trae como consecuencia la reducción del costo y tiempo de desarrollo de una nueva aplicación. e) Interfaces de Usuarios: La mayoría de las estaciones de trabajo que se utilizan hoy en día soportan el uso de interfaces gráficas sofisticadas con dispositivos de señalamiento y sistemas de audio y video; esta tecnología resulta ser muy atractiva especialmente para usuarios con diferentes estilos de aprendizaje que por lo general se decepcionan por los tradicionales repotes o interfaces presentadas en formato de texto o con gráficos de poca calidad. f) Flexibilidad y Facilidad de Configuración: Los sistemas distribuidos, y en general la computación descentralizada, ofrece muchas opciones para mejorar el desempeño y la fiabilidad de un sistema mediante el uso de procesos y datos redundantes. g) Explotación del Hardware: Las estaciones de trabajo y computadoras personales permiten el desarrollo de software especializado que hace uso de las características específicas del hardware de la estación de trabajo, cada una de estas estaciones puede ser Sistemas Distribuidos 21 Ing. Einar TURPO AROQUIPA utilizada como un servidor especializado (por ejemplo, de correos, de Web, de archivos, de bases de datos, etc.) y estos servidores con los que satisfacen las peticiones de clientes que desean hacer uso de los servicios con los que cuenta dicho servidor. A esta configuración se le conoce comúnmente como configuración “cliente-servidor” y se explicará a detalle más adelante. h) Nuevas aplicaciones: Muchas aplicaciones nuevas de tiempo real requieren ser procesadas y acceder datos de manera local, lo cual es posible solamente si se utiliza un sistema distribuido con estaciones de trabajo distribuidos en los lugares que más se requiera. i) Crecimiento: El poder total del sistema puede irse incrementando al añadir pequeños sistemas, lo cual es mucho más difícil en un sistema centralizado y caro. Por otro lado, los sistemas distribuidos también exhiben algunas ventajas sobre sistemas aislados. Estas ventajas son: Compartir datos: un sistema distribuido permite compartir datos más fácilmente que los sistemas aislados, que tendrían que duplicarlos en cada nodo para lograrlo. Compartir dispositivos: un sistema distribuido permite acceder dispositivos desde cualquier nodo en forma transparente, lo cual es imposible con los sistemas aislados. El sistema distribuido logra un efecto sinergético. Comunicaciones: la comunicación persona a persona es factible en los sistemas distribuidos, en los sistemas aislados no. Flexibilidad: La distribución de las cargas de trabajo es factible en el sistema distribuido, se puede incrementar el poder de cómputo. 1.3. Desventajas y Factores a Considerar: Así como los sistemas distribuidos exhiben grandes ventajas, también se pueden identificar algunas desventajas, algunas de ellas tan serias que han frenado la producción comercial de sistemas distribuidos en la actualidad. Sistemas Distribuidos 22 Ing. Einar TURPO AROQUIPA a) Falta de Estándares: La falta de estándares y herramientas de desarrollo para ambientes distribuidos pueden crear graves problemas de compatibilidad, portabilidad e interconectividad en los sistemas distribuidos. Esto se da cuanto se crean muchas copias incompatibles de la misma aplicación. El desarrollo y uso de estándares para aplicaciones, computadoras y redes son desarrolladas en lugares, por personas y en tiempos diferentes, lo cual resulta muy complicado, y es por eso que es común ver este tipo de problemas en un sistema distribuido. b) Complejidad del Diseño: Los grandes sistemas de computadoras pueden distribuirse en muchas computadoras, sin embargo, separar el sistema en muchas partes y decidir en que lugar van a residir dichas partes, no es una tarea trivial. Los problemas de compartir datos y recursos son tan complejos que los mecanismos de solución generan mucha sobrecarga al sistema haciéndolo ineficiente. El verificar, por ejemplo, quiénes tienen acceso a algunos recursos y quiénes no, el aplicar los mecanismos de protección y registro de permisos consume demasiados recursos. En la actualidad, las soluciones para estos problemas son incipientes. c) Falta de Infraestructura en Soporte y Administración: Hasta ahora muchos de los problemas de administración y soporte que demanda un sistema distribuido no han sido solucionados, y las soluciones que existen para algunos otros problemas son limitadas. Algunos ejemplos de estos problemas son la planeación de sistemas de información de acuerdo a la cambiante tecnología que hay hoy en día, el manejo de recursos distribuidos y el diseño de la estructura organizacional para la computación distribuida. d) Seguridad e Integridad: La distribución de datos y de programas en múltiples localidades pueden crear muchos problemas de seguridad e integridad que no con fáciles de solucionar y que por lo general requieren también de un proceso paralelo que ayude a solucionar dichos problemas, por lo que la carga del sistema aumenta y el rendimiento en general puede verse afectado. e) Opciones: La disponibilidad de muchas opciones y decisiones puede ser tanto buena, como mala. En ocasiones tener muchas opciones nos quita tiempo, puesto Sistemas Distribuidos 23 Ing. Einar TURPO AROQUIPA que tenemos que analizar, entender y probar todas las que están disponibles antes de llegar a tomar una decisión cobre cual es la mejor. Por el lado contrario, el tener muchas opciones nos permite diseñar un sistema que este conformado. 2. Arquitectura Cliente Servidor 1.1. Fundamentos de Arquitectura Cliente Servidor Definiciones Básicas Para entender el concepto de la arquitectura de cliente servidor, antes es necesario conocer algunas definiciones. Entre las principales definiciones se tiene: a) Desde un punto de vista conceptual: Es un modelo para construir sistemas de información, que se sustenta en la idea de repartir el tratamiento de la información y los datos por todo el sistema informático, permitiendo mejorar el rendimiento del sistema global de Información b) En términos de arquitectura: Los distintos aspectos que caracterizan a una aplicación (proceso, almacenamiento, control y operaciones de entrada y salida de datos) en el sentido más amplio, están situados en más de un computador, los cuales se encuentran interconectados mediante una red de comunicaciones. c) IBM define al modelo Cliente/Servidor Es la tecnología que proporciona al usuario final el acceso transparente a las aplicaciones, datos, servicios de cómputo o cualquier otro recurso del grupo de trabajo y/o, a través de la organización, en múltiples plataformas. El modelo soporta un medio ambiente distribuido en el cual los requerimientos de servicio hechos por estaciones de trabajo inteligentes o "clientes'', resultan en un trabajo realizado por otros computadores llamados servidores. Para entender mejor las definiciones antes mencionadas, analizaremos ahora algunos de los conceptos mencionados en dichas definiciones: Un Cliente es el que inicia un requerimiento de servicio. El requerimiento inicial puede convertirse en múltiples requerimientos de trabajo a través de redes LAN o WAN. La ubicación de los datos o de las aplicaciones es totalmente transparente para el cliente. Un Servidor es cualquier recurso de cómputo dedicado a responder a los requerimientos del cliente. Los servidores pueden estar conectados a los clientes Sistemas Distribuidos 24 Ing. Einar TURPO AROQUIPA a través de redes LANs o WANs, para proveer de múltiples servicios a los clientes tales como impresión, acceso a bases de datos, fax, procesamiento de imágenes, etc. Es importante mencionar que un servidor no es necesariamente un dispositivo físico (una computadora) sino que hay que entender al servidor como un proceso que se encarga de atender las peticiones de un cliente. Con estos elementos podemos ya darnos una idea de lo que es el modelo cliente servidor, sin embargo, es necesario analizar más a fondo las características de la arquitectura si queremos llegar a entender por completo el funcionamiento de la misma. Elementos de la Arquitectura Cliente/Servidor Una arquitectura es un entramado de componentes funcionales que aprovechando diferentes estándares, convenciones, reglas y procesos, permite integrar una amplia gama de productos y servicios informáticos, de manera que pueden ser utilizados eficazmente dentro de la organización. Debemos señalar que para seleccionar el modelo de una arquitectura, hay que partir del contexto tecnológico y organizativo del momento y, que la arquitectura Cliente/Servidor requiere una determinada especialización de cada uno de los diferentes componentes que la integran. En esta aproximación, y con el objetivo de definir y delimitar el modelo de referencia de una arquitectura Cliente/Servidor, debemos identificar los componentes que permitan articular dicha arquitectura, considerando que toda aplicación de un sistema de información está caracterizada por tres componentes básicos: o Presentación/Captación de Información o Procesos o Almacenamiento de la Información Y se integran en una arquitectura Cliente/Servidor en base a los elementos que caracterizan dicha arquitectura, es decir: o Puestos de Trabajo o Comunicaciones o Servidores De estos elementos debemos destacar: El Puesto de Trabajo o Cliente “Una Estación de trabajo o microcomputador (PC: Computador Personal) conectado a una red, que le permite acceder y gestionar una serie de recursos”, el cual se perfila como un puesto de trabajo universal. Nos referimos a un microcomputador conectado al sistema de información y en el que se realiza una parte mayoritaria de los procesos. Sistemas Distribuidos 25 Ing. Einar TURPO AROQUIPA Se trata de un fenómeno en el sector informático. Aquellos responsables informáticos que se oponen a la utilización de los terminales no programables, acaban siendo marginados por la presión de los usuarios. Debemos destacar que el puesto de trabajo basado en un microcomputador conectado a una red, favorece la flexibilidad y el dinamismo en las organizaciones. Entre otras razones, porque permite modificar la ubicación de los puestos de trabajo, dadas las ventajas de la red. Los Servidores o Back-End. “Una máquina que suministra una serie de servicios como Bases de Datos, Archivos, Comunicaciones,...)”. Los Servidores, según la especialización y los requerimientos de los servicios que debe suministrar pueden ser: o Mainframes o Minicomputadoras o Especializados (dispositivos de red, imagen, etc.) Una característica a considerar es que los diferentes servicios, según el caso, pueden ser suministrados por un único Servidor o por varios Servidores especializados. Las Comunicaciones en sus dos vertientes: Infraestructura de redes: Componentes Hardware y Software que garantizan la conexión física y la transferencia de datos entre los distintos equipos de la red. Infraestructura de comunicaciones: Componentes Hardware y Software que permiten la comunicación y su gestión, entre los clientes y los servidores. La arquitectura Cliente/Servidor es el resultado de la integración de dos culturas. Por un lado, la del Mainframe que aporta capacidad de almacenamiento, integridad y acceso a la información y, por el otro, la del computador que aporta facilidad de uso (cultura de PC), bajo costo, presentación atractiva (aspecto lúdico) y una amplia oferta en productos y aplicaciones. Características del modelo Cliente/Servidor En el modelo Cliente/Servidor podemos encontrar las siguientes características: a) El Cliente y el Servidor pueden actuar como una sola entidad y también pueden actuar como entidades separadas, realizando actividades o tareas independientes. b) Las funciones de Cliente y Servidor pueden estar en plataformas separadas, o en la misma plataforma. c) Un servidor proporciona servicio a múltiples clientes en forma concurrente. Sistemas Distribuidos 26 Ing. Einar TURPO AROQUIPA d) Cada plataforma puede ser escalable independientemente. Los cambios realizados en las plataformas de los Clientes o de los Servidores, ya sean por actualización o por reemplazo tecnológico, se realizan de una manera transparente para el usuario final. e) La interrelación entre el hardware y el software están basados en una infraestructura poderosa, de tal forma que el acceso a los recursos de la red no muestra la complejidad de los diferentes tipos de formatos de datos y de los protocolos. Un sistema de servidores realiza múltiples funciones al mismo tiempo que presenta una imagen de un sólo sistema a las estaciones Clientes. Esto se logra combinando los recursos de cómputo que se encuentran físicamente separados en un sistema lógico, proporcionando de esta manera el servicio más efectivo para el usuario final. También es importante hacer notar que las funciones Cliente/Servidor pueden ser dinámicas. Ejemplo, un servidor puede convertirse en cliente cuando realiza la solicitud de servicios a otras plataformas dentro de la red. Tiene capacidad para permitir integrar los equipos ya existentes en una organización, dentro de una arquitectura informática descentralizada y heterogénea. f) Además se constituye como el nexo de unión más adecuado para reconciliar los sistemas de información basados en mainframes o minicomputadoras, con aquellos otros sustentados en entornos informáticos pequeños y estaciones de trabajo. g) Designa un modelo de construcción de sistemas informáticos de carácter distribuido. h) Su representación típica es un centro de trabajo (PC), en donde el usuario dispone de sus propias aplicaciones de oficina y sus propias bases de datos, sin dependencia directa del sistema central de información de la organización, al tiempo que puede acceder a los recursos de este host central y otros sistemas de la organización ponen a su servicio. En consecuencia, parte del control de las aplicaciones se transfieren del computador central (servidor) a los PCs o estaciones de trabajo (clientes), adquiriendo estas plataformas, entonces, un papel protagonista en conjunto del sistema de información. En conclusión, Cliente/Servidor puede incluir múltiples plataformas, bases de datos, redes y sistemas operativos. Estos pueden ser de distintos proveedores, en arquitecturas propietarias y no propietarias y funcionando todos al mismo tiempo. Por lo tanto, su implantación involucra diferentes tipos de estándares: APPC, TCP/IP, OSI, NFS, DRDA corriendo sobre DOS, OS/2, Windows o PC UNIX, en Token-Ring, Ethernet, FDDI o medio coaxial, sólo por mencionar algunas de las posibilidades. Dependiendo de estas características y de su combinación, es el grado de complejidad de una solución C/S. Sistemas Distribuidos 27 Ing. Einar TURPO AROQUIPA Ventajas y Desventajas del modelo Cliente/Servidor El esquema Cliente/Servidor posee las siguientes ventajas: a) Uno de los aspectos que más ha promovido el uso de sistemas Cliente/Servidor, es la existencia de plataformas de hardware cada vez más baratas. Esta constituye a su vez una de las más palpables ventajas de este esquema, la posibilidad de utilizar máquinas considerablemente más baratas que las requeridas por una solución centralizada, basada en sistemas grandes. Además, se pueden utilizar componentes, tanto de hardware como de software, de varios fabricantes, lo cual contribuye considerablemente a la reducción de costos y favorece la flexibilidad en la implantación y actualización de soluciones. b) El esquema Cliente/Servidor facilita la integración entre sistemas diferentes y comparte información permitiendo, por ejemplo que las máquinas ya existentes puedan ser utilizadas pero con interfaces más amigables al usuario. De esta manera, podemos integrar PCs con sistemas medianos y grandes, sin necesidad de que todos tengan que utilizar el mismo sistema operacional. c) Al favorecer el uso de interfaces gráficas interactivas, los sistemas construidos bajo este esquema tienen mayor interacción más intuitiva con el usuario. El uso de interfaces gráficas para el usuario, el esquema Cliente/Servidor presenta la ventaja, con respecto a uno centralizado, de que no es siempre necesario transmitir información gráfica por la red pues esta puede residir en el cliente, lo cual permite aprovechar mejor el ancho de banda de la red. d) Una ventaja adicional del uso del esquema Cliente/Servidor es que es más rápido el mantenimiento y el desarrollo de aplicaciones, pues se pueden emplear las herramientas existentes (por ejemplo los servidores de SQL o las herramientas de más bajo nivel como los sockets o el RPC). e) La estructura inherentemente modular facilita además la integración de nuevas tecnologías y el crecimiento de la infraestructura computacional, favoreciendo así la escalabilidad de las soluciones. f) El esquema Cliente/Servidor contribuye además, a proporcionar, a los diferentes departamentos de una organización, soluciones locales, pero permitiendo la integración de la información relevante a nivel global. El esquema Cliente/Servidor tiene algunos inconvenientes que se mencionan a continuación: a) Tiene escasas herramientas para la administración y ajuste del desempeño de los sistemas. Sistemas Distribuidos 28 Ing. Einar TURPO AROQUIPA b) En el desarrollo de aplicaciones Cliente/Servidor se deben considerar los aspectos, que se mencionan a continuación: o Los clientes y los servidores deberán utilizar el mismo mecanismo (por ejemplo sockets o RPC), lo cual implica que se deben tener mecanismos generales que existan en diferentes plataformas. o Además, hay que tener estrategias pare el manejo de errores y para mantener la consistencia de los datos. La seguridad de un esquema Cliente/Servidor es muy importante. Por ejemplo, se deben hacer verificaciones en el cliente y en el servidor. También se puede recurrir a otras técnicas como el encripción. o El desempeño. Problemas de este estilo pueden presentarse por congestión en la red, dificultad de tráfico de datos, etc. o Un aspecto directamente relacionado con lo anterior es el de cómo distribuir los datos en la red. En el caso de una organización, por ejemplo, éste puede ser hecho por departamentos, geográficamente, o de otras maneras. Hay que tener en cuenta que en algunos casos, por razones de confiabilidad o eficiencia, se pueden tener datos replicados, y que puede haber actualizaciones simultáneas. o A otro nivel, una de las decisiones que deben tomar las organizaciones es la de si comprar o desarrollar los diferentes componentes. Servicios basados en Cliente/Servidor IBM ha orientado sus esfuerzos de desarrollo de productos ha satisfacer los siguientes servicios: a) Servicios de Datos e Impresión: Servicios que permiten compartir archivos, bases de datos, impresoras y graficadores (plotters). Administración de las colas de impresión en diferentes dispositivos. b) Servicios de Comunicaciones: Aseguran que cada componente físico de la red sea capaz de comunicarse exitosamente con otros componentes, tales como LAN a LAN y LAN a WAN. El sistema puede incluir dispositivos de comunicaciones que manejen diferentes tipos de protocolos para conectar sistemas heterogéneos. c) Servicio de Administración: Administración de Sistemas involucra administración de cambios, de problemas, operaciones, configuración y rendimiento. Administración de Cambios: es definida como las actividades involucradas en la planeación, programación, distribución, instalación y registro de hardware y software en una red distribuida. Sistemas Distribuidos 29 Ing. Einar TURPO AROQUIPA Administración de Problemas: involucra la determinación de los mismos, la identificación de su origen en una red y su solución. Administración de Operaciones: es definida como la administración del uso de los sistemas y de los recursos para soportar la carga de trabajo de la organización, la cual incluye operaciones automatizadas y remotas. Administración de Configuración: es el manejo de las relaciones lógicas y físicas entre los recursos de la red. Administración del Rendimiento: es un conjunto de actividades tales como la recopilación de datos de desempeño, afinamiento, distribución de carga de trabajo y el planeamiento de la capacidad para las redes distribuidas. Administración de Sistemas: también incluye servicios de respaldo, recuperación de datos, seguridad de recursos de cómputo y distribución y mantenimiento de software. d) Servicios de Aplicación: Si el recurso compartido es una parte de una aplicación (una función de la aplicación), estamos hablando de servicios de aplicación. Cada uno de los procesadores participantes en un ambiente Cliente/Servidor puede mantener parte del código de la aplicación, el cual debe ser compartido por todos ellos (interoperabilidad). Esto significa que las partes de una aplicación pueden ser distribuidas en varios procesadores, locales o remotos. El diseño de las funciones de la aplicación no debe estar ligado a un computador, lo que permite transportar la aplicación de un procesador a otro, sin modificaciones (portabilidad). Una ventaja derivada de esto, es que la aplicación puede estar óptimamente ubicada dentro de una red en base a las necesidades: de recursos de cómputo y de la organización. Sistemas Distribuidos 30 Ing. Einar TURPO AROQUIPA Programación por capas La programación por capas es un estilo de programación en el que el objetivo primordial es la separación de la lógica de negocios de la lógica de diseño; un ejemplo básico de esto consiste en separar la capa de datos de la capa de presentación al usuario. La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en caso de que sobrevenga algún cambio, sólo se ataca al nivel requerido sin tener que revisar entre código mezclado. Un buen ejemplo de este método de programación sería el modelo de interconexión de sistemas abiertos. Además, permite distribuir el trabajo de creación de una aplicación por niveles; de este modo, cada grupo de trabajo está totalmente abstraído del resto de niveles, de forma que basta con conocer la API que existe entre niveles. En el diseño de sistemas informáticos actual se suele usar las arquitecturas multinivel o Programación por capas. En dichas arquitecturas a cada nivel se le confía una misión simple, lo que permite el diseño de arquitecturas escalables (que pueden ampliarse con facilidad en caso de que las necesidades aumenten). El diseño más utilizado actualmente es el diseño en tres niveles (o en tres capas). Capas y niveles a) Capa de presentación: es la que ve el usuario (también se la denomina "capa de usuario"), presenta el sistema al usuario, le comunica la información y captura la información del usuario en un mínimo de proceso (realiza un filtrado previo para comprobar que no hay errores de formato). Esta capa se comunica únicamente con la capa de negocio. También es conocida como interfaz gráfica y debe tener la característica de ser "amigable" (entendible y fácil de usar) para el usuario. b) Capa de negocio: es donde residen los programas que se ejecutan, se reciben las peticiones del usuario y se envían las respuestas tras el proceso. Se denomina capa de negocio (e incluso de lógica del negocio) porque es aquí Sistemas Distribuidos 31 Ing. Einar TURPO AROQUIPA donde se establecen todas las reglas que deben cumplirse. Esta capa se comunica con la capa de presentación, para recibir las solicitudes y presentar los resultados, y con la capa de datos, para solicitar al gestor de base de datos para almacenar o recuperar datos de él. También se consideran aquí los programas de aplicación. c) Capa de datos: es donde residen los datos y es la encargada de acceder a los mismos. Está formada por uno o más gestores de bases de datos que realizan todo el almacenamiento de datos, reciben solicitudes de almacenamiento o recuperación de información desde la capa de negocio. Todas estas capas pueden residir en un único ordenador, si bien lo más usual es que haya una multitud de ordenadores en donde reside la capa de presentación (son los clientes de la arquitectura cliente/servidor). Las capas de negocio y de datos pueden residir en el mismo ordenador, y si el crecimiento de las necesidades lo aconseja se pueden separar en dos o más ordenadores. Así, si el tamaño o complejidad de la base de datos aumenta, se puede separar en varios ordenadores los cuales recibirán las peticiones del ordenador en que resida la capa de negocio. Si, por el contrario, fuese la complejidad en la capa de negocio lo que obligase a la separación, esta capa de negocio podría residir en uno o más ordenadores que realizarían solicitudes a una única base de datos. En sistemas muy complejos se llega a tener una serie de ordenadores sobre los cuales corre la capa de negocio, y otra serie de ordenadores sobre los cuales corre la base de datos. En una arquitectura de tres niveles, los términos "capas" y "niveles" no significan lo mismo ni son similares. El término "capa" hace referencia a la forma como una solución es segmentada desde el punto de vista lógico: Presentación/ Lógica de Negocio/ Datos. En cambio, el término "nivel" corresponde a la forma en que las capas lógicas se encuentran distribuidas de forma física. Por ejemplo: o Una solución de tres capas (presentación, lógica del negocio, datos) que residen en un solo ordenador (Presentación+lógica+datos). Se dice que la arquitectura de la solución es de tres capas y un nivel. o Una solución de tres capas (presentación, lógica del negocio, datos) que residen en dos ordenadores (presentación+lógica, lógica+datos). Se dice que la arquitectura de la solución es de tres capas y dos niveles. Sistemas Distribuidos 32 Ing. Einar TURPO AROQUIPA