Ceph: un sistema de archivos distribuido de Linux a escala de petabytes
Ceph fue originalmente un proyecto de investigación de doctorado sobre sistemas de almacenamiento, implementado por Sage Weil en la Universidad de California, Santa Cruz (UCSC). Pero a finales de marzo de 2010, se podía encontrar Ceph en el núcleo principal de Linux (comenzando con la versión 2.6.34). Si bien es posible que Ceph aún no esté listo para producción, puede resultar muy útil para realizar pruebas. Este artículo explora el sistema de archivos Ceph y sus características únicas que lo convierten en la alternativa más atractiva para el almacenamiento distribuido escalable.
"Ceph" es un nombre extraño para un sistema de archivos y rompe con la tendencia de abreviatura típica que sigue la mayoría de la gente. El nombre está relacionado con la mascota de UCSC (el lugar de nacimiento de Ceph), que es "Sammy", una babosa de color plátano, un molusco sin caparazón de la familia de los cefalópodos. Estos cefalópodos de múltiples tentáculos proporcionan la metáfora más vívida de un sistema de archivos distribuido.
Desarrollar un sistema de archivos distribuido requiere mucho esfuerzo, pero si resuelve el problema con precisión, no tiene precio. Los objetivos de Ceph se definen simplemente como:
Desafortunadamente, estos objetivos pueden competir entre sí (por ejemplo, la escalabilidad puede degradar o inhibir el rendimiento o afectar la confiabilidad). Ceph desarrolla algunos conceptos muy interesantes (por ejemplo, partición dinámica de metadatos, distribución y replicación de datos) que solo se exploran brevemente en este artículo. El diseño de Ceph también incluye tolerancia a fallas para proteger puntos únicos de falla, asumiendo que las fallas de almacenamiento a gran escala (almacenamiento a escala de petabytes) son la regla y no la excepción. Finalmente, su diseño no asume una carga de trabajo particular, sino que incluye la capacidad de adaptarse a cargas de trabajo cambiantes y proporcionar un rendimiento óptimo. Logra todo esto aprovechando la compatibilidad con POSIX, lo que permite implementarlo de forma transparente para aplicaciones que actualmente dependen de la semántica POSIX (a través de mejoras dirigidas a Ceph). Finalmente, Ceph es un almacenamiento distribuido de código abierto y es parte del kernel principal de Linux (2.6.34).
Ahora, exploremos la arquitectura de Ceph y los elementos centrales de alta gama. Luego pasaré a otro nivel y explicaré algunos aspectos clave de Ceph, brindando una discusión más detallada.
El ecosistema Ceph se puede dividir aproximadamente en cuatro partes (ver Figura 1): cliente (usuario de datos), servidor de metadatos (almacenamiento en caché y sincronización de metadatos distribuidos) y un clúster de almacenamiento de objetos (datos y metadatos como objeto). almacenamiento, que realiza otras funciones clave) y, finalmente, el monitor del clúster (que realiza funciones de supervisión).
Como se muestra en la Figura 1, los clientes utilizan un servidor de metadatos para realizar operaciones de metadatos (para determinar la ubicación de los datos). El servidor de metadatos gestiona la ubicación de los datos y dónde se almacenan los datos nuevos. Vale la pena señalar que los metadatos se almacenan en un clúster de almacenamiento (etiquetado como "E/S de metadatos"). La E/S de archivos real se produce entre el cliente y el clúster de almacenamiento de objetos. De esta manera, la funcionalidad POSIX de nivel superior (por ejemplo, abrir, cerrar, cambiar nombre) es administrada por el servidor de metadatos, pero la funcionalidad POSIX (por ejemplo, leer, escribir) es administrada directamente por el clúster de almacenamiento de objetos.
Otra vista arquitectónica la proporciona la Figura 2. Una serie de servidores acceden al ecosistema Ceph a través de una interfaz de cliente, que comprende la relación entre los servidores de metadatos y el almacenamiento a nivel de objetos. Los sistemas de almacenamiento distribuido se pueden ver en varias capas, incluido un formato de dispositivo de almacenamiento (Sistema de archivos de objetos basado en extensión y árbol B [EBOFS] o una alternativa) y un diseño para administrar la replicación de datos, la detección de fallas y la administración de superposiciones. La capa para la recuperación y posterior migración de datos se denomina almacenamiento de objetos distribuido autónomo confiable (RADOS). Finalmente, los monitores se utilizan para identificar fallas de componentes, incluidas notificaciones posteriores.
Ahora que comprende la arquitectura conceptual de Ceph, puede profundizar a otro nivel y comprender los principales componentes implementados en Ceph. Una de las diferencias importantes entre Ceph y los sistemas de archivos tradicionales es que aporta inteligencia al ecosistema en lugar del sistema de archivos en sí.
La Figura 3 muestra un ecosistema Ceph simple. Ceph Client es un usuario del sistema de archivos Ceph. Ceph Metadata Daemon proporciona el servidor de metadatos, mientras que Ceph Object Storage Daemon proporciona el almacenamiento real (tanto para datos como para metadatos). Finalmente, Ceph Monitor proporciona gestión de clústeres. Tenga en cuenta que puede haber muchos clientes Ceph, puntos finales de almacenamiento de objetos, servidores de metadatos (según la capacidad del sistema de archivos) y al menos un par de monitores redundantes. Entonces, ¿cómo se distribuye este sistema de archivos?
Las primeras versiones de Ceph utilizaban Filesystems in User SpaceE (FUSE), lo que llevó el sistema de archivos al espacio del usuario y simplificó enormemente su desarrollo. Pero hoy, Ceph se ha integrado en el kernel principal, haciéndolo más rápido porque los cambios de contexto del espacio de usuario ya no son necesarios para la E/S del sistema de archivos.
Dado que Linux expone una interfaz pública para el sistema de archivos (a través del conmutador del sistema de archivos virtual [VFS]), la perspectiva del usuario de Ceph es transparente. La perspectiva del administrador es ciertamente diferente, considerando que muchos servidores potencialmente contendrán sistemas de almacenamiento (para obtener más información sobre la creación de un clúster Ceph, consulte la sección Recursos). Desde la perspectiva del usuario, acceden a un sistema de almacenamiento de gran capacidad sin saber que los servidores de metadatos subyacentes, los monitores y los dispositivos de almacenamiento de objetos independientes están agregados en un grupo de almacenamiento de gran capacidad. El usuario simplemente ve un punto de montaje desde el cual se puede realizar la E/S de archivos estándar.
El sistema de archivos Ceph, o al menos la interfaz del cliente, está implementado en el kernel de Linux. Vale la pena señalar que en la mayoría de los sistemas de archivos, todo el control y la inteligencia se realizan dentro del propio sistema de archivos del núcleo. Sin embargo, en Ceph, la inteligencia del sistema de archivos se distribuye entre los nodos, lo que simplifica la interfaz del cliente y proporciona a Ceph la capacidad de escalar masivamente (incluso dinámicamente).
Ceph utiliza una alternativa interesante en lugar de depender de listas de asignación (metadatos que asignan bloques en el disco a archivos específicos). A un archivo en la perspectiva de Linux se le asigna un número de inodo (INO) del servidor de metadatos, que es un identificador único para el archivo. Luego, el archivo se inserta en algunos objetos (según el tamaño del archivo). Usando INO y el número de objeto (ONO), a cada objeto se le asigna una ID de objeto (OID). Utilizando un hash simple en el OID, cada objeto se asigna a un grupo de ubicación. Un grupo de ubicación (identificado como PGID) es un contenedor conceptual para objetos. Finalmente, el mapeo de grupos de ubicación a dispositivos de almacenamiento de objetos es un mapeo pseudoaleatorio que utiliza un algoritmo llamado Replicación controlada bajo hash escalable (CRUSH). De esta manera, el mapeo de grupos de ubicación (y réplicas) a dispositivos de almacenamiento no depende de ningún metadato, sino de una función de mapeo pseudoaleatorio. Esta operación es ideal porque minimiza la sobrecarga de almacenamiento y simplifica la asignación y la búsqueda de datos.
El componente final de la asignación es el mapa de clusters. Un mapa de clúster es una representación válida de un dispositivo que muestra el clúster de almacenamiento. Con PGID y mapeo de clústeres, puede apuntar a cualquier objeto.
El trabajo del servidor de metadatos (cmds) es gestionar el espacio de nombres del sistema de archivos. Aunque tanto los metadatos como los datos se almacenan en el clúster de almacenamiento de objetos, se administran por separado para admitir la escalabilidad. De hecho, los metadatos se dividen aún más en un grupo de servidores de metadatos que pueden replicar y asignar espacios de nombres de forma adaptativa para evitar puntos críticos.
Como se muestra en la Figura 4, el servidor de metadatos administra partes del espacio de nombres que se pueden superponer (para redundancia y rendimiento). La asignación del servidor de metadatos al espacio de nombres se realiza en Ceph mediante la partición lógica de subárbol dinámico, lo que permite a Ceph adaptarse a las cargas de trabajo cambiantes (migrar espacios de nombres entre servidores de metadatos) mientras se preserva el rendimiento.
Pero debido a que cada servidor de metadatos simplemente administra el espacio de nombres de la población de clientes, su uso principal es como caché de metadatos inteligente (ya que los metadatos reales se almacenan en última instancia en el clúster de almacenamiento de objetos). Los metadatos para las operaciones de escritura se almacenan en caché en un registro a corto plazo, que finalmente se envía al almacenamiento físico. Esta acción permite que el servidor de metadatos devuelva los metadatos más recientes al cliente (esto es común en las operaciones de metadatos). Este registro también es útil para la recuperación de fallas: si el servidor de metadatos falla, su registro se reproduce, lo que garantiza que los metadatos se almacenen de forma segura en el disco.
El servidor de metadatos gestiona el espacio de inodo y convierte los nombres de archivos en metadatos. El servidor de metadatos convierte nombres de archivos en inodos, tamaños de archivos y datos provisionales (diseño) utilizados por los clientes de Ceph para la E/S de archivos.
Ceph incluye monitores que implementan la gestión de mapas de clústeres, pero algunos elementos de gestión de fallos se realizan dentro del propio almacén de objetos. Cuando falla un dispositivo de almacenamiento de objetos o se agrega un nuevo dispositivo, el monitor detecta y mantiene un mapa de clúster válido. Esta función se realiza de forma distribuida en la que las actualizaciones de mapas se comunican con el tráfico actual. Ceph utiliza Paxos, que es una familia de algoritmos de consenso distribuido.
Al igual que el almacenamiento de objetos tradicional, los nodos de almacenamiento de Ceph incluyen no solo almacenamiento, sino también inteligencia. Los conductores tradicionales son objetivos simples que sólo responden a las órdenes del iniciador. Pero los dispositivos de almacenamiento de objetos son dispositivos inteligentes que pueden servir como objetivos e iniciadores, apoyando la comunicación y la cooperación con otros dispositivos de almacenamiento de objetos.
Desde una perspectiva de almacenamiento, el dispositivo de almacenamiento de objetos Ceph realiza el mapeo de objetos a bloques (una tarea que a menudo se realiza en la capa del sistema de archivos del cliente). Esta acción permite a la entidad local determinar cómo almacenar mejor un objeto. Las versiones anteriores de Ceph implementaron un sistema de archivos personalizado de bajo nivel en el almacenamiento local llamado EBOFS. Este sistema implementa una interfaz no estándar para el almacenamiento subyacente que está optimizada para la semántica de objetos y otras características, como la notificación asincrónica de confirmaciones de disco. Hoy en día, el sistema de archivos B-tree (BTRFS) se puede utilizar para nodos de almacenamiento y ya implementa algunas de las funciones necesarias (como la integridad integrada).
Debido a que el cliente Ceph implementa CRUSH y no sabe nada acerca de los bloques mapeados de archivos en el disco, el dispositivo de almacenamiento subyacente puede administrar de forma segura la asignación de objeto a bloque. Esto permite que los nodos de almacenamiento repliquen datos si se detecta una falla en el dispositivo. La distribución de la recuperación de fallas también permite que los sistemas de almacenamiento escale porque la detección y recuperación de fallas se distribuye en todo el ecosistema. Ceph lo llama RADOS (ver Figura 3).
Por si la naturaleza dinámica y adaptativa del sistema de archivos no fuera suficiente, Ceph también realiza algunas funciones interesantes que son visibles para el usuario. Los usuarios pueden crear instantáneas, por ejemplo, en cualquier subdirectorio de Ceph (incluido todo el contenido). Los cálculos de archivos y capacidad se pueden realizar a nivel de subdirectorio, informando el tamaño de almacenamiento y la cantidad de archivos para un subdirectorio determinado (y su contenido).
Aunque Ceph ahora está integrado en el kernel principal de Linux, solo está marcado como experimental. Un sistema de archivos en este estado es útil para realizar pruebas, pero no está listo para producción. Pero dada la inclusión de Ceph en el kernel de Linux y la motivación de su creador para continuar con el desarrollo, no pasará mucho tiempo antes de que pueda usarse para resolver sus necesidades de almacenamiento masivo.
Ceph no es único en el espacio de los sistemas de archivos distribuidos, pero sí lo es en su enfoque para gestionar un gran ecosistema de almacenamiento. Otros ejemplos de sistemas de archivos distribuidos incluyen el Sistema de archivos de Google (GFS), el Sistema de archivos paralelo general (GPFS) y Lustre, solo por nombrar algunos.
La idea detrás de Ceph ofrece un futuro interesante para los sistemas de archivos distribuidos, ya que el almacenamiento masivo plantea el único desafío de los problemas de almacenamiento masivo.