InfinityDB es un motor de base de datos integrado completamente en Java y un sistema de gestión de bases de datos cliente/servidor con una interfaz extendida java.util.concurrent.ConcurrentNavigableMap (una subinterfaz de java.util.Map) que se implementa en dispositivos portátiles, servidores, estaciones de trabajo y entornos distribuidos. El diseño se basa en una arquitectura de árbol B concurrente y sin bloqueo, de propiedad exclusiva , que permite a los programadores de clientes alcanzar altos niveles de rendimiento sin riesgo de fallos. [ 1 ]
Una nueva versión cliente/servidor, la versión 5.0, se encuentra en fase de pruebas alfa, integrando la versión integrada ya existente para proporcionar acceso compartido a través de un servidor remoto seguro.
En el sistema embebido , los datos se almacenan y recuperan de un único archivo de base de datos embebido mediante la API de InfinityDB , que permite el acceso directo a espacios de elementos de longitud variable. Los programadores de clientes de base de datos pueden construir relaciones tradicionales, así como modelos especializados que satisfacen directamente las necesidades de la aplicación dependiente. No hay límite en el número de elementos, el tamaño de la base de datos ni 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 en entornos de gran tamaño. Las relaciones tradicionales y los modelos especializados pueden dirigirse al mismo archivo de base de datos. InfinityDB se puede optimizar para relaciones estándar, así como para todos los demás tipos de datos, lo que permite a las aplicaciones cliente realizar un mínimo de 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 , [ 2 ] pero internamente utiliza un diseño multinúcleo para que su rendimiento y memoria lo conviertan en el Java Map más rápido al realizar ordenamientos y al almacenar un número medio a grande de entradas. [ 3 ] La iteración de AirConcurrentMap es más rápida que la de cualquier iterador de Java Map, independientemente del tipo de mapa específico.
API de mapas
InfinityDB se puede acceder como un java.util.concurrent.ConcurrentNavigableMap estándar extendido, o a través de una API de bajo nivel 'ItemSpace'. La interfaz ConcurrentNavigableMap es una subinterfaz de java.util.Map, pero tiene métodos especiales de ordenación y concurrencia: esta es la misma API que java.util.concurrent.ConcurrentSkipListMap. Los mapas se pueden anidar para formar estructuras complejas. Los mapas tienen la semántica estándar, pero funcionan internamente en un 'espacio de tuplas', mientras que los mapas no se almacenan realmente, sino que son auxiliares, cada uno representando nada más que un prefijo de tupla inmutable. Los mapas se pueden crear dinámicamente a alta velocidad si se necesita acceso, y son seguros para subprocesos y concurrentes en múltiples núcleos. Los tipos de clave y valor disponibles incluyen todos los tipos de datos primitivos de Java , fechas, cadenas, matrices pequeñas de caracteres o bytes, 'ByteStrings', índices de matrices grandes, objetos Character Long o Binary Long, además de los tipos especiales 'EntityClass' y 'Attribute'. Los mapas pueden ser multivalorados. Las aplicaciones pueden optar por usar solo el acceso basado en mapas y combinarlo con el acceso de nivel inferior 'ItemSpace' sobre las mismas tuplas, ya que el acceso a mapas es solo un envoltorio y no hay distinción a nivel de tupla.
El modelo de datos de nivel inferior 'ItemSpace'
Los 12 tipos de datos primitivos se denominan «componentes» y son atómicos. Los componentes se pueden concatenar en compuestos cortos llamados «elementos», que constituyen la unidad de almacenamiento y recuperación. Las estructuras de nivel superior que combinan estos elementos son diseñadas por el cliente e incluyen, por ejemplo, registros de tamaño ilimitado con un número ilimitado de columnas o atributos, y valores de atributos complejos de tamaño ilimitado. Las claves pueden ser una composición de componentes. Los valores de los atributos pueden ser conjuntos ordenados de componentes compuestos, objetos grandes de caracteres (CLOB), objetos grandes binarios (BLOB) o matrices dispersas ilimitadas . Otras estructuras de nivel superior construidas a partir de múltiples elementos incluyen asociaciones clave/valor como mapas ordenados, conjuntos ordenados, redes Entidad-Atributo-Valor de cuádruples, árboles, DAG, taxonomías o índices de texto completo. Pueden aparecer combinaciones de estas estructuras junto con otras estructuras personalizadas 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, sino que se asignan a conjuntos de Items cuando se desea, a 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 solo valor, puede representarse como JSON extendido. Dado que los Items siempre se mantienen ordenados, las claves JSON de un objeto siempre están en orden.
Codificación de datos
Un 'ItemSpace' representa la base de datos completa y es un conjunto ordenado simple de elementos, sin ningún otro estado. Un elemento se almacena con cada componente codificado en formato binario de longitud variable en un array de caracteres, y los componentes se autodefinen en un formato estándar que se ordena correctamente. Los programadores trabajan con los componentes solo como primitivos, y los datos almacenados tienen un tipado fuerte. Los datos no se almacenan como texto para ser analizados con tipado débil como en JSON o XML , ni se extraen de representaciones de flujo binario definidas por el programador. No hay formatos binarios personalizados diseñados por el cliente que puedan volverse frágiles y que puedan presentar problemas de seguridad, documentación, actualización, pruebas, versionado, escalabilidad y depuración, como ocurre con la serialización de objetos Java.
Escalabilidad del rendimiento
Todo el acceso al sistema se realiza mediante unos pocos métodos básicos que pueden almacenar o recuperar en orden un 'Item' o 'tupla' de longitud variable a la vez a una velocidad que es del orden de 1M operaciones/segundo agregadas en múltiples hilos cuando están en memoria. Las operaciones son o bien la API estándar de Map para get(), put(), iteradores, etc., o en el nivel inferior, insert(), delete(), update(), , first(), next(), last(), y previous(). Los Items típicos son de unos 30 bytes sin comprimir en memoria, pero los LOB, por ejemplo, usan Items de 1 KB. Debido a que cada operación afecta solo a un Item, las estructuras de datos pequeñas son rápidas de acceder. Esto contrasta con el acceso por bloques, como por ejemplo el formateo y el análisis de textos JSON o XML completos o gráficos de serialización de objetos Java completos. El escalado de espacio y rendimiento de un ItemSpace es fluido a medida que se crea, crece, se reduce o desaparece cualquier tamaño de estructura multi-Item impuesta por el cliente. El rendimiento en almacenamiento es similar al de cualquier árbol B orientado a bloques, con bloques de aproximadamente 4 KB, lo que equivale a O (log( n )) por acceso. Por defecto, dispone de una caché de bloques de 2,5 MB, de tamaño ilimitado, aunque suele alcanzar los 100 MB. La caché solo crece cuando es necesario.
Escalado espacial
Para optimizar el rendimiento y la eficiencia, los elementos se almacenan en un único árbol B comprimido con prefijo y de longitud variable como una secuencia de bytes sin interpretar para su posterior compresión. El árbol B puede alcanzar normalmente los 100 GB, pero no tiene límites. Solo hay un archivo, por lo que no hay archivos de registro ni otros archivos que escribir o vaciar. InfinityDB minimiza el tamaño de su archivo de base de datos mediante cuatro tipos de compresión ( prefijo , sufijo, zlib y UTF-8 ).
Actualización sin esquema
La actualización del esquema , cuando se extienden o modifican las estructuras, se realiza agregando o eliminando elementos de nuevas maneras 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 primitivos Java habituales, existen los tipos 'EntityClass' y 'Attribute', cada uno identificado por un nombre o número. Estos son metadatos opcionales que pueden combinarse con los demás componentes de cualquier Item. Se pueden usar para representar tablas, por ejemplo, donde a cada tabla se le asigna una EntityClass específica cerca del inicio del Item, y a cada columna se le asigna un Attribute diferente. Los Items de la tabla comienzan con una EntityClass específica, luego hay uno o más tipos primitivos que representan una entidad (como una clave), luego un Attribute específico que corresponde a una columna, y finalmente algunos tipos primitivos que representan el valor de ese Attribute. Este patrón simple se puede extender en cualquier momento para permitir tablas anidadas dentro de cualquier Attribute, o Attributes anidados dentro de otros Attributes, o Attributes multivalorados, y mucho más. No existe un esquema fijo en ningún otro lugar, por lo que los nuevos datos que llegan al sistema se describen a sí mismos, con granularidad a nivel de Item. Los números o nombres de EntityClass y Attribute se pueden representar en JSON extendido. Cuando los datos se muestran en el navegador de base de datos cliente/servidor web, se pueden visualizar, manipular y transferir como una lista de elementos formateados y ordenados, como documentos JSON o como tablas anidadas cuya estructura visible viene determinada por EntityClass y Attribute que se combinan en los elementos. Se combinan la flexibilidad dinámica de JSON con la formalidad de las tablas.
Transaccionalidad
Se ofrecen transacciones globales 'ACD' y transacciones por hilo 'ACID'. Cada instancia de InfinityDB almacena los datos en un único archivo de base de datos y no requiere archivos de registro ni de reversión adicionales. En caso de cualquier catástrofe, excepto un fallo de alimentación u otro mal funcionamiento del hardware, se garantiza que la base de datos sea consistente con el estado al finalizar la última confirmación global. La recuperación tras una terminación abrupta es inmediata y no requiere una reproducción lenta del registro. La carga masiva es transaccional globalmente con un tamaño de datos ilimitado y es concurrente con todos los demás usos. Las transacciones globales no proporcionan aislamiento entre hilos, por lo que la semántica es 'ACD' (en lugar de 'ACID'). Como alternativa, las transacciones ACID emplean bloqueo optimista para permitir el aislamiento entre hilos.
Recogida inmediata de basura
A medida que las estructuras de datos crecen y se reducen, el espacio liberado se recupera de inmediato y se pone a disposición de otras estructuras. Los sistemas pueden funcionar indefinidamente sin fugas de espacio graduales ni interrupciones prolongadas durante las fases de recuperación de basura. Cuando una estructura de datos queda vacía, todo su espacio se recicla, en lugar de dejar marcadores de posición u otros espacios residuales. Por ejemplo, un atributo multivalor, posiblemente muy grande, puede reducirse a un solo valor, volviéndose tan eficiente como cualquier atributo de un solo valor. Si se elimina ese último valor, se recupera todo el espacio que ocupaba, incluido el del atributo al que estaba asociado. Si una fila solo tiene atributos sin valores, también se recupera por completo. Si una tabla pierde todas sus filas, se recupera el espacio que ocupaba. Esta propiedad se aplica a estructuras de datos de cualquier tamaño o tipo. No hay contadores de referencia, por lo que cualquier tipo de grafo se recopila de forma incremental automáticamente.
Productos
Características del cliente/servidor InfinityDB (en fase de pruebas alfa):
- Un sistema cliente/servidor para el acceso remoto seguro y compartido a un conjunto de archivos de base de datos InfinityDB Embedded.
- Consola de administración web de back-end para la gestión segura de usuarios, roles, bases de datos y permisos.
- Navegación y edición segura de bases de datos web en el back-end con vistas tabulares, JSON e ItemSpace. El modo tabular muestra los datos como documentos, tablas y listas anidadas, con edición y actualización simultáneas a nivel de párrafo o elemento de datos.
- Acceso seguro mediante RESTful desde Python y bash a través de curl para datos JSON y BLOB.
- Acceso remoto mediante programas Java que utilizan la función RemoteItemSpace.
- Consultas de patrones para la reestructuración y consulta arbitraria no SQL de estructuras de datos de ItemSpace, incluyendo el equivalente en ItemSpace de las operaciones de selección, proyección, unión y ordenación del sistema de gestión de bases de datos relacionales (DBMS).
- ItemSuffix Transfer proporciona movilidad de datos dentro o entre bases de datos mediante las funciones de copia, movimiento, diferencia, unión e intersección.
Características de InfinityDB Encrypted (Versión 5) (en fase beta):
- Cifrado con AES-128 o AES-256 a nivel de bloque de la base de datos.
- Autenticación con HMAC-SHA256 a nivel de bloque
- Hash rápido de bloques cifrados
- Hashing de bloques no cifrados para la verificación de autenticidad HMAC
- Firma con múltiples certificados o claves públicas
- Firma incremental: cada apertura de la base de datos permite añadir más firmas.
- Almacenamiento y organización de certificados en los metadatos del único archivo de base de datos.
- Estrategias personalizadas de verificación de firmas de clientes: 'N de M', cualquier certificado validado, etc.
- Validación de certificados
Características de InfinityDB Embedded (versión 4):
- Modelo NoSQL: es un almacén jerárquico ordenado de clave/valor llamado 'ItemSpace' por simplicidad, pero generalidad.
- 1 millón de operaciones por segundo, buena escalabilidad multinúcleo.
- Compresión de hasta 10x o más
- Actas
- Instalación instantánea, administración cero: toda la base de datos está en un solo archivo.
- Impresión/análisis de JSON con extensiones para más tipos de datos: JSON puede representar cualquier dato de ItemSpace.
- Un patrón de actualización de archivos robusto previene la corrupción.
- Recuperación instantánea tras el cierre abrupto de la aplicación sin registro.
- 12 tipos de datos primitivos
- BLOBs/CLOBs, es decir, objetos binarios largos y objetos de caracteres largos.
- Tipos de datos primitivos de metadatos 'EntityClass' y 'Attribute' para estructuras flexibles y extensibles en tiempo de ejecución.
AirConcurrentMap es una implementación de Java ConcurrentNavigableMap. Sus características son:
- Más rápido que JDK Maps para tamaños medianos y grandes. Esta tecnología está pendiente de patente.
- Mayor eficiencia de memoria que todos los mapas de la biblioteca estándar de Java con más de 1000 entradas.
- Un escaneo de mapa paralelo propietario es más rápido que el de Java 1.8.
- forEach es más rápido que para los mapas de Java 1.8.
Tanto para InfinityDB como para AirConcurrentMap:
- El procesamiento simultáneo y multihilo en múltiples núcleos sin bloqueos aumenta el rendimiento en plataformas multinúcleo, como el Intel i7, aproximadamente siete veces. Ambos productos están pendientes de patente.
- Se utiliza el acceso estándar a mapas de Java. Se implementa una interfaz mejorada, `java.util.concurrent.ConcurrentNavigable`, que permite su sustitución directa en cualquier código de aplicación o prueba existente. Esta interfaz proporciona métodos de concurrencia especializados, así como funciones de ordenación que mejoran la implementación de `SortedSet` original.
Historia
Roger L. Deran diseñó y desarrolló el motor de base de datos Infinity hace más de 20 años y posee las patentes estadounidenses 5283894 [ 4 ] y 10417209. [ 5 ] El motor de base de datos Infinity se implementó por primera vez en lenguaje ensamblador Intel 8088 en el editor de video deportivo ROSCOR (RSVE), que fue licenciado a equipos de la NFL en la década de 1980. Lexicon compró RSVE en 1989 y amplió considerablemente su implementación a todo tipo de deportes profesionales y universitarios. [ 6 ] La versión 2.0 de Java agregó transaccionalidad, y la versión 3.0 agregó características de concurrencia que están pendientes de patente y se aplican a InfinityDB, así como a AirConcurrentMap. Infinity DB continúa en uso activo en miles de sitios de diversos tipos, mientras que AirConcurrentMap es nuevo.
Entre los usos de InfinityDB, una plataforma totalmente basada en Java comercializada por Boiler Bay Inc. desde 2002, se incluyen:
- 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 del entorno de programación como la navegación del repositorio de código fuente
- indexadores de texto
- sistemas de consolidación de correo electrónico
- sistemas distribuidos de recopilación de datos industriales.
Referencias
- ↑ Peters, L y Lavers, T (2008). Swing Extreme Testing: The Extreme Approach to Complete Java Application Testing . Packt Publishing. pág. 224. ISBN 9781847194824.
- ↑ "La interfaz de mapa (Tutoriales de Java™ > Colecciones > Interfaces)" .
- ↑ "Pruebas de rendimiento de AirConcurrentMap" (PDF) . Archivado del original (PDF) el 11 de marzo de 2016.
- ↑ US 5283894 "Método de metadatos de índice B-tree concurrente sin bloqueo para nodos en caché"
- ↑ US 10417209 "Índice concurrente mediante copia en escritura"
- ↑ New York Times - Especiales del mundo del deporte: Tecnología de vídeo; Repeticiones personalizadas
Véase también
- Sistemas de gestión de bases de datos propietarios
- Almacenamiento estructurado
- Software multiplataforma
- Bases de datos integradas
- Sistemas embebidos