X
  • ZFS
    June 3, 2008

Integridad de datos de extremo a extremo ZFS

Guest Author

El trabajo de cualquier sistema de archivos se reduce a esto: cuando se le pide que lea un bloque, debe devolver los mismos datos que se hayan escrito en el bloque. Si no puede hacerlo, ya sea porque el disco está fuera de línea o porque los datos estén dañados o alterados, debería detectar el error y comunicarlo.

Por increíble que parezca, la mayoría de los sistemas de archivos no superan esta prueba, porque dependen del hardware subyacente para detectar e informar sobre los errores. La mayor parte de los sistemas de archivos ni siquiera podrían detectar si un disco devuelve datos incorrectos.

Incluso en el caso de que todos los discos funcionen perfectamente, los datos siguen siendo vulnerables durante el transporte: fallos del controlador, errores de paridad DMA, entre otros varios peligros. Todo lo que se puede saber es que los datos estaban intactos cuando salieron del disco. Considerando los datos como si fuera paquete, es como si UPS dijera: "Garantizamos que su paquete no sufrió ningún daño en la recogida". Vale, pero no es el tipo de garantía que se espera encontrar.

Un daño en vuelo no es un mero problema académico: incluso algo tan prosaico como una fuente de alimentación en mal estado puede causar el deterioro silencioso de los datos.

Las matrices de almacenamiento caras y arbitrarias no pueden resolver el problema. El camino de E/S sigue siendo tan vulnerable como antes, pero se ha hecho más largo: después de dejar el disco, los datos no han sobrevivido a la gama de errores de hardware y firmware que la matriz pone a su disposición.

Y si se encuentra en una SAN, está utilizando, además, una red diseñada por escritores de firmware. Dios le ampare, hermano.

¿Qué hacer? Una opción es guardar una suma de comprobación con cada bloque de disco. La mayoría de las unidades de disco modernas se pueden formatear con sectores que son ligeramente más grandes que los habituales de 512 bytes -- por lo general, de 520 o 528. Estos bytes extras se pueden utilizar para guardar la suma de comprobación del bloque. Pero hacer un buen uso de la suma de comprobación es más duro de lo que parece: la eficacia de una suma de comprobación depende extraordinariamente del lugar en el que se guarda y del momento en que se calcula.

En muchas matrices de almacenamiento (consulte el documento Dell|EMC PowerVault para ver un ejemplo típico con una descripción excelente de los problemas), los datos se comparan con su propia suma de comprobación dentro de la matriz. Por desgracia, esto no ayuda mucho. No detecta errores comunes de firmware, como las escrituras fantasma (la escritura anterior no llega jamás a grabarse en el disco) ya que los datos y la suma de comprobación se guardan como una unidad -- de modo que son coherentes entre sí incluso aunque el disco devuelva datos erróneos. Y el resto del camino de E/S de la matriz al ordenador anfitrión sigue estando desprotegido. En resumen, este tipo de suma de comprobación de bloque ofrece un buen método de garantizar que el producto de la matriz no es menos fiable que los discos que contiene, pero no hay más.

El enfoque de la suma de comprobacion añadida a un bloque de NetApp se parece algo pero lo cierto es que es mucho más fuerte. Al igual que muchas matarices, NetApp formatea sus unidades con sectores de 520 bytes. Y luego las agrupa en bloques de ocho sectores: 4 K de datos (el tamaño del bloque del sistema de archivos WAFL) y 64 bytes de la suma de comprobación. Cuando WAFL lee un bloque, compara la suma de comprobación con los datos, exactamente igual a como lo haría una matriz, pero con una diferencia clave: realiza la comparación después de que los datos hayan recorrido el camino de E/S, por lo que garantiza que el bloque ha pasado del disco a la memoria sin sufrir daños en el trayecto.

Esto representa una gran mejora, pero sigue sin ser suficiente. Una suma de comprobacion a nivel del bloque sólo prueba que el bloque es coherente consigo mismo, pero no garantiza que sea el bloque correcto. Retomando la analogía anterior, es como si UPS dijera: "Garantizamos que el paquete que ha recibido no ha sufrido daños. No garantizamos que se trate de su paquete".

El problema fundamental con todos estos esquemas es que no ofrecen aislamiento contra fallos entre los datos y la suma de comprobacion que los protege.

Autentificación de datos ZFS

La integridad de los datos de extremo a extremo requiere que cada bloque de datos se compare con una suma de comprobacion independiente después de que los datos hayan llegado a la memoria del ordenador anfitrión. No basta con saber que cada bloque es coherente consigo mismo ni que fuera correcto en cualquier punto anterior del camino de E/S. Lo que pretendemos es detectar cada posible forma de daño, incluidos los fallos humanos, como el intercambio de archivos en un disco del sistema de archivos o un error al escribir un argumento en dd(1). (¿Nunca ha escrito "of=" cuando quería poner "if="?)

Un lugar de almacenamiento ZFS es realmente un árbol de bloques. ZFS proporciona aislamiento contra fallos entre los datos y la suma de comprobación guardando la suma de comprobación de cada bloque en su bloque padre -- no en el propio bloque. Cada bloque del árbol contiene las sumas de comprobación de todos sus hijos, por lo que todo el lugar de almacenamiento está comprobado automáticamente. [El bloque principal (la raíz del árbol) es un caso especial porque no tiene padre; hablaremos más sobre esto en otra entrega].

Cuando los datos y la suma de comprobación están en desacuerdo, ZFS sabe que la suma de comprobación es correcta porque forma parte de otro bloque que se encuentra en un nivel superior del árbol y que, a su vez, ya ha sido validado.

ZFS utiliza sus propias sumas de comprobación de extremo a extremo para detectar y corregir la corrupción silenciosa de los datos. Si un disco devuelve datos dañados, ZFS los detectará y repetirá su lectura. Si el disco forma parte de un espejo o de un grupo RAID-Z, ZFS detectará ambos y corregirá el error: utilizará la suma de comprobación para determinar la copia correcta, ofrecer datos correctos a la aplicación y reparar la copia dañada.

Como siempre, recuerde que la integridad de los datos de extremo a extremo ZFS no requiere ningún tipo especial de hardware. No tendrá que gastar en discos ni matrices caras, no tendrá que reformatear unidades con sectores de 520 bytes ni tendrá que modificar aplicaciones para poder disfrutar de sus ventajas. Es totalmente automático y funciona con discos baratos.

¡Espere un momento, que todavía hay más!

Los bloques de un lugar de almacenamiento ZFS forman un árbol Merkle en el que cada bloque valida a todos sus hijos. Los árboles Merkl han demostrado que proporcionan una autentificación criptográficamente fuerte para cualquier componente del árbol y para todo el árbol en su conjunto. ZFS utiliza sumas de comprobación de 256 bits para cada bloque y ofrece funciones de sumas de comprobación que comprenden desde la sencilla y rápida fletcher2 (valor predeterminado) a la más lenta pero segura SHA-256. Cuando se utiliza una hash criptográfica, como SHA-256, la suma de comprobacion del bloque principal proporciona una firma digital actualizada para todo el lugar de almacenamiento.

Que viene muy bien si pide a UPS que haga el traslado.


Technorati Tags:

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