Ceph: un sistema de archivos distribuido de Linux a escala de petabytes
Ceph es un nombre extraño para un sistema de archivos que rompe la típica tendencia de abreviaturas que sigue la mayoría de la gente. El nombre está relacionado con la mascota de UCSC, el lugar de nacimiento de CEPH. La mascota se llama "Sammy", una babosa de color plátano, un molusco sin caparazón entre los cefalópodos. Estos cefalópodos de múltiples tentáculos proporcionan la metáfora más vívida de los sistemas de archivos distribuidos.
Desarrollar un sistema de archivos distribuido requiere mucho esfuerzo, pero si puedes resolver 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 desarrolló algunos conceptos muy interesantes (como la partición dinámica de metadatos, la distribución y replicación de datos), que solo se analizan 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, pero incluye la capacidad de adaptarse a cargas de trabajo cambiantes y ofrecer un rendimiento óptimo. Hace todo esto utilizando la compatibilidad con POSIX, lo que le permite implementar de forma transparente aplicaciones que actualmente dependen de la semántica POSIX (a través de mejoras para Ceph). Finalmente, Ceph es un almacenamiento distribuido de código abierto que forma parte del kernel principal de Linux (2.6.34).
Ahora, analicemos la estructura y los elementos centrales de alta gama de Ceph. Luego me expandiré a otro nivel, explicando algunos aspectos clave de Ceph y brindando una discusión más detallada.
El ecosistema Ceph se puede dividir aproximadamente en cuatro partes (consulte la Figura 1): cliente (usuario de datos), servidor de metadatos (almacenamiento en caché y sincronización de metadatos distribuidos), un clúster de almacenamiento de objetos (almacenamiento de datos y metadatos como objetos). para realizar otras funciones clave), y finalmente el monitor de clúster (para realizar funciones de monitoreo).
Como se muestra en la Figura 1, el cliente utiliza el servidor de metadatos para realizar operaciones de metadatos (determinar la ubicación de los datos). El servidor de metadatos gestiona la ubicación de los datos y dónde se almacenan los nuevos datos. Vale la pena señalar que los metadatos se almacenan en el 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, las funciones POSIX de nivel superior (como abrir, cerrar y cambiar nombre) son administradas por el servidor de metadatos, pero las funciones POSIX (como lectura y escritura) son administradas directamente por el clúster de almacenamiento de objetos.
La Figura 2 proporciona otra vista arquitectónica. Una serie de servidores acceden al ecosistema Ceph a través de una interfaz de cliente que muestra la relación entre los servidores de metadatos y el almacenamiento a nivel de objetos. Los sistemas de almacenamiento distribuido se pueden dividir en varias capas, incluido el formato del dispositivo de almacenamiento (sistema de archivos de objetos extendido y basado en árbol B [EBOFS] o alternativos) y los mecanismos diseñados para gestionar la replicación de datos, la detección de fallas, la recuperación y posterior migración de datos. La capa de gestión superpuesta se denomina almacenamiento de objetos distribuido autónomo confiable (RADOS). Finalmente, los monitores se utilizan para identificar fallas de componentes, incluidas notificaciones posteriores.
Después de comprender la arquitectura conceptual de Ceph, puede profundizar en otro nivel para comprender los principales componentes implementados en Ceph. Una diferencia importante entre Ceph y los sistemas de archivos tradicionales es que utiliza inteligencia en el ecosistema en lugar del sistema de archivos en sí.
La Figura 3 muestra un ecosistema Ceph simple. El cliente Ceph es el usuario del sistema de archivos ceph. El demonio de metadatos Ceph proporciona el servidor de metadatos, mientras que el demonio de almacenamiento de objetos Ceph proporciona el almacenamiento real (datos y metadatos). Finalmente, Ceph Monitor proporciona gestión de clústeres.
Cabe señalar que puede haber muchos clientes Ceph, puntos finales de almacenamiento de objetos y servidores de metadatos (según la capacidad del sistema de archivos), así como al menos un par de monitores redundantes. Entonces, ¿cómo se distribuye este sistema de archivos?
Las primeras versiones de Ceph utilizaban el sistema de archivos en el espacio del usuario (FUSE) para empujar el sistema de archivos al espacio del usuario, lo que simplificó enormemente el desarrollo. Pero hoy, Ceph se ha integrado en el kernel principal para hacerlo más rápido porque la E/S del sistema de archivos ya no requiere cambios de contexto en el espacio del usuario.
Debido a que Linux expone la interfaz pública al sistema de archivos (a través del conmutador del sistema de archivos virtual ([VFS])), la perspectiva del usuario de Ceph es transparente. Dado el potencial de que muchos servidores contengan sistemas de almacenamiento, la perspectiva del administrador debe ser diferente (consulte Recursos para obtener más información sobre la creación de un clúster Ceph). Desde la perspectiva del usuario, están accediendo a un sistema de almacenamiento de alta capacidad, pero desconocen los servidores de metadatos, los monitores y los dispositivos de almacenamiento de objetos independientes que se agregan en un grupo de almacenamiento de alta capacidad. Los usuarios solo necesitan ver un punto de montaje para realizar 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. Pero en Ceph, la inteligencia del sistema de archivos se distribuye entre los nodos, lo que simplifica la interfaz del cliente y proporciona a Ceph capacidades de expansión a gran escala (incluso dinámicas).
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 los archivos en la perspectiva de Linux se les asignará un número de nodo de índice (INO) del servidor de metadatos, que es un identificador único para el archivo. Luego inserte el archivo en algún objeto (dependiendo del 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 pseudoaleatorio y 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 consulta de datos.
La última parte de la asignación es el mapa del cluster. 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 replican y asignan 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 pueden superponerse (para redundancia y rendimiento). La asignación del servidor de metadatos al espacio de nombres se implementa 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 mantiene las posiciones de rendimiento.
Sin embargo, debido a que cada servidor de metadatos simplemente administra un espacio de nombres para una población de clientes, su aplicación principal es el almacenamiento en 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 registros a corto plazo y, finalmente, se envían al almacenamiento físico. Esta operación permite que el servidor de metadatos envíe los metadatos más recientes al cliente (esto es común en las operaciones de metadatos). Este registro también es muy útil para la recuperación de fallas: si el servidor de metadatos falla, su registro se reproducirá para garantizar que los metadatos se almacenen de forma segura en el disco.
El servidor de metadatos gestiona el espacio de inodos y convierte los nombres de archivos en metadatos. El servidor de metadatos convierte los nombres de los archivos en inodos, tamaños de archivos y datos provisionales (diseño) que el cliente Ceph utiliza para la E/S de archivos.
Ceph incluye monitores que implementan la gestión de mapas de clúster, pero algunos elementos de falla La gestión se realiza 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 asignaciones de clúster válidas. Esta función se realiza de forma distribuida, donde las actualizaciones de mapas pueden comunicarse con el tráfico actual. Ceph utiliza Paxos, una familia de algoritmos distribuidos.
Al igual que el almacenamiento de objetos tradicional, los nodos de almacenamiento de Ceph incluyen no solo almacenamiento, sino también inteligencia. Los controladores tradicionales son objetivos simples que sólo responden a los comandos del lanzador. Sin embargo, un dispositivo de almacenamiento de objetos es un dispositivo inteligente que puede actuar como objetivo e iniciador, apoyando la comunicación y la colaboració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 decidir cuál es la mejor manera de almacenar el objeto. Las primeras versiones de Ceph implementaron un sistema de archivos personalizado de bajo nivel en el almacenamiento local llamado EBOFS. El sistema implementa una interfaz no estándar para el almacenamiento subyacente que ha sido ajustada 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 almacenar nodos y ya implementa algunas características necesarias (como la integridad integrada).
Debido a que el cliente Ceph implementa CRUSH y no sabe nada acerca de la asignación de bloques 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 copien datos si se detecta una falla en el dispositivo. La recuperación de fallas distribuida también permite que los sistemas de almacenamiento escale porque la detección y recuperación de fallas se distribuyen en todo el ecosistema. Ceph llama a esto 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 visibles para el usuario. Por ejemplo, un usuario puede crear una instantánea (incluido todo) en cualquier subdirectorio de Ceph. Los cálculos de archivos y capacidad se pueden realizar a nivel de subdirectorio, lo que informará el tamaño de almacenamiento y el número de archivo 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 aún no está listo para su uso en producción. Sin embargo, considerando que Ceph se ha unido a las filas del kernel de Linux y la motivación de su fundador para continuar con la investigación y el desarrollo, debería usarse para resolver sus necesidades masivas de almacenamiento en el futuro cercano.
Ceph no es único en el espacio de los sistemas de archivos distribuidos, pero sí en su enfoque para gestionar el entorno ecológico de almacenamiento masivo. Otros ejemplos de sistemas de archivos distribuidos incluyen el Sistema de archivos de Google (GFS), el Sistema de archivos paralelo general (GPFS) y Lustre, 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 del almacenamiento masivo.