MangoDB se moderniza y ahora cambia a ser FerretDB
Hace pocos dias se dio a conocer la noticia del lanzamiento del proyecto FerretDB, (anteriormente MangoDB), que permite reemplazar el DBMS orientado a documentos de MongoDB con PostgreSQL sin realizar cambios en el código de la aplicación.
FerretDB se implementa como un servidor proxy que traduce las llamadas a MongoDB en consultas SQL a PostgreSQL, lo que le permite usar PostgreSQL como almacenamiento real.
FerretDB (anteriormente MangoDB) se fundó para convertirse en el sustituto de código abierto de facto de MongoDB. FerretDB es un proxy de código abierto que convierte las consultas del protocolo de conexión de MongoDB a SQL, utilizando PostgreSQL como motor de base de datos.
La necesidad de migración puede surgir debido a la transición de MongoDB a una licencia SSPL no libre, que se basa en la licencia AGPLv3, pero no es de código abierto, ya que contiene un requisito discriminatorio para proporcionar bajo la licencia SSPL no solo la aplicación del código en sí, sino también los códigos fuente de todos los componentes involucrados en la prestación del servicio en la nube.
El público objetivo de FerretDB son los usuarios que no utilizan las funciones avanzadas de MongoDB en sus aplicaciones, pero desean utilizar una pila de software completamente abierta.
En la etapa actual de desarrollo, FerretDB aún admite solo una parte de las características de MongoDB que se usan con mayor frecuencia en las aplicaciones típicas. En el futuro, planean lograr una compatibilidad total con los controladores para MongoDB y brindar la capacidad de usar FerretDB como un reemplazo transparente para MongoDB.
Cabe recordar que MongoDB ocupa un nicho entre los sistemas rápidos y escalables que operan sobre datos en formato clave/valor, y los DBMS relacionales, funcionales y convenientes en la generación de consultas.
La mayoría de los usuarios de MongoDB no necesitan muchas funciones avanzadas que ofrece MongoDB; sin embargo, necesitan una solución de base de datos de código abierto fácil de usar. Reconociendo esto, FerretDB está aquí para llenar ese vacío.
MongoDB admite el almacenamiento de documentos en un formato similar a JSON, tiene un lenguaje bastante flexible para generar consultas, puede crear índices para varios atributos almacenados, proporciona almacenamiento eficiente de objetos binarios grandes, admite el registro de operaciones para cambiar y agregar datos a la base de datos, puede trabajar de acuerdo con el paradigma Map/Reduce, admite la replicación y la construcción de configuraciones tolerantes a fallas.
En el lanzamiento de FerretDB 0.1.0 se destaca que se ha rediseñado por completo la forma en que se recuperan los datos de PostgreSQL. Anteriormente, para cada solicitud entrante de MongoDB, se generaba una consulta SQL a PostgreSQL, utilizando funciones para trabajar con el formato JSON y filtrando los resultados del lado de PostgreSQL.
Debido a las diferencias en la semántica de las funciones json de PostgreSQL y MongoDB, hubo una discrepancia en el comportamiento al comparar y ordenar diferentes tipos. Para resolver este problema, ahora se extrae una muestra de datos redundantes de PostgreSQL y el filtrado del resultado se realiza en el lado de FerretDB, lo que hizo posible repetir el comportamiento de MongoDB en la mayoría de las situaciones.
El precio de una mayor compatibilidad fue una penalización en el rendimiento, que en versiones futuras se espera que se compense con el filtrado selectivo en el lado de FerretDB de solo consultas para las que existe una divergencia de comportamiento.
Por ejemplo, la consulta «db.collection.find({_id: ‘some-id-value’})» se puede procesar completamente en PostgreSQL. El objetivo principal del proyecto en esta etapa de desarrollo es lograr la compatibilidad con MongoDB, y el rendimiento aún está relegado a un segundo plano.
De los cambios funcionales en la nueva versión, hay soporte para todos los operadores de bits, el operador de comparación «$e» , así como los operadores » $elemMatch » y «$bitsAllClear».
Finalmente para quienes estén interesados en poder conocer más al respecto, deben saber que el código está escrito en Go y se distribuye bajo la licencia Apache 2.0 y pueden consultar su código en el siguiente enlace.