Get Firefox

Firefox 3.5

stopsoftwarepatents.eu petition banner Manifiesto por la liberación de la cultura 
No a la traza privada
Últimos cambios
Últimos Cambios
Vote for Public Maps - Reject INSPIRE! Geocaching
Mi estado actual en Jabber/XMPP: - jabberES - jabber.org

Última Actualización: 10 de Septiembre de 2003 - Miércoles

La fase 3 del proyecto ESNET consiste en:


Perspectiva histórica

Desde que se desarrollaron los primero bocetos de un sistema de base de datos distribuída hasta hoy han ocurrido muchas cosas, la mayoría de ellas buenas:

Lo PositivoLo Negativo

  • Los esquemas propuestos se desplegaron y han funcionado perfectamente durante casi dos años.

  • Algunas de las razones para fundar ESNET y su Base de Datos Distribuída, tal y como se define en el Libro Blanco de IRC ESNET, desaparecieron en las navidades 1.998-1999 con la salida de Arrakis de IRC-Hispano.

  • La tecnología ESNET ha sido adoptada también por IRC-Hispano.

  • El sistema de Base de Datos Distribuída está siendo desarrollada también con recursos humanos y materiales de IRC-Hispano.

  • Los desarrollos se reutilizan entre IRC-Hispano y ESNET, no sólo en el ámbito del servidor de IRC, sino también en aspectos adicionales, como Argobot u Olimpo.

  • Las nuevas necesidades derivadas de una red tan importante como IRC-Hispano impulsan nuevas investigaciones, diseños e implementaciones.

  • La alianza entre IRC-Hispano y ESNET, a nivel de I+D, garantiza que la inversión en tecnología realizada en ESNET se rentabilice mediante su empleo en IRC-Hispano.

  • Por sus menores pretensiones, ESNET sigue siendo una red más abierta que IRC-Hispano, ya que sus barreras y requisitos de entrada son menores.

  • El diseño original del sistema de Base de Datos Distribuída no soporta la existencia de varios nodos de control y varias Bases de Datos Distribuídas independientes.

  • No se han desplegado todas las funcionalidades previstas en el diseño original: Compactación de las Bases de Datos Distribuídas, verificación de la integridad de las BDD y protección ante nodos maliciosos. Sobre ese último punto, la única medida adoptada fue el evitar que un nodo que no sea HUB propague cambios en las BDD (parche DB8).


Esquema Propuesto

El funcionamiento básico del sistema es comparable al definido en la fase 2. Los cambios están ocasionados, sobre todo, por la necesidad de dar soporte a Bases de Datos Distribuídas gestionadas por diferentes nodos de control. Se recomienda leer previamente la descripción de la fase 2, por ser más sencilla y por sentar las bases del esquema actual.

Funcionamiento


Problemas con el Esquema Propuesto

El esquema propuesto hasta el momento presenta una serie de problemas, todos ellos derivados del borrado de una BDD local. Están ocasionados por el hecho de que se rompe la secuencia monótona creciente en la que se basa la distribución de las Bases de Datos Distribuídas.

En todos los casos los problemas son similares y aparecen cuando un nodo tiene más de una vía de actualización de sus Bases de Datos Distribuídas. Es decir, sólo afecta a HUBS, y sólo cuando estos estén conectados o otros *dos* HUBs como mínimo.

  1. Solicitud de borrado de una BDD local

    Cuando un nodo recibe una solicitud de borrado de una de sus BDDs locales, así lo hace, y solicita una actualización al nodo a través de cuyo enlace le llegó la petición original.

    Este esquema no funciona cuando el nodo dispone de varias vías de actualización, y se está actualizando en este momento. Supongamos el siguiente caso, por ejemplo.

    C-H1-H2-H3
    

    El nodo H2 acaba de entrar en la red y tiene su base de datos desactualizada. Debido a ello, los nodos H1 y H3 empiezan a enviarle una actualización (se la mandan los dos nodos a la vez, de forma independiente).

    Si ahora el nodo de control C envía a H2 una orden de borrado, H2 la recibe, borra la BDD local que corresponda y solicita una actualización a H1, que habrá "Cerrado su Grifo" al pasar a H2 la orden de borrado.

    Mientras tanto, el nodo H3 sigue enviando actualizaciones a H2. Como H2 ha borrado su BDD, sólo tendrá los últimos registros, no los primeros.

    Cuando empiece a llegar la actualización de H1, H2 la ignorará, porque H3 ya le ha suministrado registros con número de serie mayor.

    Cuando termine la actualización, H2 tendrá una BDD parcial, en la que no aparecerán los primeros registros.

  2. Detección de una BDD local corrupta

    Además de la situación anterior, existe otro caso con mayores repercusiones:

    Hasta BD24, cuando un nodo comprueba que una de sus BDD locales está corrupta, la borra y solicita actualizaciones a sus nodos vecinos.

    Lo primero que hacen dichos nodos es forzar un borrado de la BDD en el nodo con problemas, por si se diera el caso de que se le hubieran transferido registros intermedios. Seguidamente se le manda la BDD.

    Si los enlaces tienen LAG, es perfectamente posible que cuando un enlace esté enviando la BDD, llegue una orden de borrado por otro enlace, junto la consiguiente actualización. La BDD puede quedar, pues inconsistente.

Estos problemas son graves porque afectan a HUBs, pero pueden ser detectados con un chequeo periódico de las copias locales de las BDD, tarea que debe ser ejercida por los nodos de control responsables de cada una de las BDD. Mientras no se diseña, estudia y despliega una solución elegante, he optado por una alternativa sucia y chapucera: cuando un nodo borra una de sus BDD, corta inmediatamente las conexiones con otros HUBs. Si el nodo no es HUB, no hace falta tomar ninguna medida especial.

Esta corrección temporal está desplegada como DB25.


Base de Datos

A continuación se detalla el formato de mensajes intercambiados entre servidores utilizando los parches hasta DB3:

<Nodo Origen> DB * 0 J <Número de Serie Local> (formato antiguo)
<Nodo Origen> DB * 0 J <Número de Serie Local> <versión implementación BDD> (formato DB16)
<Nodo Origen> DB * 0 J <Número de Serie Local> <BDD> (formato DB16)
Mensaje intercambiado entre nodos adyacentes en un "NetJoin" o entre ráfagas "DB Burst" como respuesta a un registro "B". En DB16 se realizó un cambio compatible hacia atrás para negociar la versión de la implementación de la Base de Datos Distribuída en el "NetJoin". La versión que se pasa es la "2". Los nodos antiguos ignoran ese valor. Los nodos modernos, con este esquema, permiten trabajar con varias BDD gestionadas por diferentes nodos de control. "BDD" es la BDD concreta que se está negociando.

<Nodo Origen> DB * 0 B <Número de Serie Local> (formato antiguo)
<Nodo Origen> DB * 0 B <Número de Serie Local> <BDD> (formato DB16)
Mensaje intercambiado entre nodos adyacentes al final de una ráfaga "DB Burst", para indicar que todavía quedan más registros por transferir. En el caso de que el otro extremo no lo consideremos HUB, se ignora debido al parche DB8. De otra forma se crearía un bucle infinito, ya que no estamos actualizando nuestra base de datos.

Con DB16 se especifica la BDD en cuestión.

Los siguientes mensajes han quedado obsoletos a partir de DB16:

<Nodo Origen> DB <Nodo Destino> 0 Q <Número de Serie Global>
Mensaje rutable en la red IRC. Permite que un nodo pregunte a otro qué versión tiene de la Base de Datos y/o borrarla. En el caso de que el otro extremo no lo consideremos HUB, se ignora debido al parche DB8. De otra forma un nodo arbitrario podría borrar cualquier base de datos de la red.

<Nodo Origen> DB <Nodo Destino> 0 q <Número de Serie Local> <Hash>

Mensaje rutable en la red IRC. Respuesta al mensaje anterior.

<Nodo Origen> DB <Nodo Destino> 0 D <nonce> <BDD> (formato DB17)
Mensaje Broadcast. Sólo se acepta si proviene de un HUB. Borra la BDD local si el nodo cumple la máscara.

<Nodo Origen> DB <Nodo Destino> 0 E <nonce> <BDD> (formato DB17)
Mensaje rutable en la red. Cada nodo que borre la copia local de la BDD responde al nodo que realizó la petición con este mensaje.

<Nodo Origen> DB <Nodo Destino> 0 Q <nonce> <BDD> (formato DB17)
Mensaje Broadcast. Sólo se acepta si proviene de un HUB. Consulta la versión y el HASH de la BDD local si el nodo cumple la máscara.

A partir de DB93, se puede preguntar por la tabla "*" (asterisco). El resultado es similar al habitual, pero refleja valores que dependen de los valores de todas las tablas. Con esto se pretende poder validar las bases de datos distribuidas presentes en todos los nodos con un único comando, en vez de sondear cada tabla por separado. Los valores devueltos en sí no tienen ningún significado que quiera documentar, y están sujetos a cambios entre versiones.

<Nodo Origen> DB <Nodo Destino> 0 R <Número de Serie Local>-<Número de registros existentes>-<HASH>-<nonce> <BDD> (formato DB55)
Mensaje rutable en la red. Cada nodo que cumpla la máscara del mensaje anterior responde con el número de serie local de la BDD en cuestión, su HASH y el nonce usado en la petición inicial.

Ver los comentarios para "Q", a partir de DB93.

Los siguientes mensajes han quedado obsoletos a partir de DB55:

<Nodo Origen> DB <Nodo Destino> 0 R <Número de Serie Local>-<HASH>-<nonce> <BDD> (formato DB17)
Mensaje rutable en la red. Cada nodo que cumpla la máscara del mensaje anterior responde con el número de serie local de la BDD en cuestión, su HASH y el nonce usado en la petición inicial.

<Nodo Origen> DB <Nodo Destino> <Número de Serie> N <Clave> [Valor] (formato antiguo)

<Nodo Origen> DB <Nodo Destino> <Número de Serie> <BDD> <Registro> [Valor] (formato DB16)
Mensaje rutable en la red IRC. Registro de nick. Normalmente el Nodo Destino es "*". En el caso de que el otro extremo no lo consideremos HUB, se ignora debido al parche DB8. De esta forma evitamos que un servidor arbitrario pueda modificar bases de datos remotas.

A partir de DB16 se pueden tener hasta 26 BDD's: de la "a" a la "z". El caso de "N" es especial: se trata de un alias a "n", y me mantiene por compatibilidad con implementaciones antiguas. En cuanto todos los nodos de una red sean post-DB16, deberían modificarse las Bases de Datos locales para cambiar los "N" por "n" y propagar de nuevo toda la Base de Datos de nicks.

Aunque un servidor no implemente una Base de Datos determinada, debe mantener una copia local sujeta a las mismas actualizaciones, verificaciones, operaciones en "NetJoin", etc., que una Base de Datos que sí implemente. De esta forma, un HUB antiguo puede intercomunicar nodos modernos, de forma transparente.

Si la clave que se intenta meter en la BDD es un asterisco "*", el nodo realizará una compactación de la BDD.

Nodo Origen:
Identificador Numérico.

Nodo Destino:
Identificador Alfanumérico.

Número de Serie:
Valor decimal.


Bases de Datos Distribuídas

Las Bases de Datos Distribuídas actuales son:

  • b:
    Configuración de bots virtuales.

    servicio -> nick!ident@host

  • c:
    Reservado

  • i:
    Ilines distribuídas, a partir del parche Clones.

    Si existe inversa, la busca en esta BDD. Si no existe inversa, busca la dirección IP en la BDD.

    Hostname/IP -> Número de conexiones simultaneas permitidas en toda la red.

    Los siguientes registros tienen un significado especial:

    • "." (punto)

      Este registro se mueve a la tabla "z" a partir de DB115 (2.10.H.07.56).

      Número de clones por defecto para aquellas conexiones sin registro propio.

    • ".." (punto punto)

      Este registro se mueve a la tabla "z" a partir de DB116 (2.10.H.07.57).

      Mensaje que se muestra cuando una conexión supera el número de clones permitidos.

    • "..." (punto punto punto)

      Este registro se mueve a la tabla "z" a partir de DB117 (2.10.H.07.58).

      Mensaje que se muestra cuando una conexión supera la capacidad definida para su clase de conexión (líneas Y).

  • n/N:
    Nicks registrados. Cuando todos los nodos sean post-DB16, se prefiere la notación en minúsculas, por coherencia con el resto de las BDD.

    NORM(nick) -> HASH(clave,NORM(nick)) (Registro de Nicks)

    A partir de DB78 (2.10.H.02.02), sólo pueden consultar estos registros los opers de nivel 10 o superior (admins). No se incluyen los IRCops.

    Si la clave de un nick termina en un asterisco ("*"), el nick se considera prohibido en la red, y no te lo puedes poner. La implementación actual permite que te lo pongas si sabes la clave correcta, así que el bot de control de registros de nicks debe propagar una clave aleatoria.

    Si la clave de un nick termina en un signo MÁS ("+"), el nick se considera suspendido en la red. Te lo puedes poner, pero se te activará el modo "+S" en vez de "+r" y no tendrás acceso a los bots de la red, o a funcionalidades como las IPs virtuales personalizadas. Pero el nick solo se lo puede poner la persona que conozca la clave.

  • o:
    Nicks de operadores (helpers) de red.

    NORM(nick) -> nivel

    Nivel: 5 (Oper - Helper), 10 (Oper - Admin) (esta información puede variar).

  • t:
    Nicks temporales durante la migración IRC-Hispano.

    NORM(nick) -> HASH(clave,NORM(nick))

    A partir de DB78 (2.10.H.02.02), sólo pueden consultar estos registros los opers de nivel 10 o superior (admins). No se incluyen los IRCops.

    Esta tabla ya no se usa. Cambio a partir de la versión 2.10.H.02.63 del servidor.

  • v:
    Dirección IP Virtual.

    NORM(nick) -> IP Virtual (host)

    Los siguientes registros tienen un significado especial:

    • "." (punto)

      Este registro se mueve a la tabla "z" a partir de DB118 (2.10.H.07.59).

      Clave de cifrado de las IPs virtuales en la red.

      A partir de DB78 (2.10.H.02.02), sólo puede consultar este registro los opers de nivel 10 o superior (admins). No se incluyen los IRCops.

  • w:
    Dirección IP Virtual Personalizada.

    NORM(nick) -> IP Virtual Personalizada (host)

    Esta tabla está disponible a partir de VIP35 (2.10.H.04.65).

  • z:
    Datos de configuración globales de la red.

    Esta tabla está disponible a partir de DB113 (2.10.H.07.41).

    • "motd.*"

      Estos registros definen el MOTD (mensaje del día) global de la red.

      Empieza en "motd.0" y va subiendo en número hasta que no se encuentra el registro correspondiente.

      Si alguno de los registros tiene el valor "%LOCALMOTD", se muestra el MOTD local del nodo. Si no existe ningún registro, se muestra el MOTD local del nodo. Si existe algún registro, solo se muestra el MOTD local si la BDD así lo indica.

    • "numero.maximo.de.clones.por.defecto"

      Número de clones por defecto para aquellas conexiones sin registro propio.

    • "mensaje.de.demasiados.clones"

      Mensaje que se muestra cuando una conexión supera el número de clones permitidos.

    • "mensaje.de.capacidad.superada"

      Mensaje que se muestra cuando una conexión supera la capacidad definida para su clase de conexión (líneas Y).

    • "clave.de.cifrado.de.ips"

      Clave de cifrado de las IPs virtuales en la red.

      A partir de DB78 (2.10.H.02.02), sólo puede consultar este registro los opers de nivel 10 o superior (admins). No se incluyen los IRCops.

    • "u:*"

      Estos registros definen "líneas U" distribuidas. El formato de la clave es "u:nodo". Su valor se ignora.

    • "p09:*"

      Estos registros definen numerics de los nodos P09 que pudiesen existir en la red. Son usados por los nodos P10 que les sirven de HUBs.

      El formato de la clave es "p09:nodo". Su valor es el numeric del nodo en cuestión, en decimal.


Historia



Get Firefox Python Zope ©1999-2003 jcea@jcea.es