high-end

EMCISA – Intelligent Storage System

Que tal gente, el día de hoy vamos a continuar con otro punto del temario de la certificación EMCISA v2, es momento de hablar de los componentes y características que conforman un sistema de almacenamiento inteligente.

En el articulo pasado platicamos sobre lo que es un RAID, sus tipos y las ventajas que nos ofrecen, pero debe de quedar claro que un simple RAID no cubre las necesidades en cuanto a I/O y alta disponibilidad de los datos se refiere. Los sistemas de almacenamiento inteligentes incluyen tecnologías para el manejo de los datos o la manera que llegan estos datos al sistema de una manera optimizada, aprovechando distintos caminos o “paths” hacia el mismo almacenamiento; de igual manera estos integran “cache” en forma de memoría DRAM esto para poder almacenar de manera temporal aquella información que es altamente requerida con lo que se logra que cada vez que se requiera un acceso a dicha información esta sea servida a partir de esta memoria o “cache” obteniendo una latencia menor y acelerando las operaciones de I/O.
Claramente no solo estaremos hablando de cache y optimización de paths, si no estaremos conociendo distintos métodos y tecnologías que nos permiten tener un manejo y acceso a la información optimizado.

¿Cuales son los componentes de un sistema de almacenamiento inteligente?

Se tienen 4 componentes principales en un almacenamiento inteligente (claramente no es la totalidad de componentes), “frontend”, cache backend y discos.

Almacenamientointeligente

Revisemos cual es el rol de cada uno de estos componentes en el procesamiento y manejo de la información:

  • Front End – este componente se encarga de manejar la interacción directa con el host que esta pidiendo acceso de cualquier tipo a la información, sea lectura o escritura. Generalmente consiste de dos o mas controladoras que a su vez tienen múltiples puertos para poder permitir la conexión de muchos servidores a la vez. La controladora es la encargada de manejar el protocolo utilizado en la comunicación, por ejemplo, iSCSI, FC, FCoE, NFS, etc; esta controladora se comunica con el cache mediante un bus de información interno, a través del cual envía escrituras y lecturas, una vez que el cache da acceso a la información (sea entregándola a partir de su memoria o acceso directo al backend) se envía un “acknowledge” o se reconoce que la operación ha sido satisfactoria.
  • Cache – el cache generalmente esta compuesto por memoria DRAM, aunque almacenamientos avanzados pueden llegar a combinar distintos niveles o “tiers” de cache, por ejemplo, DRAM, SSD, etc Este componente es critico para poder acelerar las operaciones a nivel de almacenamiento, esto se logra almacenando aquella información “caliente” o que ha mostrado una actividad (I/O) alta en la memoria propia de este cache para que los servidores que tienen acceso al sistema de almacenamiento reciban dicha información a partir de este cache y así prevenir el acceso a los discos duros mecánicos que tienen un tiempo de acceso mucho mayor a este cache hablando de tiempos en ms (de seek time) en el caso de los discos duros cuando DRAM esta por debajo del ms.El cache esta constituido por dos componentes principales “data store” y “tag ram”, donde la función del “data store” es básicamente almacenar la información en unidades llamadas “páginas” mientras que la función de “tag ram” es la darle seguimiento o saber donde se encuentra la información para poder utilizarla (parecido a lo que es un metadata), de igual manera identificar que información ha sido enviada a disco a través de un indicador “dirty bit” y por último mantener los tiempos de acceso a dicha información para poder ir determinando que información debe estar en el cache (basándose en las políticas definidas para el cache, que estaremos viendo mas adelante)Es importante saber que en el momento que un servidor pide información al sistema de almacenamiento se busca dicha información en el “tag ram” para determinar si será servida o no desde cache, en el caso que esta sea servida desde cache se le conoce como un “Read Hit”, si la información no se encuentra en cache esta tendrá que ser servida a partir de los discos en el backend y esto es conocido como “Read Miss”. En el momento que se detecta un acceso secuencial puede darse que el sistema de almacenamiento cuente con la tecnología de prefetch (este puede ser de tamaño fijo o variable) o “read ahead” a partir de la cual se definirá un conjunto de bloques o información secuencial a la información que se esta accediendo para ser transferido de los discos hacia el cache para que en el caso que el host los requiera se pueda acelerar el acceso a esta información. A mayor Read Hits mejor rendimiento se tendrá en las operaciones de lectura hacia nuestro sistema de almacenamiento.El cache no solo optimiza las operaciones de lectura, tenemos dos distintos modos de cache para las operaciones de escritura, “write-back cache” y “write-through cache” donde el primero permite tener tiempos de respuesta mas rápidos debido a que en el momento que llega una operación de escritura esta es almacenada en el cache e inmediatamente se envia un “acknowledge” o se reconoce que dicha operación de escritura ya fue realizada y mas adelante es escrita a disco o “de-staged” el segundo modo de escritura con cache o write-through cache recibe la escritura la almacena temporalmente en memoria y la escribe inmediatamente a disco después de esto por lo que el “acknowledge” o reconocimiento que la operación sucedió tiene una latencia mayor. Las operaciones que son almacenadas en ambos modos de cache será determinada por el tamaño máximo de I/O  configurado a través del cual se decide si este estará siendo almacenada en cache o enviada directamente a disco.Claramente la cantidad de cache en cualquier sistema de almacenamiento inteligente es mucho menor de el espacio disponible en disco, por lo que el cache debe de ser utilizado de manera óptima y solo almacenar la información que “merece” o debe de estar ahí para poder optimizar las operaciones de I/O, para esto se cuentan con distintos algoritmos que evitan la saturación de este componente y permite manejar los ciclos de vida de información según el uso que esta presentando, se manejan los siguientes algoritmos:Least Recently Used (LRU) – Este algoritmo se encuentra constantemente monitoreando el último acceso a la información identificando paginas almacenadas en cache que no han sido utilizadas por mucho tiempo, en el momento que dichas páginas son identificadas se marcan para ser reutilzadas o en el caso de que estas contengan información de escritura que no ha sido enviada a disco (ej. write-back cache) esta es primero enviada a disco para después marcar dichas páginas para reutilizarse.Most Recently Used (MRU) – Este algoritmo es exactamente lo opuesto a LRU, básicamente se definen las páginas del cache que han sido utilizadas recientemente tomando como premisa que debido que la información fue accedida hace poco tiempo esta no será requerida pronto.

    Independientemente de el algoritmo para mantener almacenada o no la información en cache se requiere definir en que puntos de utilización (espacio de cache consumido) se deberá realizar un “flush”  de toda aquella información que se encuentra en cache y no ha sido escrita a disco para poder gestionar el espacio disponible en cache y no saturarlo. Basadandose en la cantidad de espacio consumido del cache se definirá el ritmo de flush o escritura de información a partir del cache a disco, se tienen 3 estados, “High Watermark”, “Idle flushing” y “Forced Flushing”
    Flushes El flush de tipo “idle” sucede a un ritmo moderado debido a que esta por debajo o en el nivel de utilización marcado como “Low Watermark”, el Flush de tipo High Watermark sucede a un ritmo mas rápido debido a que ya se superó o se encuentra en uso la cantidad de páginas de cache marcadas como “High Watermark” y para el último tipo de flush que es llamado “Forced Flushing” básicamente el cache ha llegado a un 100% de consumo de espacio por lo que se requiere un ritmo de escritura de la información en cache hacia el disco muy rápida, a mayor ritmo de escritura el sistema de almacenamiento dedica mayor cantidad de recursos para poder cumplir con el ritmo.

    Algo que pueden estar pensando en este momento es, “Esta bastante interesante todo este tema de cache, su funcionamiento, etc, ¿Pero acaso no tenemos información en el cache que no ha sido escrita o flushed a discos? ¿Que hay de la protección para el cache y/o la información que vive en el?” y esto es justamente lo que estaremos comentando a continuación, debemos de considerar que al tratarse de manejo de información siempre debemos de tener en mente nuestros SPOFs o “Singe Points of Failure” por lo que se manejan dos principales métodos para proteger aquella información que continua en el cache y no ha sido escrita a disco, Cache Mirroring y Cache Vaulting.

    Cache Mirroring – Con este método básicamente lo que se esta realizando es tener una copia exacta de todas aquellas operaciones de I/O que son escrituras y que están viviendo en el cache (básicamente información que no ha sido escrita a disco) por lo que contamos con distintas unidades de memoría donde la información es copiada por si se da el caso de tener una falla en alguna de las unidades de memoria, esto lo podríamos ver como un nivel de RAID 1. Cabe destacar que en ambas copias se lleva un seguimiento puntual de la estructura y la información que vive en ellas debido a que debemos de contar con la misma información y que esta este integra, a este proceso se le conoce como “cache coherency”.

    Cache Vaulting – Este método logra proteger la información que vive en el cache a través de discos dedicados a almacenar la información que este activa en el cache, por lo que cuando se tiene un problema de energía eléctrica la información es copiada a estos discos dedicados como “vault” donde la información deja de ser volátil, en el momento que la energía eléctrica regresa esta información es copiada de nuevo al cache y es escrita a los discos donde debía de ser escrita en un principio.

  • Back End – Este componente de el sistema de almacenamiento inteligente sirve como interfaz de comunicación entre el cache y los discos físicos, en este  se encuentra los distintos algoritmos para permitir una configuración de RAID. El flujo de información sucede de la siguiente manera, una vez que la operación de escritura es enviada a escribirse a disco desde el cache, llega al backend donde puede ser almacenada por una breve ventana de tiempo para después ser ruteada hacia el o los discos donde debe de estar viviendo. En el backend también se cuenta con mecanismos para detectar errores y corregirlos además de los mecanismos para controlar el o los niveles de RAID, estas controladoras están conectadas a los discos a través de puertos que tiene cada controladora generalmente hablamos de dos o mas controladoras para brindar alta disponibilidad y múltiples paths de acceso a los discos físicos
  • Discos Físicos – básicamente aquí estamos hablando de discos como los conocemos, generalmente este tipo de sistemas de almacenamiento tienen soporte para distintos tipos de discos, desde SAS, SATA, EFD, FC, etc. Aquí es donde sucede todo la asignación y reservación de espacio según distintas políticas definidas donde podemos estar hablando de alta disponibilidad, rendimiento, capacidad, etc. este proceso es conocido como “storage provisioning” o asignación de almacenamiento.Para asignar espacio primero debemos segmentar o agrupar los discos físicos en grupos lógicos a los cuales se les asigna un nivel de RAID, a este grupo lógico se le conoce como RAID Set, dependiendo de la cantidad de discos y el tipo de los mismos (claramente tomando en cuenta el nivel de RAID aplicado) se contará con cierta cantidad de espacio utilizable, cierto rendimiento y disponibilidad de los datos.
    Provisioning
    Una vez creado el RAID Set este es particionado con lo que se crean las unidades lógicas que estarán siendo entregadas a los servidores que requieren acceso a disco, estas unidades se les conoce como LUNs o Logical Unit Number, a cada unidad se le asigna un número único. Estos LUNs son básicamente una porción de espacio del total con el que se cuenta en el RAID Set, los sistemas de almacenamiento tradicionales entregan estos LUNs en formato “thick” o con asignación completa del espacio configurado, mientras que los sistemas de almacenamiento avanzados pueden entregar los LUNs en un modo “virtual” o “thin” en la imagen podemoslunthin notar que básicamente la entrega de almacenamiento en modo virtual o “thin” es presentar al servidor que requiere acceso a espacio en disco un LUN que desde la perspectiva del Sistema Operativo es reconocido como el espacio en su totalidad (en este ejemplo 80GB) pero en el sistema de almacenamiento solo estará ocupando aquel espacio que haya sido escrito a dicho LUN, la ventaja de este método de asignación es que podemos contar con “overcommitment” o asignar mayor cantidad de espacio en disco de la cual tenemos en realidad en nuestro sistema de almacenamiento (existen múltiples consideraciones al entregar LUNs en thin Provision). Thin Provision permite entregar el espacio bajo demanda y no asignar desde el inicio la totalidad de el espacio.

    Algunas de las consideraciones que debemos tener en el momento de decidir si estaremos asignando el espacio de manera tradicional o “thick” o lo estaremos haciendo a través de Thin Provision o “virtual” son:

    1. Si la aplicación requiere un rendimiento esperado lo mas recomendable es Thick provision.
    2. Contamos con aplicaciones o servicios con información que es modificada constantemente o que incrementa de manera sustancial, para esto de igual manera se recomienda thick provision.
    3. Se tiene aplicaciones o servicios que no cambiarán su información de manera constante, no escribirán a disco o básicamente tienen contenido estático, para esto podemos utilizar thin provision

    Claramente estas no son todas las consideraciones que existen pero es un claro ejemplo que debemos planear que tipo de LUNs estaremos asignando según los requerimientos que se presenten.

    Una vez que el espacio de un LUN fue definido contamos con distintos métodos para poder incrementar el espacio vamos a echarle un vistazo:
    MetaLUN – es la manera que tenemos para poder expander un LUN existente ya sea para darle mejor rendimiento o agregar espacio. Un MetaLUN básicamente es la construcción lógica a partir de dos o más LUNs, se tiene el LUN inicial que es llamado LUN Base y una o más LUNs componentes, una vez que agregamos una o mas LUNs como resultado tenemos un “MetaLUN” que nos brindará espacio extra o un rendimiento mayor. Se cuenta con dos métodos para crear un MetaLUN, concatenación de dos o más LUNs o stripe.

    METALUN En el caso de tener un MetaLUN debemos comprender que al concatenar 2 o mas LUNs no estaremos teniendo ninguna ganancia en cuanto a rendimiento se refiere ya que no se estará realizando un stripe de la información en la nueva LUN (recordemos que el proceso de Stripping es distribuir la los datos en varios discos, en este caso al referirnos de LUNs sería la distribución de la información en varios LUNs). Claramente cuando creamos un MetaLUN con stripping además de incrementar el espacio también estaremos beneficiándonos de un mejor rendimiento debido a que estaremos sirviendo la información de todos los discos que han sido asignados a cada uno de los LUNs que constituyen el MetaLUN.

    Para poder presentar los LUNs disponibles a nuestros servidores debemos definir que hosts tienen acceso a los LUNs, esto se le conoce como LUN Masking. En el momento de realizar LUN masking debemos definir los LUNs y los identificadores de los Hosts según el protocolo que estemos utilizando, ej. iSCSI, FC, etc. (IQNs para iSCSI, WWNs para FC). Esto es controlado del lado del sistema de almacenamiento, por lo que en el momento que un servidor quiere acceder al LUN se verificará si el identificador del servidor esta permitido para acceder y que tipo de permiso tiene (ej. escritura/lectura o solo lectura).

Tipos de almacenamientos inteligentes

Los sistemas de almacenamiento son clasificados en dos tipos, High-end y Midrange:

  • High-End Storage Systems – este tipo de sistemas están pensados para cargas altamente transaccionales y/o críticas, cuentan con múltiples controladoras en modo activo-activo para brindar acceso a los distintos LUNs, en este caso cualquier controladora permite acceso a los LUNs. Generalmente este tipo de almacenamientos ofrecen mayor cantidad de espacio, de cache, arquitecturas tolerantes a fallos, etc. Un ejemplo claro de este tipo de almacenamientos inteligentes es Symmetrix de EMC.
  • Midrange Storage Systems – este tipo de sistemas cuentan generalmente con dos controladoras en un esquema activo-pasivo, es decir, una controladora es dueña de ciertas LUNs, lo que quiere decir es que cualquier actividad de I/O debe de llegar a través de la controladora dueña de la LUN, mientras que la otra controladora permanece pasiva. En el caso de tener una falla en alguna controladora se puede dar un “trespassing” de la controladora fallida a la controladora que permanece funcional con esto dicha controladora se vuelve dueña de los LUNs que eran controlados por la otra controladora que falló. Un ejemplo de almacenamiento midrange es VNX de EMC.