Descripción técnica de la arquitectura de almacenamiento Infinidat

InfiniBox es un sistema de almacenamiento moderno que inmediatamente cayó en el lado derecho del cuadrado mágico. ¿Cuál es su singularidad?

Un breve resumen

¿Qué es InfiniBox? Este es un sistema de almacenamiento Infinidat. ¿Qué es el Infinidat? Esta es una compañía creada por Moshe Yanay (creador de Symmetrix y XIV) para implementar un proyecto ideal de almacenamiento de nivel empresarial.

La compañía fue creada como un desarrollador de software, que se pone en equipos probados, es decir, es SDS, pero viene como un conjunto monolítico único.

Introducción

En este artículo veremos el sistema de almacenamiento InfiniBox, su arquitectura, cómo funciona y cómo se logra una alta confiabilidad (99.99999%), rendimiento, capacidad a un precio relativamente bajo. Dado que la base del sistema de almacenamiento es su software, y para este sistema en particular, el énfasis principal estará en el software, no habrá glándulas fotográficas hermosas.

¿Por qué necesita otro sistema de almacenamiento en el mercado?

Hay una serie de tareas para las que se necesita una capacidad muy grande, mientras que la fiabilidad y el rendimiento también son importantes. Por ejemplo, sistemas en la nube, tareas estándar de grandes empresas, Internet de las cosas, investigación genética, sistemas de seguridad para grandes estructuras. Es bastante difícil encontrar el sistema de almacenamiento óptimo para tales tareas, especialmente si observa el precio. Con un ojo en tales tareas, se construyó la arquitectura de software de InfiniBox.

Direccionamiento

¿Cómo puedo almacenar cantidades ilimitadas de datos? Al proporcionar un espacio de direcciones ilimitado. Para hacer esto, InfiniBox usa VUA - Espacio de dirección de usuario virtual. Todos los objetos creados en InfiniBox que son accesibles para el usuario (volúmenes, instantáneas, sistemas de archivos) se incluyen en este VUA, y el tamaño total de estos objetos es el tamaño actual del VUA. El direccionamiento es delgado y no está asociado con discos: es decir, el tamaño de VUA puede ser mucho mayor que la capacidad de disco disponible y, de hecho, es ilimitado.



A continuación, debemos dividir este espacio en partes que serviremos, por lo que es más fácil trabajar con ellos.



Todo el espacio de direcciones se divide en 6 partes: VU (unidad virtual - pieza virtual). El espacio de direcciones de cada objeto, como un volumen, se distribuye uniformemente entre estas partes. La grabación va en bloques de 64kB, y en el proceso, puede comprender increíblemente simple y rápidamente a qué VU pertenece esta dirección de volumen (el resto de la división LBA / 64kB, la función de módulo, se realiza muy rápidamente durante el número mínimo de ciclos de CPU).

Además de simplificar el trabajo con espacios más pequeños, las VU son el primer nivel de abstracción de los discos físicos y la base para la tolerancia a fallas del sistema a nivel del controlador. Por ejemplo, hay 3 controladores (servidores físicos), cada uno de los cuales es responsable de la operación y es el principal de dos VU, así como la copia de seguridad de otras dos VU. El controlador no da servicio a la VU para la cual es una reserva, pero al mismo tiempo recibe metadatos y operaciones de escritura del otro controlador para esta VU, de modo que en caso de una falla del controlador principal, inmediatamente recoge todo el trabajo con esta VU.



En caso de falla de un controlador, los otros dos se hacen cargo de su tarea: trabajar con su VU.



Direccionamiento, instantáneas, almacenamiento en caché



VUA es un espacio de direcciones virtual disponible para el usuario y prácticamente ilimitado. VDA (Dirección de disco virtual) es un espacio de almacenamiento interno virtual. Su tamaño está estrictamente determinado de antemano por el número y la capacidad de los discos duros (menos la paridad, los metadatos y el espacio para reemplazar las unidades fallidas). La conexión entre VUA y VDA se organiza a través de un trie (árbol de prefijos). Cada entrada en el árbol es un puntero desde el espacio del usuario (VUA) al espacio interior (VDA). El direccionamiento en forma de árbol de prefijos le permite direccionar bloques de cualquier tamaño. Es decir, cuando un elemento de cualquier tamaño (archivo, flujo de datos en serie, objeto) se agrega a los discos, se puede direccionar con un registro en el árbol y el árbol permanece compacto.

Sin embargo, la característica más importante del árbol es su alto rendimiento al buscar y expandir el árbol. La búsqueda se realiza durante la operación de lectura, cuando es necesario encontrar el bloque con la dirección dada en el disco. La extensión del árbol ocurre durante una operación de escritura, cuando agregamos nuevos datos al disco y debemos agregar una dirección al árbol donde se puede encontrar. El rendimiento es extremadamente importante cuando se trabaja con estructuras grandes, y el árbol de prefijos le permite lograrlo con un gran margen para el futuro, por ejemplo, en caso de un aumento en el volumen de los discos.

Lo que se puede decir sobre la relación entre VUA y VDA:

  1. El tamaño de VUA puede superar con creces el tamaño de VDA
  2. VUA no tiene nada que ver con VDA hasta que se escriba allí el aprovisionamiento delgado
  3. Más de un VUA puede hacer referencia a un VDA (instantáneas / clones)

Por lo tanto, la organización de VUA y VDA, las conexiones entre ellos y el direccionamiento de estas conexiones le permiten implementar instantáneas muy rápidas y aprovisionamiento delgado. Dado que crear una instantánea es solo actualizar metadatos en la memoria y es una operación constante mientras se trabaja, de hecho, esta operación no toma tiempo. Por lo general, al crear instantáneas, los sistemas de almacenamiento clásicos dejan de actualizar metadatos y / o E / S para garantizar la integridad de la transacción. Esto conduce a una latencia de E / S desigual. El sistema en cuestión funciona de manera diferente: nada se detiene y se utiliza la marca de tiempo de los metadatos del bloque (64 + 4KB) para determinar si la operación está en la instantánea. Por lo tanto, el sistema puede tomar cientos de miles de disparos sin ralentizar el trabajo,y el rendimiento de un volumen con cientos de instantáneas y un volumen sin instantáneas no es diferente. Como todo se hace en la memoria y estos son procesos regulares, se pueden tomar docenas de instantáneas por segundo en grupos de volúmenes. Esto le permite implementar la replicación asincrónica en instantáneas con una diferencia entre copias en segundos o incluso menos y sin afectar el rendimiento, lo que también es importante.

Veamos el sistema como un todo, cómo van los datos. Las operaciones se reciben a través de los puertos de los tres controladores (servidores). Los controladores de puerto funcionan en el espacio de usuario, lo que le permite reiniciarlos simplemente si cualquier combinación de eventos en los puertos suspende el controlador. En implementaciones clásicas, esto se hace en el núcleo y el problema se resuelve reiniciando todo el controlador.

A continuación, la transmisión se divide en secciones de 64 KB + 4KB. ¿Cuáles son estos 4KB adicionales? Esta es una protección contra errores silenciosos y contiene sumas de verificación, tiempo e información adicional sobre la operación, que se utiliza para clasificar esta operación y se utiliza para optimizar el almacenamiento en caché y la lectura anticipada.



Grabar en caché es algo bastante simple que no se puede decir para leer. El almacenamiento en caché de lectura funciona bien si sabemos qué leer. Los sistemas clásicos utilizan algoritmos de lectura secuencial de acceso secuencial. ¿Pero qué hacer con arbitrario? El acceso completamente aleatorio es extremadamente raro en el trabajo de aplicaciones reales, incluso emularlo correctamente es bastante difícil, escribir un generador de números aleatorios reales es una tarea bastante interesante. Pero si consideramos cada operación de E / S por separado, como se hace en los sistemas clásicos, entonces todas ellas son arbitrarias e impredecibles, excepto las completamente secuenciales. Sin embargo, si observa todo el flujo de E / S durante algún tiempo, puede ver patrones que combinan diferentes operaciones.

El caché del sistema básicamente no sabe nada sobre volúmenes, archivos, ninguna estructura lógica construida en VUA. El caché solo mira las secciones y sus metadatos, basando el almacenamiento en caché en su comportamiento y atributos, lo que le permite encontrar dependencias entre diferentes aplicaciones que están realmente conectadas. Para operaciones de entrada-salida, se construyen vectores de actividad.



El sistema acumula estadísticas, crea estos vectores de actividad, luego intenta identificar la E / S actual y vincularla a vectores conocidos o crear uno nuevo. Después de la identificación, se produce una lectura predictiva según el vector, es decir, se predice el comportamiento de las aplicaciones y se realiza una lectura predictiva para una carga aparentemente arbitraria.

Grabar en discos

14 secciones se ensamblan en franjas para el discing. Esto se realiza mediante un proceso especial que selecciona secciones para dicha tira.



A continuación, se consideran dos secciones de paridad: la banda está lista para escribir en discos. La paridad se cuenta a través de varias operaciones basadas en XOR, que es dos veces más rápido que el código Reed-Solomon. Se asigna una tira adicional (14 + 2 secciones) a un grupo RAID (RG). Un grupo RAID es solo un objeto para almacenar varias tiras, nada más. Las tiras se agrupan como se muestra a continuación, una encima de la otra, y la columna vertical se llama miembro del grupo RAID. VDS (Virtual Disk Space) es el espacio en disco disponible para los datos del usuario, y VDA es la dirección que contiene.



Una columna o miembro de un grupo RAID se escribe en un disco (PD - Unidad física) en un estante (Unidad de disco). El lugar donde se escribe un miembro del grupo RAID se llama Partición de disco (DP - Partición de unidad). El número de DP en el disco es constante e igual a 264, el tamaño depende del tamaño del disco. Este diseño le permite cargar de manera uniforme todos los discos. Al mismo tiempo, el algoritmo distribuye columnas de un grupo RAID lo más lejos posible entre sí, en diferentes discos y estantes. Esto lleva al hecho de que cuando fallan dos discos, el número de tiras comunes en ellos es mínimo al mismo tiempo, y el sistema cambia del estado de protección N a N + 1 en minutos, reconstruyendo esas tiras donde faltan dos columnas de inmediato (la confiabilidad es siete nueves )



Como resultado, el diseño lógico del sistema en su conjunto parece bastante simple y se presenta en el siguiente diagrama.



Implementación física

El sistema está hecho para que todos sus componentes estén protegidos de acuerdo con el esquema N + 2 o 2N, incluidos los canales de alimentación y de datos dentro de la matriz. Aquí está el diagrama de implementación de la fuente de alimentación.

ATS (Interruptor de transferencia automática) - ATS, interruptor de fase
BBU (Unidad de respaldo de batería) - UPS,
Nodo de fuente de alimentación ininterrumpida - controlador



Este esquema le permite proteger los controladores y la integridad de la memoria durante eventos complejos, por ejemplo, en el caso de una falla de la fuente de alimentación y un apagado temporal de un circuito de alimentación. Los UPS son manejables, lo que le permite obtener información precisa sobre la carga y cambiar de manera flexible el tamaño de la memoria caché para que el controlador siempre tenga tiempo de reiniciarlo. Es decir, el sistema comenzará a utilizar activamente el caché mucho antes, a diferencia del esquema clásico, cuando el caché se enciende solo cuando la batería está completamente cargada.

Aquí hay un diagrama de los canales de datos dentro del sistema.



Los controladores están interconectados a través de Infiniband, y están conectados a las unidades a través de SAS. Cada controlador puede acceder a todos los discos del sistema. Además, si la conexión entre el controlador y el disco no funciona, el controlador puede solicitar datos a través de otro controlador que actúa como proxy a través de Infiniband. Los estantes contienen conmutadores SAS para acceso simultáneo a los discos. Cada estante contiene 60 discos, los estantes pueden ser dos, cuatro u ocho, con un total de hasta 480 discos de 3, 4, 6, 8 o 12 TB. La capacidad total disponible para el usuario es más de 4.1PB sin compresión. Hablando de compresión, para implementar la compresión sin pérdida de rendimiento, la memoria no se comprime, como resultado, el sistema a veces funciona con la compresión activada aún más rápido: cuando lee, necesita leer menos, la potencia del procesador es suficiente con un margen,y al grabar, la respuesta va directamente de la memoria y la compresión se realiza de forma asíncrona durante la grabación directa en discos.

Los controladores contienen dos grupos de discos dentro de sí mismos: uno, sistema, para vaciar RAM y el segundo, en SSD, para almacenar en caché las operaciones de lectura (hasta 368 TB por sistema). Un caché tan grande hace posible leer de manera predictiva fragmentos grandes, y dado que los datos en la banda se seleccionan con aproximadamente la misma frecuencia de acceso, dichos fragmentos grandes no solo reducen la carga en los discos físicos, sino que también tienen grandes posibilidades de tener demanda en el futuro cercano.

Resumen

Entonces, hablamos de un sistema de almacenamiento muy interesante, que tiene una arquitectura moderna y proporciona alta capacidad, alta confiabilidad, excelente rendimiento y costo adecuado.



Fuentes
1 https://techfieldday.com/video/infinidat-solution-deep-dive/
2 https://support.infinidat.com/hc/en-us

All Articles