Author Archive for admin

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.