31 de Diciembre, 2012

Swift NBD Server

Mientras se acaba el año o no, he dicidido hacer pública la primera versión de un nuevo proyecto que comencé hace unas seamanas: Swift NBD Server.

Todo empezó con una de las charlas del pasado EMEA OpenStack Day (Part 2), que trataba sobre Ceph (Florian Haas estuvo genial, pero no encuentro la presentación online).

La verdad es que no tenía ni idea de cómo funcionaba Ceph, pero me pareció muy interesante que bajo varias capas de abstracción al final se tratara de un almacén de objetos (como OpenStack Object Storage, que es lo que usamos de base para implementar Memstore). ¿Y si pudieramos añadir un interfaz de dispositivo de bloques a nuestro almacenamiento?

Estuve investigando un par de días hasta que me decidí a programar un servidor NBD en Python con algunas librerías para facilitar el trabajo (sobretodo la comunicación con Memstore), principalmente porque NBD utiliza un protocolo bastante sencillo de implementar. De hecho no ha sido nada complicado tener algo funcional (durante 12 días he ido trabajando un par de horas en casa, a veces menos; tenía muy claro qué quería implementar y con Python ha sido muy rápido).

La idea es traducir las peticiones vía NBD, que tienen dos parámetros básicos: desplazamiento en el dispositivo de bloques y cantidad a leer o escribir (offset y length en el siguiente gráfico), a operaciones que realizamos en el almacén de objetos.

funcionamiento de swiftnbd

Hay otras posibilidades para implementar un dispositivo de bloques desde espacio de usuario (y con Python), e incluso podría haber hablado directamente con el módulo del kernel que maneja NBD, pero creo que no va a ser un problema en cuanto a rendimiento y además aporta alguna que otra ventaja.

En primer lugar la comunicación cliente/servidor de NBD puede ser local (recomendable, el protocolo no proporciona mecanismos de seguridad), y el cuello de botella va a estar siempre hablando con el almacén de objetos (que usa https y control de acceso con usuario y contraseña, con lo que debería ser seguro). Además quería darle una oportunidad a la portabilidad, y así no estamos restringidos solo a Linux (que sería el caso si hubiera usado ioctl directamente, claro).

Esta primera versión es beta y tiene toda la funcionalidad básica, incluyendo un caché local en memoria para agilizar las operaciones (descartando los objetos usados con menos frecuencia, aunque igual experimento con otros tipos de caché -con copia en disco, por ejemplo-). Según tenga tiempo le daré algunas vueltas más hasta llegar a una versión 1.0 que debería ya ser apta para producción.

No se trata de competir con Ceph, ni mucho menos (aquel es un proyecto que lleva muchas horas de ingeniería detrás, lo mío es más un prototipo de un par de ideas que cubre solo una pequeña parte de todo lo que hace Ceph :D), pero creo que puedo llegar a algo lo suficientemente pulido como para ser útil (por ejemplo: usar rsync con el almacén de objetos, o tener un disco con una cantidad absurda de TB accesibles como con cualquier disco local, o exportar el dispositivo de bloques vía iSCSI).

En la página del proyecto hay instrucciones sobre cómo utilizarlo, aunque tengo pendiente añadir una herramienta (swiftnbdctl o similar) que falicite trabajar con los discos.

Con esto ya me queda solo preparame para el fin de año en unas horas, así que... ¡feliz 2013!

Anotación por Juan J. Martínez, clasificada en: openstack, python, software libre.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: