Archive for the 'Software' Category

Protocolo interno Diskpool-Diskpool

Como se deduce del Protocolo de Diskpool para MFS, es necesario que la réplica maestra en un Diskpool dialoge con otras réplicas del bloque para la Sincronización,y la Escritura replicada. Las tramas descritas a continuación son solo entre Diskpools, los clientes no las tienen disponibles en su repertorio.

Sincronización:

[Diskpool Maestro] —————–ISync————————->[Diskpool]

[Diskpool Maestro] <–-ISyncStatus/VersionError/Error—-–[Diskpool]

[Diskpool Maestro] –———-ISyncData/ISyncOk———-–>[Diskpool]

[Diskpool Maestro] <————ISynced/Error—————-– [Diskpool]

Ejemplo ISync:

ISync A0213ABBF1 v0.1

MasterVersion A23FF256

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

<EOM>

Ejemplos de respuestas a ISync:

ISyncStatus A0213ABBF1 v0.1

Version A23FF250

SHA1 d3255bfeda39a3ee590afd80709e6b4b0f956018

Size 212314

PartSize 16384

HashParts 13

SHA1-1 3ee590afd80d3255bfeda39a709e560186b4b0f9

SHA1-2 90afd80d32553ee5bfeda39a709e560186b4b0f9

SHA1-3 3255bfeda39a709e560186b4b0f93ee590afd80d

SHA1-4 0afd80d3255bfeda39a709e53ee5960186b4b0f9

SHA1-13 590afd80d3255bfeda39a709e563ee0186b4b0f9

<EOM>

o

VersionError A0213ABBF1 v0.1

Version A23FF257

SHA1 90afd80709e6b4d3255bfeda39a3ee5b0f956018

Size 712314

<EOM>

o

Error A0213ABBF1 v0.1

Code 011

Reason Can’t store

Detail Can’t write to disk, is it full?

<EOM>

Petición interna tras un ISyncStatus correcto:

ISyncData A0213ABBF1 v0.1

MasterVersion A23FF256

Size 800046

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

Offset 49152

BIN 81920

(un trozo binario cualquiera de 81920 (3×16384) bytes…)

Offset 147456

Zeros 229376

Offset 376832

BIN 423214

(Otro trozo binario de 423214 bytes…)

<EOM>

o

ISyncOk A0213ABBF1 v0.1

MasterVersion A23FF256

Size 800046

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

<EOM>

Ejemplos de respuesta:

ISynced A0213ABBF1 v0.1

Version A23FF256

Size 800046

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

<EOM>

o

Error A0213ABBF1 v0.1

Code 011

Reason Can’t store

Detail Can’t write to disk, is it full?

<EOM>

Escritura replicada:

[Diskpool] ————–IWrite————->[Diskpool]————–IWrite————->[Diskpool]…

[Diskpool] <–——–IStored/Error——-–[Diskpool]<–——–IStored/Error——-–[Diskpool]…

Y

[Diskpool Maestro] ————–ICommit————->[Diskpool]

[Diskpool Maestro] <——-ICommited/Error———[Diskpool]

Petición de Escritura:

IWrite A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Next dp3.example.com:14223 10.92.12.213:15050

Autocommit on

TTL 750

BIN 4096

…(4096 octetos, datos binarios)

BIN 8192

…(8192 octetos, datos binarios)

<EOM>

y (dp3.example.com:1422)

IWrite A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Next 10.92.12.213:15050

Autocommit on

TTL 750

BIN 4096

…(4096 octetos, datos binarios)

BIN 8192

…(8192 octetos, datos binarios)

<EOM>

y (10.92.12.213:15050)

IWrite A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Autocommit on

TTL 750

BIN 4096

…(4096 octetos, datos binarios)

BIN 8192

…(8192 octetos, datos binarios)

<EOM>

Ejemplos de Respuestas:

(Las respuestas son congruentes: cualquier fallo se reenvía hasta el primer Diskpool y este se lo manda al Cliente. Además si algún Hash no coincide hay que devolver error tambien hasta el cliente)

IStored A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Size 12188

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

<EOM>

o

Error A0213ABBF1 v0.1

Code 011

Reason Can’t store

Detail Can’t write to disk, is it full?

o

Error A0213ABBF1 v0.1

Code 012

Reason Hash Error

Detail Data transfer is corrupt, hashes don’t match!

<EOM>

Ejemplos de petición de commit interno:

ICommit A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Size 4396

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

ExtendTTL 0

<EOM>

Ejemplos de respuesta:

Commited A0213ABBF1 v0.1

Version A23FF257

Offset 6354234

Size 12188

SHA1 b4b0d3255bfefda39a3ee5e695601890afd8070

<EOM>

o

Error A0213ABBF1 v0.1

Code 005

Reason Write Not Found

Detail The write specified was not found in this diskpool

<EOM>

o

Error A0213ABBF1 v0.1

Code 002

Reason Not Found

Detail The block was not found in this diskpool

<EOM>


Creative Commons License
Diskpool by José Luis Vázquez González is licensed under a Creative Commons Reconocimiento-No comercial-Compartir bajo la misma licencia 2.5 España License.

Protocolo Diskpool de MFS

(Ver antes este Post)

Por simplicidad el protocolo del Diskpool será al mismo tiempo de control y de datos, con mensajes de control, mensajes de datos y mensajes mixtos con control y datos al mismo tiempo.

El esquema de funcionamiento es parecido al usado en HTTP y memcached; preguntas y respuestas sobre un protocolo en modo texto con segmentos binarios de longitud conocida.

Las partes en modo texto van codificadas en UTF-8, para permitir el envío de caracteres del cualquier idioma en las partes donde pueda ser necesario.

Esquema general de los mensajes del protocolo diskpool:

Ordenes

<Orden> <ID del bloque en hexadecimal (64bits)> <Versión del protocolo><Fin de Línea (=CR+LF)>

<Parámetro> <valor><Fin de Línea>

… (tantos como necesite la petición)

“BIN” <longitud en octetos (bytes) de los datos binarios que se incluyen a continuación><Fin de Línea>

<Datos binarios de la longitud especificada>

… (tantos segmentos binarios como necesite la petición)

<EOM> (=<CRLF><CRLF>)

Respuestas

<Respuesta> <ID del bloque en hexadecimal (64bits) o ‘*’> <Versión del protocolo><Fin de Línea (=CR+LF)>

[<Parámetro> <valor><Fin de Línea>

... (tantos como necesite la respuesta)] (El bloque [] es opcional)

["BIN" <longitud en octetos (bytes) de los datos binarios que se incluyen a continuación><Fin de Línea>

<Datos binarios de la longitud especificada>

... (tantos segmentos binarios como necesite la respuesta)] (El bloque [] es opcional)

<EOM> (=<CRLF><CRLF>)


Creación de Réplica de Bloque:

Resumen:

[Cliente] ———-Create————>[Diskpool]

[Cliente] <–Created/Exists/Error–[Diskpool]

Ejemplo de la petición:

Create A0213ABBF1 v0.1

Size 8M

<EOM>

Ejemplos de posibles respuestas:

Created A0213ABBF1 v0.1

Size 8M

Version 0

<EOM>

o

Exists A0213ABBF1 v0.1

Size 16M

Version A23FF256

Status Desynchronized

<EOM>

o

Error A0213ABBF1 v0.1

Code 001

Reason Illegal size

Detail Just 4M of space left! (or “6M is the maximum block size allowed”)

<EOM>

Sincronización de réplicas de bloque:

[Cliente] —————–Sync——————–>[Diskpool]

[Cliente] <–Synced/Syncing/Desync/Error–[Diskpool]

Ejemplo de la petición del cliente:

Sync A0213ABBF1 v0.1

Slaves dp2.example.com dp3.example.com:14223 10.92.12.213:15050

MinReplicas 2

<EOM>

Ejemplos de respuestas:

Synced A0213ABBF1 v0.1

MasterVersion A23FF256

Slave1 dp2.example.com failed timeout

Slave2 dp3.example.com:14223 ok A23FF256

Slave3 10.92.12.213:15050 failed diskfull

<EOM>

o

Syncing A0213ABBF1 v0.1

MasterVersion A23FF256

Slave1 dp2.example.com failed timeout

Slave2 dp3.example.com:14223 ok A23FF255

Slave3 10.92.12.213:15050 ok A23FF255

<EOM>

o

Desynced A0213ABBF1 v0.1

MasterVersion A23FF256

Slave1 dp2.example.com fatal A23FF260

Slave2 dp3.example.com:14223 ok A23FF255

Slave3 10.92.12.213:15050 ok A23FF255

<EOM>

o

Error A0213ABBF1 v0.1

Code 002

Reason Not Found

Detail The block was not found in this diskpool

<EOM>

Lectura de bloque sincronizado:

[Cliente] ——-Read———->[Diskpool]

[Cliente] <–Data/Outdated–[Diskpool]

Ejemplos de la petición del cliente:

Read A0213ABBF1 v0.1

Offset 212314

MinVersion A23FF250

<EOM>

o

Read A0213ABBF1 v0.1

Offset 212314

Size 4096

MinVersion A23FF250

<EOM>

Ejemplos de respuestas:

(Al primer ejemplo, 8176294 son los bytes que quedan del bloque de 8 Megas empezando en 212314)

Data A0213ABBF1 v0.1

Offset 212314

Version A23FF256

BIN 8176294

Estos son datos binarios para el diskpool, podrían incluso no estar codificados en UTF-8,

como el resto de la respuesta (o una petición).

Además, como BIN era -1 este bloque se envia hasta el final, a no ser que el cliente

cierre la conexión…

<EOM>

o

(Al segundo ejemplo)

Data A0213ABBF1 v0.1

Offset 212314

Version A23FF256

BIN 4096

…(4096 octetos, datos binarios)

<EOM>

o

Outdated A0213ABBF1 v0.1

Version A23FF200

AskedVersion A23FF250

<EOM>

Escritura de bloque:

Resumen:

[Cliente] —————–Write———->[Diskpool]

[Cliente] <–Stored/Commited/Error–[Diskpool]

o

[Cliente] ——-Commit———->[Diskpool]

[Cliente] <–Commited/Error—-[Diskpool]

Ejemplos de petición del cliente:

Write A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Next dp2.example.com dp3.example.com:14223 10.92.12.213:15050

Autocommit on

TTL 750

BIN 4096

…(4096 octetos, datos binarios)

BIN 8192

…(8192 octetos, datos binarios)

<EOM>

o

Write A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Next dp2.example.com dp3.example.com:14223 10.92.12.213:15050

Autocommit off

TTL 750

BIN 4096

…(4096 octetos, datos binarios)

BIN 300

…(300 octetos, datos binarios)

<EOM>

o

Commit A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Size 4396

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

ExtendTTL 0

<EOM>

Ejemplos de respuesta:

(A Write con Autocommit=on o al Commit)

Commited A0213ABBF1 v0.1

Version A23FF257

Offset 6354234

Size 12188

SHA1 b4b0d3255bfefda39a3ee5e695601890afd80709

<EOM>

o

Error A0213ABBF1 v0.1

Code 010

Reason Not  a master

Detail Can’t write, this is not a master at the moment (find or sync the master and retry)

<EOM>

(o a Write con Autocommit=off)

Stored A0213ABBF1 v0.1

Version A23FF256

Offset 6354234

Size 4396

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

<EOM>

(o cualquiera de las peticiones)

Error A0213ABBF1 v0.1

Code 011

Reason Can’t store

Detail Can’t write to disk, is it full?

<EOM>

Estadísticas

Resumen:

[Cliente] ————-GetStats—–>[Diskpool]

[Cliente] <——Stats/Error——–[Diskpool]

Ejemplos de petición:

GetStats * v0.1

<EOM>

o

GetStats A0213ABBF1 v0.1

<EOM>

Ejemplos de respuestas:

Stats * v0.1

Blocks 10000

MinBlockSize 4M

MaxBlockSize 32M

MaxLegalBlockSize 128M

SpaceLeft 56.0G

UsedSize 36.5G

StoredSize 35.0G

UsagePct 39.46

RequestsPerSecond 120

Block1 id=0213AD234F1 v=A23FF2564

Block2 id=20213AE234F v=A23FF2564

Block10000 id=A0213ABBF1 v=A23FF257

<EOM>

o

Stats A0213ABBF1 v0.1

Version A23FF256

Size 7324345

SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709

MaxSize 8M

Master yes

StoredWrites 2

StoredSize 9M

SpaceLeft 56.0G

<EOM>

Notas:

Cliente y servidor pueden cortar la conexión en cualquier momento:

  • Un corte del cliente antes de que la petición haya llegado completa aborta toda acción antes de producirse respuesta.
  • Un corte del cliente antes de poder recibir la respuesta deja a este sin saber el resultado de la misma, que puede haber no sido exitosa y/o contener información de la operación realizada.
  • Un corte del servidor antes de terminar la petición indica un error fatal de protocolo por parte del cliente o si se ha agotado el tiempo de recepción de petición máximo.
  • Un corte del servidor antes de poder terminar la respuesta indica un error fatal (caída) del proceso del servidor.

El Cliente puede recibir un error en cuanto haya enviado su petición completa (con EOM) o el primer segmento BIN de datos (antes de eso solo recibiría un cierre de conexión en caso de error de protocolo o por temporizador vencido)

El Servidor reutiliza la conexión TCP si el cliente no la cierra al terminar de recibir la respuesta completa (hasta el EOM).


Creative Commons License
Diskpool by José Luis Vázquez González is licensed under a Creative Commons Reconocimiento-No comercial-Compartir bajo la misma licencia 2.5 España License.

Diskpool para MarisaFileSystem

El servidor MarisaDiskPool de MarisaFileSystem permite crear, borrar, leer, escribir y sincronizar replicas de bloques de datos de tamaño arbitrario. A partir de ahora se distinguen los términos bloque y réplica de bloque:

  • Réplica de bloque es una copia determinada en un diskpool determinado de los datos de un bloque, que puede estar o no sincronizada con el estado más reciente de dicho bloque.
  • Bloque es una entidad abstracta que representa un bloque de datos replicado en N veces (frecuentemente 3). El bloque podrá leerse de la réplica maestra o las replicas esclavas sincronizadas (las que están al día de los datos escritos en dicho bloque).

Las escrituras son atómicas, se realizan completamente o se deshacen del todo.

El servidor diskpool permite lecturas y escrituras concurrentes de bloques de datos:

Requisitos Generales:

  • RG1. Cada bloque es completamente independiente de los demás. Solo se compite por espacio de almacenamiento.
  • RG2. Cada diskpool contiene una sola réplica de algunos de los bloques del sistema (agrupación de diskpools).
  • RG2. Cada réplica de bloque tiene un tamaño máximo, pero un mismo diskpool puede contener bloques de diferentes tamaños. (No obstante, los bloques generalmente formarán parte de abstracciones superiores como ficheros donde lo lógico es que todos lo bloques de un mismo fichero cuenten con un mismo tamaño de bloque máximo fijo.)
  • RG3. Una réplica de bloque al crearse o al (re)iniciarse el diskpool está siempre desincronizada: No admite operaciones de lectura o escritura hasta que se marque como réplica maestra o como réplica esclava sincronizada.

Creación de Réplica:

  • RC1. Una réplica de bloque podrá ser creada por el diskpool solo si no existía previamente y se ha pedido con un tamaño máximo legal, es decir, mayor que 0 y menor que el mayor tamaño de bloque posible o el espacio disponible. La replica recién creada está en la versión 0 y desincronizada.

Sincronización de Réplicas:

  • RS1. Se selecciona la réplica maestra de un bloque (una de las que tengan la versión de bloque más alta) y se le envía a su diskpool una petición de sincronización de réplicas, que incluye una lista de los diskpools que contienen el resto de réplicas del bloque a sincronizar, las réplicas esclavas.
  • RS2. El diskpool receptor, elegido maestro de réplica, debe confirmar que todas las réplicas esclavas en los diskpools dados han sido notificadas y han confirmado o rechazado la petición. Las razones de rechazo pueden ser:
  • FATALES: versión ilegal (la versión de la réplica esclava es superior a la del maestro)
  • NO FATALES: diskpool no disponible o timeout o error interno del diskpool.
  • RS3. La petición de sincronización incluye tambien un número mínimo de réplicas aceptable para que la petición tenga éxito. Por ejemplo, puede haberse enviado una lista con 2 réplicas esclavas (replicación 1+2) pero puede bastar que haya 2 réplicas activas (la maestra y una esclava), con lo cual se toleraría que uno de los 2 diskpool consultados no confirmase la notificación. No obstante, un solo  ERROR FATAL de cualquier diskpool hace fallar la petición de sincronización.
  • RS4. Un diskpool esclavo que recibe una notificación de una réplica:
  • Si esta no existe la crea y devuelve en la confirmación la versión 0.
  • Si ya existía devuelve la versión que tenga la réplica en ese momento.
  • RS5. Tras responder al cliente según las confirmaciones de las réplicas esclavas, la réplica maestra usa estas confirmaciones para decidir en cada réplica el tipo de sincronización:
  • Dar por sincronizada la replica si tiene una versión y HASH igual a la suya.
  • O sincronizarla, enviando todos los octetos del ultimo estado de la réplica maestra.
  • RS6. Ni la replica maestra ni las esclavas guardan su condición de manera persistente. Si el proceso del diskpool cae habrán olvidado todo esto y la réplica volverá a estar desincronizada. Si la replica caída era esclava, la maestra contactará con ella y la sincronizará de nuevo. Si la que cayó era la maestra habrá que repetir la petición de sincronización a la nueva réplica maestra seleccionada.

Lectura de un bloque sincronizado:

  • RL1. Cada lectura obtiene acceso sin esperar a otros lectores o escritores a la ultima versión consistente de la réplica de bloque.
  • RL2. Aunque se estén realizando varias escrituras concurrentes a la lectura, estas no modifican la versión leída del bloque.
  • RL3. Varias lecturas concurrentes sobre la misma réplica de bloque podrían estar leyendo versiones diferentes; la lectura que llegó más tarde lee la versión más moderna.
  • RL4. El acceso al bloque (en lectura y escritura) será aleatorio, pudiendo empezar por cualquier octeto y acabando en cualquier otro, pero siempre un solo sentido, del principio hacia el final.
  • RL5. Las réplicas de bloque no están obligadas a guardar ninguna versión más antigua que la que esté leyendo el lector más antiguo en ese momento.
  • RL6. La petición de lectura incluye un número de versión mínimo esperado, la operación solo se acepta si la réplica ha sido sincronizada por el maestro Y la versión que contiene es igual a posterior a la que espera el lector, sino la réplica rechaza la petición.

Escritura del bloque:

  • RE1. Una escritura tiene siempre dos partes:
  1. El envío de datos de la escritura.
  2. La confirmación o cancelación de la escritura del bloque.
  • RE2. Si el envío de datos se dirige primero a la réplica maestra, la escritura se puede hacer autoconfirmada, de manera que al llegar a final sin errores la réplica maestra la confirmará en esta y en las réplicas esclavas que la hayan recibido totalmente.
  • RE3. Si el envío de datos llega primero a una réplica esclava, la confirmación debe hacerse por separado y siempre a la réplica maestra. Por supuesto, la réplica maestra debe haber recibido los datos tambien para poder confirmar la escritura. De esta manera la réplica esclava decide un orden único para las escrituras en el bloque.
  • RE4. Cada escritura no es visible o efectiva hasta que finalmente se confirma en la réplica maestra, incrementando el número de versión del bloque.
  • RE5. Si el diskpool de la réplica maestra cae, las escrituras de bloque en curso (no confirmadas) desparecen completamente y sufren una cancelación automática.
  • RE6. Los diskpool no acepta datos por encima del ultimo octeto permitido según el tamaño máximo del bloque y responde cortando la conexión. Por ejemplo, si la escritura empezó en la posición 700.000 y el bloque tiene un tamaño máximo de 1.000.000 y ya han llegado 300.000 octetos, la escritura se da por terminada en recepción. Si el receptor era la réplica maestra y se trataba de una escritura autoconfirmada se procede a confirmar la escritura y si no, se espera a recibir la confirmación en la réplica maestra.
  • RE7. El envió de datos entre las réplicas del bloque se realiza en cadena en el orden indicado en la propia petición. El tiempo de escritura será (Noct*Ab)+(2*Nr*L) donde:
  • Noct son los octetos escritos.
  • Ab es el ancho de banda mínimo de la red (en octetos/s).
  • Nr es el número de réplicas en las que se está escribiendo.
  • L es la latencia media en la red.
  • RE8. La confirmación de escritura, como ya se ha dicho, solo puede hacerla la réplica maestra. La replica maestra localiza los datos de escritura recibidos y los aplica incrementa el número de versión que le corresponderá a esa escritura del bloque. Si algún error se lo impide se produce una cancelación informando solamente al cliente, no es necesario informar a las réplicas esclavas que ya borrarán los datos no confirmados una vez caducados.
  • RE9. Si la réplica maestra pudo realizar la confirmación de la escritura localmente, avisa a las réplicas esclavas citadas en la confirmación de escritura para sincronizarlas. Con las respuestas de todas las réplicas (incluidas respuestas por timeout) se responde al cliente con éxito (todas las réplicas están sincronizadas) o desincronismo porque la escritura fue realizada solo en algunas réplicas, la réplica maestra pasa a desincronizada y cancela todas las operaciones de escritura pendientes.
  • RE10. Tras un desincronismo la escritura en que se produjo se considera que ha tenido éxito (parcial), pero el bloque no aceptará más operaciones de escritura  hasta que se produzca una nueva sincronización del bloque, lo más frecuente es que la antigua réplica maestra reciba la petición de sincronización de nuevo pero excluyendo la réplicas que fallaron.

Destrucción de Réplica y Bloque:

  • RD1. La destrucción de una réplica de bloque espera a que acaben las lecturas pendientes para hacerse efectiva.
  • RD2. Por otro lado, nada más recibir y aceptar la orden de destrucción de réplica las escrituras pendientes (envíos de datos en curso) son abortados y no se aceptan confirmaciones de escritura en esta réplica.
  • RD3. Si la réplica borrada es la maestra debe ir marcada como borrado de bloque y las réplicas esclavas son notificadas por la maestra para que se borren también.
  • RD4. Es responsabilidad del sistema cliente (el que use el diskpool) anotar que bloques han sido borrados por completo, de manera que si el diskpool levanta con alguna réplica que debería haber desaparecido ya el sistema sabrá que debe borrarla de alguna forma (por ejemplo, por no estar asociado el bloque a ningún fichero).

Creative Commons License
Diskpool by José Luis Vázquez González is licensed under a Creative Commons Reconocimiento-No comercial-Compartir bajo la misma licencia 2.5 España License.