InfinityDB - Enciclopedia
InfinityDB es un motor de base de datos嵌入式 de Java y un DBMS cliente/servidor con una interfaz extendida java.util.concurrent.ConcurrentNavigableMap (un subinterfaz de java.util.Map) que se despliega en dispositivos portátiles, en servidores, en estaciones de trabajo y en configuraciones distribuidas. El diseño se basa en una arquitectura de B-tree concurrente y sin bloqueos de propiedad que permite a los programadores de clientes alcanzar niveles altos de rendimiento sin riesgo de fallos.
Una nueva versión 5.0 de Cliente/Servidor está en pruebas alpha, integrando la versión嵌入式 estable para proporcionar acceso compartido a través de un servidor remoto seguro.
En el sistema嵌入式, los datos se almacenan y se recuperan de un solo archivo de base de datos嵌入式 utilizando la API InfinityDB que permite el acceso directo a los espacios de elementos de longitud variable. Los programadores de clientes de bases de datos pueden construir relaciones tradicionales así como modelos especializados que satisfacen directamente las necesidades de la aplicación dependiente. No hay límite para el número de elementos, el tamaño de la base de datos o el tamaño de la JVM, por lo que InfinityDB puede funcionar tanto en el entorno más pequeño que proporciona almacenamiento de acceso aleatorio como puede escalarse a grandes configuraciones. Las relaciones tradicionales y los modelos especializados pueden dirigirse al mismo archivo de base de datos. InfinityDB puede optimizarse para relaciones estándar así como para todos los otros tipos de datos, permitiendo a las aplicaciones de clientes realizar al menos un millón de operaciones por segundo en un sistema virtual de 8 núcleos.
AirConcurrentMap es un mapa en memoria que implementa la interfaz Java ConcurrentMap, pero internamente utiliza un diseño multi-núcleo para que su rendimiento y memoria lo hagan el más rápido de Java Map cuando se realiza el ordenamiento y cuando mantiene un número medio a grande de entradas. La iteración de AirConcurrentMap es más rápida que cualquier iterador de Map de Java, independientemente del tipo específico del mapa.
API de Map
InfinityDB se puede acceder como una java.util.concurrent.ConcurrentNavigableMap extendida estándar o a través de una API de 'ItemSpace' de bajo nivel. La interfaz ConcurrentNavigableMap es un subinterfaz de java.util.Map pero tiene métodos de ordenamiento y concurrencia especiales: es la misma API que java.util.concurrent.ConcurrentSkipListMap. Los mapas pueden anidarse para formar estructuras complejas. Los mapas tienen la semántica estándar, pero trabajan internamente en un 'espacio de tuplas', mientras que los mapas no se almacenan realmente sino que son ayudantes, cada uno representando nada más que un prefijo inmutable de tupla. Los mapas pueden crearse dinámicamente a alta velocidad si es necesario para el acceso, y son thread-safe y concurrentes multi-núcleo. Los tipos de clave y valor disponibles incluyen todos los tipos de datos primitivos de Java, fechas, cadenas, pequeños arrays de char o byte, 'ByteStrings', índices de 'grandes arrays', Objetos Long de Character o Binarios Long, además de los tipos de propósito especial 'EntityClass' y 'Attribute'. Los mapas pueden tener múltiples valores. Las aplicaciones pueden optar por usar el acceso basado en Map solo y pueden mezclar acceso de bajo nivel 'ItemSpace' sobre los mismos tuplos, ya que el acceso de Map es solo un envoltorio y no hay distinción a nivel de tupla.
Modelo de datos de bajo nivel 'ItemSpace'
Las 12 tipos de datos primitivos se denominan 'componentes' y son atómicos. Los componentes pueden concatenarse en compuestos cortos llamados 'Items', que son la unidad de almacenamiento y recuperación. Las estructuras de nivel superior que combinan estos Items son diseñadas por el cliente y incluyen, por ejemplo, registros de tamaño ilimitado con un número ilimitado de columnas o atributos, con valores de atributo complejos de tamaño ilimitado. Las claves pueden ser una composición de componentes. Los valores de atributo pueden ser conjuntos ordenados de componentes compuestos, objetos grandes de caracteres (CLOB), objetos grandes binarios (BLOB) o arrays dispersos ilimitados. Otras estructuras de nivel superior construidas con múltiples Items incluyen asociaciones clave/valor como mapas ordenados, conjuntos ordenados, redes de cuádruplos de Entidad-Attributo-Valor, árboles, DAG, taxonomías o índices de texto completo. Pueden ocurrir mezclas de estos junto con otras estructuras definidas por el cliente. Cualquier ItemSpace puede representarse como un documento JSON extendido, y se proporcionan impresoras y analizadores JSON. Los documentos JSON no son nativos pero se mapean a conjuntos de Items cuando se desee, en cualquier escala determinada por un prefijo de Item que representa la ruta al subdocumento. Por lo tanto, toda la base de datos o cualquier subárbol de la misma hasta un valor único puede representarse como JSON extendido. Porque los Items siempre se mantienen ordenados, las claves de objeto de un objeto siempre están en orden.
Codificación de datos
Un 'ItemSpace' representa toda la base de datos y es un conjunto ordenado simple de Items, sin otra状态下。Un Item se almacena realmente con cada componente codificado en forma de binario de longitud variable en un array de char, con componentes que se describen a sí mismos en un formato estándar que se ordena correctamente. Los programadores solo manejan los componentes como primitivos y los datos almacenados son fuertemente tipificados. Los datos no se almacenan como texto para ser analizados con tipificación débil como en JSON o XML, ni se analizan fuera de las representaciones de flujo binario definidas por el programador. No hay formatos binarios definidos por el cliente que puedan volverse frágiles y que puedan tener problemas de seguridad, documentación, actualización, prueba, versionado, escalabilidad y depuración, como es el caso de la serialización de objetos Java.
Escalabilidad de rendimiento
Todo el acceso al sistema se realiza a través de unos pocos métodos básicos que pueden almacenar o recuperar en orden un 'Item' o 'tupla' de longitud variable a una velocidad que es del orden de 1M operaciones/segundo cuando se realiza en memoria. Las operaciones son o bien la API de Map API estándar para get(), put(), iterators, etc., o en el nivel inferior, insert(), delete(), update(), first(), next(), last() y previous(). Los Items típicos son aproximadamente de 30 bytes sin comprimir en memoria, pero los LOB, por ejemplo, utilizan Items de 1 KB. Porque cada operación afecta solo un Item, los pequeños estructuras de datos son rápidas de acceder. Esto contrasta con el acceso en lotes, como por ejemplo, el formateo y el análisis de textos JSON o XML enteros o gráficos de serialización de objetos Java enteros. La escalabilidad de espacio y rendimiento de un ItemSpace es suave ya que cualquier tamaño de estructura de datos multi-Item impuesta por el cliente se crea, crece, se reduce o desaparece. El rendimiento en almacenamiento es como cualquier B-tree orientada a bloques, con bloques de aproximadamente 4 KB, lo que es O(log(n)) por acceso. Hay un caché de bloques de 2.5 MB por defecto, que es de tamaño ilimitado pero que a menudo es de aproximadamente 100 MB. El caché solo crece según sea necesario.
Escalabilidad de espacio
Para el rendimiento y la eficiencia, los Items se almacenan dentro de un solo prefijo comprimido de B-tree y de longitud variable como una secuencia ininterpretada de bytes para una mayor compresión. El B-tree puede crecer hasta el rango de 100 GB pero no tiene límites. Hay solo un archivo, por lo que no hay registro u otros archivos para escribir y vaciar. InfinityDB minimiza el tamaño de su archivo de base de datos a través de cuatro tipos de compresión (prefijo, sufijo, zlib y UTF-8).
Actualización sin esquema
La actualización del esquema cuando las estructuras se amplían o modifican se realiza mediante la adición o eliminación de Items de nuevas formas en tiempo de ejecución, y no hay scripts de actualización - por lo tanto, el modelo de datos es NoSQL y sin esquema.
Además de los tipos de datos primitivos normales de Java, hay tipos de datos 'EntityClass' y 'Attribute', cada uno identificado por un nombre o número. Estos son 'metadatos' opcionales que pueden mezclarse con otros componentes de cualquier Item. Se pueden usar para representar tablas, por ejemplo, donde cada tabla se le da una EntityClass particular cerca del frente del Item y cada columna se le da un Attribute diferente. Los Items de la tabla comienzan con una EntityClass particular, luego hay uno o más primitivos normales que representan una 'entidad' (como una clave) luego hay un Attribute particular correspondiente a una columna y finalmente algunos primitivos normales que representan el valor de ese Attribute. Este patrón simple se puede ampliar en cualquier momento para permitir tablas anidadas dentro de cualquier Attribute, o Attributes anidados dentro de otros Attributes, o Attributes de múltiples valores y mucho más. No hay esquema fijo en otro lugar, por lo tanto, los nuevos datos que llegan al sistema se describen a sí mismos, a nivel de granularidad de Item. Los números o nombres de EntityClass y Attribute pueden representarse en JSON extendido. Cuando los datos se visualizan en el navegador de base de datos Cliente/Servidor basado en web, se pueden ver, manipular y transferir como una lista de Items ordenados y formateados, o como documentos JSON, o como tablas anidadas cuyas estructuras visibles se determinan por las EntityClass y Attributes que se mezclan en los Items. La flexibilidad dinámica del JSON y la formalidad de las tablas se combinan.
Transacciones
Se proporcionan transacciones globales 'ACD' y por hilo 'ACID'. Cada instancia de InfinityDB almacena datos en un solo archivo de base de datos y no requiere archivos adicionales de registro o de rollback. En el caso de cualquier catástrofe excepto la falta de energía o otros fallos de hardware, la base de datos está garantizada para ser consistente con el estado en el momento de la finalización del último commit global. La recuperación después de una interrupción brusca es inmediata y no requiere una reproducción lenta del registro. La carga masiva es transaccional globalmente con tamaño de datos ilimitado y es concurrente con todos los otros usos. Las transacciones globales no proporcionan aislamiento entre hilos, por lo que la semántica es 'ACD' (en lugar de 'ACID'). Alternativamente, las transacciones ACID utilizan el bloqueo optimista para permitir el aislamiento entre hilos.
Recolección inmediata de basura
A medida que los estructuras de datos crecen y se reducen, el espacio libre se recupera inmediatamente y se hace disponible para otras estructuras. Los sistemas pueden ejecutarse indefinidamente sin fugas de espacio gradual o interrupciones largas durante las fases de recuperación de la basura. Cuando una estructura de datos se vacía, todo su espacio se recicla, en lugar de dejar 'tumbas' o otros marcadores. Por ejemplo, un atributo de múltiples valores que puede reducirse a un valor, se vuelve tan eficiente como cualquier atributo de un solo valor y si ese último valor se elimina, todo el espacio para él se recupera, incluyendo el espacio para el atributo al que estaba adjunto y si una fila tiene solo atributos sin valores, la fila se recupera completamente. Si una tabla pierde todas sus filas, el espacio para la tabla se recupera. Cualquier tamaño o tipo de estructura de datos tiene esta propiedad. No hay contadores de referencias, por lo tanto, cualquier tipo de grafo se recoge automáticamente de manera incremental.
Productos
InfinityDB Cliente/Servidor (en estado de pruebas alpha) tiene las siguientes características:
Un sistema cliente/servidor para el acceso compartido seguro remoto a un conjunto de archivos de base de datos InfinityDB Embedded.
Consola de gestión web de backend para la gestión segura de usuarios, roles, bases de datos y permisos.
Browsing y edición segura de bases de datos web de backend con vistas tabulares, JSON y ItemSpace. El modo tabular muestra los datos como documentos anidados, tablas y listas con edición y actualización concurrentes en el nivel de párrafo o Item de datos.
Acceso seguro RESTful por Python y bash mediante curl para datos JSON y BLOB.
Acceso remoto por programas Java utilizando la característica RemoteItemSpace.
Consultas de patrón para la reestructuración y consulta no SQL de estructuras de datos ItemSpace, incluyendo el equivalente de ItemSpace del SGBD relacional, select, project, join y order-by.
Transferencia de sufijo de Item que proporciona la movilidad de datos dentro o entre bases de datos con copia, movimiento, diferencia, unión e intersección.
InfinityDB Encriptado (Versión 5) (en estado de pruebas beta) tiene las siguientes características:
Encriptación con AES-128 o AES-256 a nivel de bloque de base de datos
Autenticación con HMAC-SHA256 a nivel de bloque
Hashing rápido de bloques encriptados
Hashing de bloques no encriptados para la verificación de autenticidad HMAC
Firmado con múltiples certificados o claves públicas
Firmado incremental - cada apertura de la db permite agregar más firmas
Almacenamiento y organización de certificados en la metadatos en el archivo de db único
Estrategias de verificación de firma personalizadas del cliente - 'N de M', cualquier certificado validado, más
Validación de certificados
InfinityDB Embedded (versión 4) tiene las siguientes características:
Modelo NoSQL - es un almacenamiento de clave/valor jerárquico ordenado llamado 'ItemSpace' por simplicidad, pero generalidad
1M ops/segundo, buena escalabilidad multi-núcleo
Compresión hasta 10x o más
Transacciones
Instalación instantánea, sin administración: toda la db está en un solo archivo
Impresión/parsing de JSON con extensiones para más tipos de datos: JSON puede representar cualquier datos ItemSpace.
Patrón robusto de actualización de archivos que previene la corrupción
Recuperación instantánea después de la salida abrupta de la aplicación sin registro
12 tipos de datos primitivos
BLOBs/CLOBs, es decir, Objetos Long Binarios y Objetos Long de Caracteres
Tipos de datos primitivos 'EntityClass' y 'Attribute' para estructuras flexibles y extensibles en tiempo de ejecución
AirConcurrentMap es una implementación de Java ConcurrentNavigableMap. Características:
Más rápido que JDK Maps para tamaños medios a grandes. Esto es patent-pendiente.
Mejor eficiencia de memoria que todas las bibliotecas estándar de Java Maps por encima de aproximadamente 1K Entradas.
Un escaneo paralelo de Map propio que es más rápido que el de Java 1.8.
forEach es más rápido que los Maps de Java 1.8.
Para InfinityDB y AirConcurrentMap:
El procesamiento concurrente, multi-hilo en múltiples núcleos sin bloqueos aumenta el rendimiento en plataformas multi-núcleo, como el Intel i7, en aproximadamente siete veces. Ambos productos son patent-pendientes.
Se utiliza el acceso estándar de Java Map. Se implementa una interfaz java.util.concurrent.ConcurrentNavigable mejorada, permitiendo la sustitución directa en cualquier código de aplicación o prueba existente. Esta interfaz proporciona métodos de concurrencia especializados así como características de ordenamiento que mejoran el SortedSet original.
Historia
Roger L. Deran diseñó y desarrolló el Infinity Database Engine hace más de 20 años y posee patentes de EE. UU. 5283894 y 10417209. El Infinity Database Engine se desplegó por primera vez en lenguaje ensamblador Intel 8088 en el editor de video deportivo ROSCOR (RSVE) que se licenció a equipos de la NFL en los años 80. Lexicon compró el RSVE en 1989 y amplió su despliegue a todos los tipos de deportes profesionales y universitarios. La versión 2.0 de Java añadió transacciones y la versión 3.0 añadió características de concurrencia que son patent-pendientes y se aplican tanto a InfinityDB como a AirConcurrentMap. Infinity DB sigue en uso activo en miles de sitios de varios tipos, mientras que AirConcurrentMap es nuevo.
Usos
El InfinityDB de Java, comercializado por Boiler Bay Inc. desde 2002, incluye:
consolidación de datos farmacéuticos y médicos
recopilación, descripción, consolidación y compartición de datos ornitológicos
representación de taxonomías de varios tipos
herramientas de entorno de programación como la navegación en el repositorio de código fuente
indexadores de texto
sistemas de consolidación de correo electrónico
sistemas de recopilación de datos industriales distribuidos.
Referencias
Ver también
Berkeley DB
Perst