Lightning Memory-Mapped Database (LMDB) es una biblioteca de software que proporciona una base de datos transaccional integrada de alto rendimiento en forma de almacén de valor clave . LMDB está escrito en C con enlaces API para varios lenguajes de programación . LMDB almacena pares arbitrarios de clave / datos como matrices de bytes, tiene una capacidad de búsqueda basada en rangos, admite varios elementos de datos para una sola clave y tiene un modo especial para agregar registros al final de la base de datos (MDB_APPEND) que brinda un rendimiento de escritura espectacular aumentar sobre otras tiendas similares. [1] LMDB no es una base de datos relacional , es estrictamente un almacén de valores clave como Berkeley DB ydbm .
Autor (es) original (es) | Howard Chu |
---|---|
Desarrollador (es) | Symas |
Versión inicial | 24 de noviembre de 2011 |
Lanzamiento estable | 0.9.29 / 16 de marzo de 2021 |
Repositorio | |
Escrito en | C |
Sistema operativo | Unix , Linux , Windows , AIX , Sun Solaris , SCO Unix , macOS , iOS |
Tamaño | 64 KB |
Tipo | Base de datos incrustada |
Licencia | Licencia pública OpenLDAP ( licencia de software permisiva ) |
Sitio web | symas |
LMDB también se puede utilizar simultáneamente en un entorno multiproceso o multiproceso, con un rendimiento de lectura que se escala linealmente por diseño. Las bases de datos LMDB pueden tener solo un escritor a la vez, sin embargo, a diferencia de muchas bases de datos de valores clave similares, las transacciones de escritura no bloquean a los lectores, ni los lectores bloquean a los escritores. LMDB también es inusual en el sentido de que varias aplicaciones en el mismo sistema pueden abrir y usar simultáneamente la misma tienda LMDB, como un medio para aumentar el rendimiento. Además, LMDB no requiere un registro de transacciones (lo que aumenta el rendimiento de escritura al no necesitar escribir datos dos veces) porque mantiene la integridad de los datos inherentemente por diseño.
Historia
El diseño de LMDB se discutió por primera vez en una publicación de 2009 en la lista de correo de desarrolladores de OpenLDAP , [2] en el contexto de la exploración de soluciones a la dificultad de administración de caché causada por la dependencia del proyecto de Berkeley DB . Un objetivo específico era reemplazar las múltiples capas de configuración y almacenamiento en caché inherentes al diseño de Berkeley DB con una sola caché administrada automáticamente bajo el control del sistema operativo host .
El desarrollo comenzó posteriormente, inicialmente como una bifurcación de una implementación similar del proyecto ldapd de OpenBSD. [3] La primera versión disponible públicamente apareció en el repositorio de fuentes de OpenLDAP en junio de 2011. [4]
El proyecto se conoció como MDB hasta noviembre de 2012, después de lo cual se le cambió el nombre para evitar conflictos con el software existente. [5]
Descripción técnica
Internamente, LMDB utiliza estructuras de datos de árbol B + . La eficiencia de su diseño y su tamaño reducido tuvieron el efecto secundario involuntario de proporcionar también un buen rendimiento de escritura . LMDB tiene una API similar a Berkeley DB y dbm . LMDB trata la memoria de la computadora como un espacio de direcciones único, compartido en múltiples procesos o subprocesos usando memoria compartida con semántica de copia en escritura (conocida históricamente como un almacenamiento de un solo nivel ). Debido a que la mayoría de las antiguas arquitecturas informáticas modernas tienen limitaciones de espacio de direcciones de memoria de 32 bits, lo que impone un límite estricto de 4 GB en el tamaño de cualquier base de datos que utilice tales técnicas, la eficacia de la técnica de mapear directamente una base de datos en un almacén de un solo nivel fue estrictamente limitado. Sin embargo, los procesadores de 64 bits de hoy en día implementan principalmente espacios de direcciones de 48 bits, dando acceso a direcciones de 47 bits o 128 terabytes de tamaño de base de datos, [6] haciendo que las bases de datos que usan memoria compartida sean útiles una vez más en aplicaciones del mundo real.
Las características técnicas específicas dignas de mención de LMDB son:
- Su uso del árbol B + . Con una instancia de LMDB en memoria compartida y el tamaño del bloque del árbol B + establecido en el tamaño de la página del sistema operativo, el acceso a una tienda LMDB es extremadamente eficiente en memoria [7]
- Los datos nuevos se escriben sin sobrescribir ni mover los datos existentes. Esto da como resultado la integridad y confiabilidad de los datos garantizados sin requerir registros de transacciones o servicios de limpieza.
- La provisión de un modo de adición-escritura único (MDB_APPEND) [1] que se implementa al permitir que el nuevo registro se agregue directamente al final del árbol B + . Esto reduce el número de operaciones de lectura y escritura de la página, lo que resulta en un rendimiento mucho mayor, pero requiere que el programador sea responsable de garantizar que las claves ya estén ordenadas cuando se almacenan en la base de datos.
- La semántica de copia en escritura ayuda a garantizar la integridad de los datos , además de proporcionar garantías transaccionales y acceso simultáneo de los lectores sin requerir ningún bloqueo, incluso por parte del escritor actual. Las nuevas páginas de memoria requeridas internamente durante las modificaciones de datos se asignan a través de la semántica de copia en escritura por el sistema operativo subyacente: la biblioteca LMDB en sí nunca modifica los datos más antiguos a los que acceden los lectores porque simplemente no puede hacerlo: cualquier actualización de memoria compartida crea automáticamente una copia completamente independiente de la página de memoria en la que se está escribiendo.
- Como LMDB está mapeado en memoria, puede devolver punteros directos a direcciones de memoria de claves y valores a través de su API, evitando así la copia de memoria innecesaria y costosa. Esto da como resultado un rendimiento mucho mayor (especialmente cuando los valores almacenados son extremadamente grandes) y expande los casos de uso potenciales para LMDB.
- LMDB también rastrea las páginas de memoria no utilizadas, utilizando un árbol B + para realizar un seguimiento de las páginas liberadas (que ya no son necesarias) durante las transacciones. Al rastrear las páginas no utilizadas, se evita por completo la necesidad de recolección de basura (y una fase de recolección de basura que consumiría ciclos de CPU). Las transacciones que necesitan nuevas páginas reciben primero páginas de este árbol de páginas gratuitas no utilizadas; solo después de que se agoten, se expandirá a áreas del archivo mapeado en memoria subyacente que no se usaban anteriormente. En un sistema de archivos moderno con poca compatibilidad con archivos, esto ayuda a minimizar el uso real del disco.
El formato de archivo de LMDB, a diferencia del de Berkeley DB , depende de la arquitectura. Esto significa que se debe realizar una conversión antes de mover una base de datos de una máquina de 32 bits a una máquina de 64 bits, [8] o entre computadoras de diferente endianidad . [9]
Concurrencia
LMDB emplea control de concurrencia de múltiples versiones (MVCC) y permite múltiples subprocesos dentro de múltiples procesos para coordinar el acceso simultáneo a una base de datos. Los lectores escalan linealmente por diseño [10] [11] . Si bien las transacciones de escritura se serializan globalmente a través de un mutex , las transacciones de solo lectura operan en paralelo, incluso en presencia de una transacción de escritura, y son completamente libres de espera, excepto la primera transacción de solo lectura en un hilo. Cada hilo que se lee de una base de datos adquiere la propiedad de un elemento en una matriz de memoria compartida, que puede actualizar para indicar cuándo está dentro de una transacción. Los escritores escanean la matriz para determinar la versión más antigua de la base de datos que la transacción debe conservar, sin requerir sincronización directa con los lectores activos.
Actuación
En 2011, Google publicó un software que permitía a los usuarios generar micro-benchmarks comparando el desempeño de LevelDB con SQLite y Kyoto Cabinet en diferentes escenarios. [12] En 2012, Symas agregó soporte para LMDB y Berkeley DB y puso a disposición del público el software de evaluación comparativa actualizado. [13] Los puntos de referencia resultantes mostraron que LMDB superó a todas las demás bases de datos en operaciones de lectura y escritura por lotes. SQLite con LMDB se destacó en operaciones de escritura, y particularmente en escrituras sincrónicas / transaccionales.
Los puntos de referencia mostraron que el sistema de archivos subyacente tiene una gran influencia en el rendimiento. JFS con un diario externo funciona bien, especialmente en comparación con otros sistemas modernos como Btrfs y ZFS . [14] [15] Zimbra ha probado el rendimiento de back-mdb frente a back-hdb en OpenLDAP, con LMDB claramente superando al back-hdb basado en BDB. [16] Muchos otros usuarios de OpenLDAP han observado beneficios similares. [17]
Desde el trabajo inicial de evaluación comparativa realizado en 2012, se han realizado múltiples pruebas de seguimiento con motores de base de datos adicionales para cargas de trabajo en memoria [18] y en disco [19] que caracterizan el rendimiento en múltiples CPU y tamaños de registro. Estas pruebas muestran que el rendimiento de LMDB es incomparable en todas las cargas de trabajo en memoria y sobresale en todas las cargas de trabajo de lectura vinculadas a disco, así como en las cargas de trabajo de escritura vinculadas a disco que utilizan tamaños de registro grandes. El código del controlador de referencia se publicó posteriormente en github [20] y se amplió aún más en la cobertura de la base de datos.
Fiabilidad
LMDB se diseñó desde el principio para resistir la pérdida de datos ante fallos del sistema y de las aplicaciones. Su enfoque de copia en escritura nunca sobrescribe los datos actualmente en uso. Evitar sobrescrituras significa que la estructura en el disco / almacenamiento es siempre válida, por lo que las fallas de la aplicación o del sistema nunca pueden dejar la base de datos en un estado corrupto. En su modo predeterminado, en el peor de los casos, una caída puede perder datos de la última transacción de escritura aún no confirmada. Incluso con todos los modos asíncronos habilitados, se trata solo de un evento de falla catastrófica del sistema operativo o de pérdida de energía del hardware [21] en lugar de simplemente un bloqueo de la aplicación que podría resultar en cualquier daño de datos.
Dos artículos académicos del Simposio USENIX OSDI [22] cubrieron los modos de falla de los motores DB (incluido LMDB) bajo una pérdida repentina de energía o un bloqueo del sistema. [23] [24] El artículo de Pillai et al., No encontró ninguna falla en LMDB que ocurriría en los sistemas de archivos del mundo real considerados; la única falla identificada por el estudio en LMDB solo se relaciona con sistemas de archivos hipotéticos. [25] Mai Zheng et al. paper afirma señalar fallas en LMDB, pero la conclusión depende de si se utiliza fsync o fdatasync. El uso de fsync mejora el problema. La selección de fsync o fdatasync es un cambio en tiempo de compilación que no es el comportamiento predeterminado en las compilaciones GNU / Linux actuales de LMDB, pero es el predeterminado en macOS, * BSD, Android y Windows. Por lo tanto, las compilaciones predeterminadas de GNU / Linux de LMDB son las únicas vulnerables al problema descubierto por los investigadores de zhengmai; sin embargo, los usuarios de GNU / Linux pueden simplemente reconstruir LMDB para utilizar fsync en su lugar. [26]
Cuando se proporciona una base de datos corrupta, como una producida por fuzzing , LMDB puede fallar. El autor de LMDB considera que es poco probable que el caso sea preocupante, pero sin embargo ha producido una solución parcial en una rama separada. [27]
Licencia de código abierto
En junio de 2013, Oracle cambió la licencia de Berkeley DB (un proyecto relacionado) de la licencia Sleepycat a la Licencia Pública General Affero , [28] restringiendo así su uso en una amplia variedad de aplicaciones. Esto provocó que el proyecto Debian excluyera la biblioteca de 6.0 en adelante. También se criticó que esta licencia no sea amigable para los redistribuidores comerciales. Se desató la discusión sobre si el mismo cambio de licencia podría ocurrir en LMDB. El autor Howard Chu dejó en claro que LMDB es parte del proyecto OpenLDAP, que tenía su licencia de estilo BSD antes de unirse, y seguirá así. No se transfieren derechos de autor a nadie al registrarse, lo que haría imposible un movimiento similar al de Oracle. [29] [30] [31] [32] [33] [34] [35] [36] [37]
El problema de la licencia de Berkeley DB ha provocado que las principales distribuciones de GNU / Linux, como Debian , eliminen por completo el uso de Berkeley DB, con preferencia por LMDB. [38]
API y usos
Hay envoltorios para varios lenguajes de programación, como C ++, [39] [40] Java, [41] Python, [42] [43] Lua, [44] Go, [45] Ruby, [46] Objective C, [ 47] Javascript, [48] C #, [49] Perl, [50] PHP, [51] Tcl [52] y Common Lisp. [53] Se puede encontrar una lista completa de envoltorios en el sitio web principal. [54]
Howard Chu portó SQLite 3.7.7.1 para usar LMDB en lugar de su código de árbol B original , llamando al resultado final SQLightning. [55] Una prueba de inserción citada de 1000 registros fue 20 veces más rápida (que el SQLite original con su implementación B-Tree). [56] LMDB está disponible como almacén de respaldo para otros proyectos de código abierto, incluidos Cyrus SASL, [57] Heimdal Kerberos, [58] y OpenDKIM. [59] También está disponible en algunos otros proyectos NoSQL como MemcacheDB [60] y Mapkeeper. [61] LMDB se utilizó para hacer que el almacenamiento en memoria de Redis persista en los datos en el disco. El back-end existente en Redis mostró un comportamiento patológico en casos raros y se buscó un reemplazo. Sin embargo, la API barroca de LMDB fue criticada, lo que obligó a mucha codificación para hacer cosas simples. Sin embargo, su rendimiento y confiabilidad durante las pruebas fue considerablemente mejor que el de las tiendas alternativas de back-end que se probaron. [62]
Un desarrollador de software independiente utilizó los enlaces de Python a LMDB [63] en un entorno de alto rendimiento y publicó, en el sitio de noticias técnicas Slashdot , cómo el sistema logró mantener con éxito 200.000 operaciones simultáneas de lectura, escritura y eliminación por segundo ( un total de 600.000 operaciones de base de datos por segundo). [64] [65]
En el sitio web principal se mantiene una lista actualizada de aplicaciones que utilizan LMDB. [66]
Soporte de aplicaciones
Muchos proyectos populares de software libre distribuyen o incluyen soporte para LMDB, a menudo como mecanismo de almacenamiento principal o único.
- Los sistemas operativos Debian , [67] Ubuntu , [68] Fedora , [69] y OpenSuSE [70] .
- OpenLDAP para el que LMDB se desarrolló originalmente a través de back-mdb . [71]
- Postfix a través del Adaptador lmdb_table . [72]
- PowerDNS , un servidor DNS.
- CFEngine usa LMDB por defecto desde la versión 3.6.0. [73]
- Shopify usa LMDB en su sistema SkyDB. [74]
- Nudo DNS un servidor DNS de alto rendimiento.
- Monero, una criptomoneda de código abierto creada en abril de 2014 que se centra en la privacidad, la descentralización y la escalabilidad.
- El middleware Enduro / X usa LMDB para la caché opcional de microservicios XATMI (SOA). De modo que para la primera solicitud se invoca el servicio real, en la siguiente solicitud, el proceso del cliente lee el resultado guardado directamente desde LMDB.
Revisiones técnicas de LMDB
LMDB hace un uso novedoso de técnicas informáticas conocidas, como la semántica de copia en escritura y árboles B + para proporcionar garantías de atomicidad y confiabilidad, así como un rendimiento que puede ser difícil de aceptar, dada la relativa simplicidad de la biblioteca y que ninguna otra clave similar. -value store database ofrece las mismas garantías o rendimiento general, aunque los autores declaran explícitamente en las presentaciones que LMDB está optimizado para lectura, no para escritura. Además, como LMDB se desarrolló principalmente para su uso en OpenLDAP, sus desarrolladores se centran principalmente en el desarrollo y mantenimiento de OpenLDAP, no en LMDB per se. Por lo tanto, se criticó a los desarrolladores por el tiempo limitado que dedicaron a presentar los primeros resultados de referencia por no indicar limitaciones y por dar una "impresión mágica" que no era adecuada para abordar la actitud de los ingenieros [75] (hay que señalar que las preocupaciones planteadas, sin embargo, fueron posteriormente, adecuadamente dirigido a satisfacción del revisor por el desarrollador clave detrás de LMDB. [76] [77] )
La presentación provocó que otros desarrolladores de bases de datos analizaran el código en profundidad para comprender cómo y por qué funciona. Las revisiones van desde breves [78] a profundas. El desarrollador de bases de datos Oren Eini escribió una serie de artículos de 12 partes sobre su análisis de LMDB, a partir del 9 de julio de 2013. La conclusión fue en las líneas de "impresionante base de código ... necesita un poco de amor", principalmente debido a métodos demasiado largos y duplicación de código. [79] Esta revisión, realizada por un desarrollador de .NET sin experiencia previa en C , concluyó el 22 de agosto de 2013 con "más allá de mis problemas con el código, la implementación es realmente brillante. La forma en que LMDB logra empacar tanta funcionalidad al no hacer las cosas es bastante impresionante ... Aprendí bastante del proyecto, y ha sido una experiencia frustrante, molesta y fascinante " [80]
Varias otras revisiones cubren LMDB [81] en varios idiomas, incluido el chino. [82] [83]
Referencias
- ^ a b Guía de referencia de LMDB Archivada el 20 de octubre de 2014 en la Wayback Machine . Consultado el 19 de octubre de 2014.
- ^ back-mdb - futuros . Consultado el 19 de octubre de 2014.
- ^ MDB: una base de datos asignada en memoria y un backend para OpenLDAP . Consultado el 22 de octubre de 2018.
- ^ Primera versión pública del código fuente MDB . Consultado el 16 de marzo de 2020.
- ^ MDB renombrado a LMDB . Consultado el 16 de marzo de 2020.
- ^ Chu, Howard (2011). MDB: una base de datos asignada en memoria y un backend para OpenLDAP (PDF) . LDAPCon ..
- ^ B + árbol # Implementación
- ^ "El formato de archivo LMDB" . Preocupación separada . Consultado el 27 de febrero de 2020 .
- ^ Chu, Howard. "lmdb - ¿Es la base de datos blockchain de Monero portátil entre arquitecturas de 32 y 64 bits y arquitecturas little / big endian?" . Intercambio de pila de Monero .
- ^ escalado de puntos de referencia para LMDB
- ^ Escalado de referencia en memoria para LMDB
- ^ "Puntos de referencia de LevelDB" . Google, Inc. Archivado desde el original el 20 de agosto de 2011 . Consultado el 8 de agosto de 2014 .
- ^ Chu, Howard. "Microbenchmarks de bases de datos" . Symas Corp. Archivado desde el original el 9 de agosto de 2014 . Consultado el 8 de agosto de 2014 .
- ^ "Microbenchmarks MDB" . Symas Corp., 2012-09
- ^ Microbenchmarks de base de datos , Symas Corp., 07 de julio de 2012.
- ^ "Rendimiento OpenLDAP MDB vs HDB" . Zimbra, Inc.
- ^ "OpenLDAP: una comparación de rendimiento back-mdb y back-hdb" . 16 de mayo de 2013 . Consultado el 8 de mayo de 2017 .
- ^ Chu, Howard. "Microbenchmark en memoria" . Symas Corp. Archivado desde el original el 9 de diciembre de 2014 . Consultado el 6 de diciembre de 2014 .
- ^ Chu, Howard. "Microbenchmark en disco" . Symas Corp. Archivado desde el original el 9 de diciembre de 2014 . Consultado el 6 de diciembre de 2014 .
- ^ "Controladores de referencia" .
- ^ "Detección de corrupción LMDB" .
- ^ "OSDI 2014" . 2013-02-08.
- ^ Langston, Mark C .; Skelly, Hal (2014). OSDI 2014, No todos los sistemas de archivos se crean de la misma manera: sobre la complejidad de crear aplicaciones coherentes con las fallas . págs. 433–448. ISBN 9781931971164.
- ^ Langston, Mark C .; Skelly, Hal (2014). OSDI 2014, Torturando bases de datos por diversión y lucro . págs. 449–464. ISBN 9781931971164.
- ^ "Archivo de discusión sobre el artículo pillai de Usenix 2014" .
- ^ "Discusión de coherencia de bloqueo de LMDB" .
- ^ Debroux, Lionel (16 de junio de 2018). "oss-security - Diversión con bases de datos de tipo DBM ..." openwall.com .
- ^ "Anuncio de lanzamiento de Berkeley DB" . Oracle Corporation .
A partir de las versiones 6.0 / 12c, todos los productos Berkeley DB tienen la licencia GNU AFFERO GENERAL PUBLIC LICENSE (AGPL), versión 3. Esta licencia está publicada por la Free Software Foundation (FSF) (1) y aprobada por la Open Source Initiative. (2). Revise los términos de la licencia para garantizar el cumplimiento antes de actualizar a la versión 12c. Las versiones anteriores del software Berkeley DB continuarán distribuyéndose bajo la licencia Sleepycat.
- ^ Ondřej Surý (2 de julio de 2013). "Cambio de licencia de Berkeley DB 6.0 a AGPLv3" . debian-devel (lista de correo). Debian .
- ^ Simon Phipps (5 de julio de 2013). "Oracle cambia la licencia de Berkeley DB" . InfoWorld .
- ^ "Oracle cambia silenciosamente BerkeleyDB a AGPL" . Slashdot .
- ^ "Oracle меняет лицензию Berkeley DB" [Cambios en la licencia de Oracle Berkeley DB]. Programadores en Ucrania (en ruso). Blogspot . 22 de julio de 2013.
- ^ Jean Elyan (8 de julio de 2013). "Oracle Berkeley DB pasa bajo licencia GNU AGPL" [Oracle Berkeley DB pasa bajo GNU AGPL] (en francés). Le Monde Informatique.
- ^ Ondřej Surý (2 de julio de 2013). "Berkeley DB 6.0 vydána pod licencí AGPLv3" [Berkeley DB 6.0 se publica bajo la licencia GPLv3] (en checo). Abclinuxu.
- ^ Nathan Willis (10 de julio de 2013). "Debian, Berkeley DB y AGPLv3" . LWN.net .
- ^ Dan Shearer (2 de julio de 2013). "Cambio de licencia de Berkeley DB 6.0 a AGPLv3" . debian-devel (lista de correo). Debian .
- ^ Howard Chu (2 de julio de 2013). "Cambio de licencia de Berkeley DB 6.0 a AGPLv3" . debian-devel (lista de correo). Debian .
- ^ Ondřej Surý (19 de junio de 2014). "Nuevo objetivo del proyecto: deshacerse de Berkeley DB (post jessie)" . debian-devel (lista de correo). Debian .
- ^ Contenedor de LMDB C ++ 11 , 2015-04
- ^ Contenedor de LMDB C ++ , 2012-11.
- ↑ LmdbJava , 4 de abril de 2019
- ↑ LMDB Python wrapper , 2013-02
- ^ py-lmdb . Consultado el 20 de octubre de 2014.
- ^ Envoltorio de LMDB Lua , 4 de abril de 2013.
- ↑ LMDB Go wrapper , 2013-04
- ↑ LMDB Ruby wrapper , 2013-02
- ^ Contenedor de LMDB Objective-C , 2013-04
- ^ Contenedor de LMDB Node.js , 2013-05
- ↑ LMDB .Net wrapper , 2013-06
- ↑ LMDB Perl wrapper , 2013-08
- ^ Contenedor PHP LMDB , 2015-04
- ↑ tcl-lmdb , 11/11/2015
- ^ Usando LMDB de Common Lisp , 2016-04
- ^ "Lista de envoltorios de API para LMDB" .
- ^ "gitorious.org Git - mdb: sqlightning.git / summary" . gitorious.org . Archivado desde el original el 9 de agosto de 2013 . Consultado el 8 de mayo de 2017 .
- ^ Pruebas SQLightning .
- ^ "Cyrus IMAP - Cyrus IMAP 3.0.1 (estable) documentación" . cyrusimap.web.cmu.edu . Archivado desde el original el 30 de abril de 2017 . Consultado el 8 de mayo de 2017 .
- ^ "Heimdal" . h5l.org . Consultado el 8 de mayo de 2017 .
- ^ "OpenDKIM" . www.opendkim.org . Consultado el 8 de mayo de 2017 .
- ^ "gitorious.org Git - mdb: memcachedb.git / summary" . gitorious.org . Consultado el 8 de mayo de 2017 .
- ^ "m1ch1 / mapkeeper" . GitHub . Consultado el 8 de mayo de 2017 .
- ^ "Segundo golpe con un rayo" . Ancla. 2013-05-09.
- ^ "Enlaces de Python a LMDB" .
- ^ "Python-LMDB en un entorno de alto rendimiento en Slashdot" .
- ^ "Carta abierta a Howard Chu y David Wilson sobre Python-LMDB" .
- ^ "Lista de proyectos que utilizan LMDB" .
- ^ liblmdb0 en Debian . Consultado el 20 de octubre de 2014.
- ^ [email protected], Rhonda D'Vine. "Ubuntu - Resultados de la búsqueda de paquetes - lmdb-utils" . paquetes.ubuntu.com . Consultado el 2 de enero de 2018 .
- ^ LMDB en Fedora 20 . Consultado el 20 de octubre de 2014.
- ^ lmdb en OpenSUSE . Consultado el 20 de octubre de 2014.
- ^ OpenLDAP back-mdb . Consultado el 20 de octubre de 2014.
- ^ Postfix lmdb_table (5) . Consultado el 20 de octubre de 2014.
- ^ "Documentación CFEngine 3.6 - Nuevo en CFEngine" . docs.cfengine.com . Consultado el 8 de mayo de 2017 .
- ^ "Grupos de Google" . groups.google.com . Consultado el 8 de mayo de 2017 .
- ^ "LMDB: ¿El asesino de Leveldb?" .
- ^ "Respuesta a la revisión de LMDB" . 2013-08-19.
- ^ LMDB: ¿El asesino de Leveldb? . Consultado el 20 de octubre de 2014.
- ^ "Base de datos mapeada en memoria Lightning" .
- ^ "Revisión de la biblioteca de base de datos mapeada en memoria Lightning: parcial" .
- ^ "Algunas notas finales sobre la revisión de LMDB" .
- ^ "LMDB" . Sampath Herga. Archivado desde el original el 29 de agosto de 2013 . Consultado el 30 de agosto de 2013 .
- ^ "lmdb" .
- ^ "lmdb" . Archivado desde el original el 5 de marzo de 2016 . Consultado el 8 de mayo de 2017 .