InfinityDB - InfinityDB

InfinityDB to wbudowany silnik bazy danych w języku Java i DBMS klient/serwer z rozszerzonym interfejsem java.util.concurrent.ConcurrentNavigableMap (podinterfejs java.util.Map), który jest wdrażany w urządzeniach przenośnych, serwerach, stacjach roboczych i rozproszone ustawienia. Projekt oparty jest na zastrzeżonej, bezblokującej, współbieżnej architekturze B-tree, która umożliwia programistom klienckim osiągnięcie wysokiego poziomu wydajności bez ryzyka awarii.

Nowa wersja klienta/serwera 5.0 znajduje się w fazie alfa testów, obejmując ugruntowaną wersję wbudowaną, aby zapewnić współdzielony dostęp za pośrednictwem bezpiecznego, zdalnego serwera.

W systemie wbudowanym dane są przechowywane i pobierane z pojedynczego pliku wbudowanej bazy danych przy użyciu interfejsu API InfnityDB, który umożliwia bezpośredni dostęp do przestrzeni elementów o zmiennej długości. Programiści klientów bazodanowych mogą konstruować tradycyjne relacje, jak również wyspecjalizowane modele, które bezpośrednio zaspokajają potrzeby aplikacji zależnej. Nie ma ograniczeń co do liczby elementów, rozmiaru bazy danych ani rozmiaru JVM , więc InfinityDB może działać zarówno w najmniejszym środowisku, które zapewnia pamięć o dostępie swobodnym, jak i może być skalowane do dużych ustawień. Tradycyjne relacje i wyspecjalizowane modele mogą być kierowane do tego samego pliku bazy danych. InfinityDB można zoptymalizować pod kątem standardowych relacji, a także wszystkich innych typów danych, umożliwiając aplikacjom klienckim wykonywanie co najmniej miliona operacji na sekundę w wirtualnym, 8-rdzeniowym systemie.

AirConcurrentMap to mapa w pamięci, która implementuje interfejs Java ConcurrentMap, ale wewnętrznie wykorzystuje wielordzeniową konstrukcję, dzięki czemu jej wydajność i pamięć sprawiają, że jest to najszybsza mapa Java podczas składania zamówienia i zawiera od średniej do dużej liczby wpisów. Iteracja AirConcurrentMap jest szybsza niż jakiekolwiek iteratory Java Map, niezależnie od konkretnego typu mapy.

Mapuj API

Dostęp do InfinityDB można uzyskać jako rozszerzony standard java.util.concurrent.ConcurrentNavigableMap lub za pośrednictwem interfejsu API niskiego poziomu „ItemSpace”. Interfejs ConcurrentNavigableMap jest podinterfejsem java.util.Map, ale ma specjalne metody porządkowania i współbieżności: jest to ten sam interfejs API, co java.util.concurrent.ConcurrentSkipListMap. Mapy można zagnieżdżać, tworząc złożone struktury. Mapy mają standardową semantykę, ale działają wewnętrznie na „przestrzeni krotki”, podczas gdy Mapy nie są w rzeczywistości przechowywane, ale są pomocnikami, z których każdy reprezentuje tylko niezmienny prefiks krotki. Mapy mogą być tworzone dynamicznie z dużą prędkością, jeśli są potrzebne do uzyskania dostępu i są bezpieczne dla wątków i wielordzeniowe współbieżne. Dostępne typy kluczy i wartości obejmują wszystkie prymitywne typy danych Java, daty, ciągi znaków, tablice małych znaków lub bajtów, indeksy „ByteStrings”, „duże tablice”, długie obiekty znakowe lub długie obiekty binarne, a także typy specjalnego przeznaczenia „EntityClass” i „Atrybut”. Mapy mogą być wielowartościowe. Aplikacje mogą zdecydować się na użycie samego dostępu opartego na mapie i mogą mieszać dostęp do „ItemSpace” niższego poziomu w tych samych krotkach, ponieważ dostęp do mapy jest tylko opakowaniem i nie ma rozróżnienia na poziomie krotki.

Model danych niższego poziomu „ItemSpace”

12 pierwotnych typów danych nazywa się „komponentami” i są one niepodzielne. Komponenty można łączyć w krótkie kompozyty zwane „przedmiotami”, które są jednostką przechowywania i wyszukiwania. Struktury wyższego poziomu, które łączą te Pozycje, są tworzone przez klienta i obejmują na przykład rekordy o nieograniczonej wielkości o nieograniczonej liczbie kolumn lub atrybutów, ze złożonymi wartościami atrybutów o nieograniczonej wielkości. Klucze mogą być wtedy kompozycją komponentów. Wartości atrybutów mogą być uporządkowanymi zestawami komponentów złożonych, dużymi obiektami znakowymi (CLOB), dużymi obiektami binarnymi (BLOB) lub nieograniczoną liczbą rzadkich tablic . Inne struktury wyższego poziomu zbudowane z wielu elementów obejmują asocjacje klucz/wartość, takie jak uporządkowane mapy, uporządkowane zestawy, sieci czwórek encja-atrybut-wartość, drzewa, DAG, taksonomie lub indeksy pełnotekstowe. Mogą występować ich mieszaniny wraz z innymi niestandardowymi strukturami zdefiniowanymi przez klienta.

Dowolny ItemSpace może być reprezentowany jako rozszerzony dokument JSON, a drukarki i parsery JSON są dostarczane. Dokumenty JSON nie są rodzime, ale w razie potrzeby są mapowane na zestawy elementów w dowolnej skali określonej przez prefiks elementu, który reprezentuje ścieżkę do dokumentu podrzędnego. W związku z tym cała baza danych lub dowolne jej poddrzewo aż do pojedynczej wartości może być reprezentowane jako rozszerzony JSON. Ponieważ elementy są zawsze posortowane, klucze JSON obiektu są zawsze w porządku.

Kodowanie danych

„ItemSpace” reprezentuje całą bazę danych i jest to prosty uporządkowany zestaw elementów, bez innego stanu. Element jest w rzeczywistości przechowywany z każdym komponentem zakodowanym w postaci binarnej o zmiennej długości w tablicy znaków, przy czym komponenty są samoopisujące się w standardowym formacie, który jest poprawnie sortowany. Programiści traktują komponenty tylko jako prymitywne, a przechowywane dane są silnie typowane. Dane nie są przechowywane jako tekst do przeanalizowania przy słabym typowaniu, jak w JSON lub XML , ani nie są analizowane ze zdefiniowanych przez programistę reprezentacji strumienia binarnego. Nie ma niestandardowych formatów binarnych opracowanych przez klienta, które mogą stać się kruche i które mogą powodować problemy z zabezpieczeniami, dokumentacją, aktualizacją, testowaniem, wersjonowaniem, skalowaniem i debugowaniem, tak jak ma to miejsce w przypadku serializacji Java Object.

Skalowanie wydajności

Cały dostęp do systemu odbywa się za pomocą kilku podstawowych metod, które mogą przechowywać lub pobierać w kolejności jeden „element” lub „krotkę” o zmiennej długości z szybkością rzędu 1 miliona operacji na sekundę zagregowanych w wielu wątkach, gdy w pamięci. Operacje są albo standardowym interfejsem Map API dla get(), put(), iteratorów itd., albo na niższym poziomie insert(), delete(), update(), first(), next(), last(), i previous(). Typowe elementy to około 30 bajtów nieskompresowanych w pamięci, ale LOB na przykład używają elementów 1 KB. Ponieważ każda operacja dotyczy tylko jednego elementu, dostęp do małych struktur danych jest szybki. Jest to przeciwieństwo dostępu podzielonego, takiego jak na przykład formatowanie i analizowanie całych tekstów JSON lub XML lub całych wykresów serializacji obiektu Java. Skalowanie przestrzeni i wydajności w ItemSpace jest płynne, ponieważ tworzony jest dowolny rozmiar struktury wieloelementowej narzuconej przez klienta, rośnie, kurczy się lub znika. Wydajność przechowywania jest podobna do każdego B-drzewa zorientowanego blokowo, z blokami o wielkości około 4 KB, czyli O (log( n )) na dostęp. Domyślnie istnieje blokowa pamięć podręczna o wielkości 2,5 MB, która ma nieograniczony rozmiar, ale często wynosi około 100 MB. Pamięć podręczna powiększa się tylko w razie potrzeby.

Skalowanie przestrzeni

Ze względu na wydajność i efektywność, elementy są przechowywane wewnątrz jednego skompresowanego prefiksu B-drzewa io zmiennej długości jako niezinterpretowana sekwencja bajtów do dalszej kompresji. B-drzewo może zazwyczaj wzrosnąć do zakresu 100 GB, ale nie ma ograniczeń. Jest tylko jeden plik, więc nie ma dziennika ani innych plików, do których można by zapisywać i opróżniać. InfinityDB minimalizuje rozmiar pliku bazy danych za pomocą czterech typów kompresji ( prefiks , sufiks, zlib i UTF-8 ).

Aktualizacja bez schematu

Aktualizacja schematu, gdy struktury są rozszerzane lub modyfikowane, odbywa się poprzez dodawanie lub usuwanie elementów w nowy sposób w czasie wykonywania i nie ma skryptów aktualizacji — stąd model danych jest NoSQL i bez schematu.

Oprócz zwykłych typów pierwotnych Java istnieją typy „EntityClass” i „Attribute”, każdy identyfikowany przez nazwę lub numer. Są to opcjonalne „metadane”, które można mieszać z innymi składnikami dowolnego elementu. Mogą być używane do reprezentowania tabel, na przykład, w których każdej tabeli przypisywana jest konkretna klasa EntityClass w przedniej części elementu, a każdej kolumnie nadawany jest inny atrybut. Każdy z elementów tabeli zaczyna się od określonej klasy EntityClass, następnie istnieje jeden lub więcej normalnych prymitywów reprezentujących „jednostkę” (jak klucz), następnie istnieje konkretny Atrybut odpowiadający kolumnie, a na końcu kilka normalnych prymitywów reprezentujących wartość ten atrybut. Ten prosty wzorzec można w dowolnym momencie rozszerzyć, aby umożliwić zagnieżdżone tabele wewnątrz dowolnego Atrybutu lub zagnieżdżone Atrybuty wewnątrz innych Atrybutów lub Atrybuty wielowartościowe i wiele więcej. W innym miejscu nie ma ustalonego schematu, więc nowe dane, które docierają do systemu, opisują się z dokładnością na poziomie elementu. Numery lub nazwy EntityClass i Attribute mogą być reprezentowane w rozszerzonym formacie JSON. Gdy dane są wyświetlane w internetowej przeglądarce bazy danych Klient/Serwer, można je przeglądać, manipulować i przesyłać jako listę posortowanych sformatowanych elementów lub jako dokumenty JSON lub jako tabele zagnieżdżone, których widoczna struktura jest określona przez EntityClass i Atrybuty, które są mieszane z elementami. Połączono dynamiczną, luźną elastyczność JSON i formalność tabel.

Transakcyjność

Dostępne są zarówno transakcje globalne „ACD”, jak i transakcje „ACID” na wątek. Każda instancja InfinityDB przechowuje dane w jednym pliku bazy danych i nie wymaga dodatkowych plików dziennika ani plików przywracania. W przypadku jakiejkolwiek katastrofy, z wyjątkiem awarii zasilania lub awarii innego sprzętu, baza danych gwarantuje zgodność ze stanem na dzień zakończenia ostatniego globalnego zatwierdzenia. Odzyskiwanie po nagłym zakończeniu jest natychmiastowe i nie wymaga powolnego odtwarzania dziennika. Ładowanie zbiorcze jest globalnie transakcyjne z nieograniczonym rozmiarem danych i jest równoczesne ze wszystkimi innymi zastosowaniami. Transakcje globalne nie zapewniają izolacji między wątkami, więc semantyka to „ACD” (a nie „ACID”). Alternatywnie transakcje ACID wykorzystują optymistyczne blokowanie, aby umożliwić izolację między wątkami.

Natychmiastowe wywóz śmieci

W miarę jak struktury danych rosną i kurczą się, zwolnione miejsce jest natychmiast odzyskiwane i udostępniane innym strukturom. Systemy mogą działać w nieskończoność bez stopniowych wycieków przestrzeni lub długich przerw podczas faz odzyskiwania śmieci. Kiedy struktura danych staje się pusta, cała jej przestrzeń jest poddawana recyklingowi, zamiast pozostawiać „nagrobki” lub inne pojemniki. Na przykład, potencjalnie bardzo duży atrybut wielowartościowy może zmniejszyć się do jednej wartości, stając się tak efektywnym, jak każdy atrybut jednowartościowy, a jeśli ta ostatnia wartość zostanie usunięta, całe miejsce na nią zostanie odzyskane, łącznie z miejscem na atrybut, którym był dołączony do i jeśli wiersz ma tylko atrybuty bez wartości, wiersz jest również całkowicie odzyskiwany. Jeśli tabela straci wszystkie wiersze, miejsce na tabelę zostanie odzyskane. Tę właściwość ma każdy rozmiar lub typ struktury danych. Nie ma liczników referencyjnych, dlatego każdy rodzaj wykresu jest automatycznie zbierany przyrostowo.

Produkty

Funkcje klienta/serwera InfinityDB (w stanie testów alfa):

  • System klient/serwer zapewniający bezpieczny zdalny współdzielony dostęp do zestawu plików bazy danych InfinityDB Embedded.
  • Konsola zarządzania zaplecza internetowego do bezpiecznego zarządzania użytkownikami, rolami, bazami danych i uprawnieniami.
  • Bezpieczne przeglądanie i edytowanie baz danych w sieci wewnętrznej za pomocą widoków tabelarycznych, JSON i ItemSpace. Tryb tabelaryczny wyświetla dane jako zagnieżdżone dokumenty, tabele i listy z równoczesną edycją i aktualizacją na poziomie szczegółowości akapitu lub danych.
  • Bezpieczny dostęp RESTful przez Python i bash przez curl dla danych JSON i BLOB.
  • Zdalny dostęp za pomocą programów Java przy użyciu funkcji RemoteItemSpace.
  • Zapytania wzorcowe dla arbitralnej restrukturyzacji i zapytań innych niż SQL struktur danych ItemSpace, w tym odpowiednik ItemSpace Relational DBMS, select, project, join i order-by.
  • Transfer ItemSuffix zapewnia mobilność danych w obrębie baz danych lub między nimi z kopiowaniem, przenoszeniem, różnicą, sumowaniem i przecinaniem.

Funkcje szyfrowania InfinityDB (wersja 5) (w stanie testów beta):

  • Szyfrowanie za pomocą AES-128 lub AES-256 na poziomie bloku bazy danych
  • Uwierzytelnianie za pomocą HMAC-SHA256 na poziomie bloku
  • Szybkie hashowanie zaszyfrowanych bloków
  • Haszowanie niezaszyfrowanych bloków w celu sprawdzenia autentyczności HMAC
  • Podpisywanie wieloma certyfikatami lub kluczami publicznymi
  • Podpisywanie przyrostowe - każde otwarcie bazy pozwala na dodanie kolejnych podpisów
  • Przechowywanie i organizacja certyfikatów w metadanych w pojedynczym pliku db
  • Niestandardowe strategie weryfikacji podpisu klienta — „N z M”, dowolny zatwierdzony certyfikat, więcej
  • Walidacja certyfikatu

Funkcje InfinityDB Embedded (wersja 4):

  • Model NoSQL — jest to posortowany hierarchiczny magazyn kluczy/wartości o nazwie „ItemSpace” dla uproszczenia, ale jednocześnie ogólności
  • 1 mln operacji na sekundę, dobra skalowalność wielordzeniowa
  • Kompresja do 10x lub więcej
  • Transakcje
  • Błyskawiczna instalacja, zero administracji: cała baza danych znajduje się w jednym pliku
  • Drukowanie/parsowanie JSON z rozszerzeniami dla większej liczby typów danych: JSON może reprezentować dowolne dane ItemSpace.
  • Solidny wzorzec aktualizacji plików zapobiega uszkodzeniom
  • Natychmiastowe odzyskiwanie po nagłym zamknięciu aplikacji bez dziennika
  • 12 prymitywnych typów danych
  • BLOB/CLOB, tj. długie obiekty binarne i długie obiekty znakowe Character
  • Pierwotne typy danych metadanych „EntityClass” i „Attribute” dla elastycznych struktur rozszerzalnych w czasie wykonywania

AirConcurrentMap to implementacja Java ConcurrentNavigableMap. Zawiera:

  • Szybszy niż Mapy JDK dla średnich i dużych rozmiarów. To jest zgłoszone do opatentowania.
  • Lepsza wydajność pamięci niż wszystkie standardowe mapy biblioteki Java powyżej około 1K wpisów.
  • Opatentowane równoległe skanowanie mapy jest szybsze niż w przypadku Javy 1.8.
  • forEach jest szybszy niż dla Java 1.8 Maps.

Zarówno dla InfinityDB, jak i AirConcurrentMap:

  • Jednoczesne przetwarzanie wielowątkowe na wielu rdzeniach bez blokad zwiększa wydajność na platformach wielordzeniowych, takich jak Intel i7 , około siedmiokrotnie. Oba produkty są zgłoszone do opatentowania.
  • Używany jest standardowy dostęp do mapy Java. Zaimplementowano ulepszony interfejs java.util.concurrent.ConcurrentNavigable, który umożliwia bezpośrednie zastąpienie dowolnej istniejącej aplikacji lub kodu testowego. Ten interfejs zapewnia wyspecjalizowane metody współbieżności, a także funkcje porządkowania poprawiające oryginalny SortedSet.

Historia

Roger L. Deran zaprojektował i rozwinął Infinity Database Engine ponad 20 lat temu i posiada patenty USA 5283894 i 10417209. Infinity Database Engine został po raz pierwszy wdrożony w asemblerze Intel 8088 w sportowym edytorze wideo ROSCOR (RSVE), który był licencjonowany dla drużyn NFL w 1980. Lexicon kupił RSVE w 1989 roku i znacznie rozszerzył jego zastosowanie na wszystkie rodzaje sportów zawodowych i uniwersyteckich. Java w wersji 2.0 dodała transakcyjność, a wersja 3.0 dodała funkcje współbieżności, które są zgłoszone do opatentowania i mają zastosowanie do InfinityDB oraz AirConcurrentMap. Infinity DB pozostaje w aktywnym użyciu w tysiącach różnego rodzaju witryn, podczas gdy AirConcurrentMap jest nowością.

Zastosowania całkowicie JAVA InfinityDB, sprzedawanej przez Boiler Bay Inc. od 2002 roku, obejmują:

  • konsolidacja danych farmaceutycznych i medycznych
  • gromadzenie, opis, konsolidacja i udostępnianie danych ornitologicznych
  • reprezentacja taksonomii różnych typów
  • narzędzia środowiska programistycznego, takie jak nawigacja w repozytorium kodu źródłowego
  • indeksatory tekstu
  • systemy konsolidacji poczty e-mail
  • rozproszone systemy gromadzenia danych przemysłowych.

Bibliografia

Zobacz też