X
  • ZFS
    May 29, 2008

¿Infracción incontrolada de capas?

Guest Author

Andrew Morton ha calificado a ZFS como una "infracción incontrolada de capas" porque combina la funcionalidad de un sistema de archivos, un administrador de volúmenes y un controlador de RAID. Supongo que todo depende del significado del término infracción. Al diseñar ZFS observamos que la norma de estratificación de la pila de almacenamiento lleva consigo una sorprendente cantidad de lógica innecesariamente compleja y duplicada. También encontramos que al refactorizar el problema un poco, es decir, al cambiar los límites entre las capas, podíamos simplificar aún más el proceso.

Un ejemplo de matemáticas (mi bagaje real) puede servirnos de prólogo clarificador.

Supogamos que tenemos que calcular la suma de n=1 a infinito, de 1/n(n+1).

Desarrollándolo término a término, tenemos:

        1/(1\*2) + 1/(2\*3) + 1/(3\*4) + 1/(4\*5) + ...

Es decir,

        1/2 + 1/6 + 1/12 + 1/20 + ...

¿A qué sumamos la serie infinita? Puede parecer un problema bastante arduo, pero sólo porque no lo estamos viendo de la forma correcta. Con un poquito de inteligencia es facil observar que hay distintas formas de expresar cada término:

        1/n(n+1) = 1/n - 1/(n+1)

Por ejemplo,

        1/(1\*2) = 1/1 - 1/2
        1/(2\*3) = 1/2 - 1/3
        1/(3\*4) = 1/3 - 1/4

Por lo tanto, nuestra suma puede expresarse como:

        (1/1 - 1/2) + (1/2 - 1/3) + (1/3 - 1/4) + (1/4 - 1/5) + ...

Bien, veamos ahora el patrón: cada término que restamos, lo añadimos de nuevo. Únicamente en el Congreso esto no cuenta como trabajo. Por tanto, si sólo reordenamos el paréntesis, es decir, si infringimos la estratificación descontroladamente utilizando la asociatividad para refactorizar la aritmética a través de los términos adyacentes de las series, tenemos:

        1/1 + (-1/2 + 1/2) + (-1/3 + 1/3) + (-1/4 + 1/4) + ...

o

        1/1 + 0 + 0 + 0 + ...

En otras palabras,

        1.

¿A que queda bien?

Los matemáticos tienen un término para esto. Cuando se reordenan los términos de una serie hasta que se anula, se dice que es una serie telescópica, por analogía con un telescopio de mano contraíble. En pocas palabras, es lo que ZFS hace: contrae la pila de almacenamiento. Esto es lo que hace posible tener un sistema de archivos, un administrador de volúmenes, un RAID de doble paridad, compresión, instantáneas, clones y un montón de de otras muchas cosas útiles en tan sólo 80.000 líneas de código.

Un sistema de almacenamiento es más completo que esta sencilla analogía, pero en realidad aplica la misma idea a un nivel más alto. Podría pensarse en cualquier pila de almacenamiento como una serie de traducciones de un esquema nombres a otro. En última instancia, es la traducción de un nombre de archivo a una LBA (dirección de bloque lógico) de disco. El aspecto que suele tener es más o menos así:

        sistema de archivos (superior): nombre de archivo a objeto (inodo)
       sistema de archivos (inferior): objeto a LBA de volumen
        administrador de volúmenes: LBA de volumen a LBA de matriz
        controlador de RAID: LBA de matriz a LBA de disco

Esta es la pila que estamos a punto de refactorizar.

Primero, observe que la capa del sistema de archivos tradicional es demasiado monolítica, y sería mejor separar la parte nombre de archivo a objeto (la mitad superior) de la parte objeto a LBA de volumen (la mitad inferior) para que podamos reutilizar el mismo código de la mitad inferior para admitir otros tipos de almacenamiento, como objetos o destinos iSCSI que no tienen nombres de archivo. Estas clases de almacenamiento podrían hablar directamente a la capa de objetos, lo que es mucho más eficaz que pasar a través de algo así como /dev/lofi, que es lo que hace que POSIX parezca un dispositivo. Pero lo más importante de todo, es que ofrece un potente modelo de programación nuevo -- almacenamiento de objetos -- sin necesidad de ningún otro código adicional.

Segundo, la LBA de volumen es absolutamente inútil. Por lo general, añadir una capa de dirección suele ser una forma de dar más flexibilidad, pero no es el caso: de hecho, estamos traduciendo de inglés a francés y de francés a alemán cuando podemos traducir directamente de inglés a alemán sin el menor problema. El francés intermedio no tiene un valor intrínseco. No es visible para las aplicaciones, no es visible para la matriz RAID y no desempeña ninguna función administrativa. Sólo está ahí arriba.

Por eso, ZFS ha desplegado el telescopio de todas las capas. ZFS tiene sólo tres capas bien diferenciadas: la ZPL (ZFS POSIX Layer), que ofrece la semántica del sistema de archivo POSIX tradicional; la DMU (unidad de gestión de datos), que ofrece un almacén de objetos transaccionales de uso general; y la SPA (asignador de lugares de almacenamiento), que ofrece asignación virtual de bloques y transformaciones de datos (replicación, compresión y pronto encriptación). La pila de traducción general de ZFS es similar a:

        ZPL: nombre de archivo a objeto
        DMU: objeto a DVA (dirección virtual de datos)
        SPA: DVA a LBA de disco

La DMU permite que tanto el archivo como el bloque accedan a un lugar común de almacenamiento físico. El acceso al archivo se realiza a través de ZPL, mientras que el bloque se conduce directamente hacia un único objeto DMU. También estamos desarrollando nuevos métodos de acceso a datos que utilizan la capacidad transaccional de DMU de formas mucho más interesantes y de las que trataremos otro dia.

La arquitectura ZFS elimina toda una capa de transacción y, junto con ella, una clase entera de metadatos (las LBA de volúmenes), además de eliminar la necesidad de utilizar controladores RAID para hardware. Al mismo tiempo, ofrece una nueva interfaz útil -- almacenamiento de objetos -- totalmente inaccesible hasta ahora por encontrarse enterrada en un sistema de archivos monolítico.

Así pues, no creo haber infrigido nada. ¿Y usted?

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.Captcha