InfinityDB

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

Nowa wersja Client/Server 5.0 jest w fazie testów alfa, obejmując ustaloną 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 klienccy baz danych mogą konstruować zarówno tradycyjne relacje, jak i wyspecjalizowane modele, które bezpośrednio zaspokajają potrzeby zależnej aplikacji. Nie ma ograniczeń co do liczby elementów, rozmiaru bazy danych ani maszyny JVM rozmiar, dzięki czemu InfinityDB może działać zarówno w najmniejszym środowisku, które zapewnia pamięć masową o swobodnym dostępie, jak i może być skalowany 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, jak również wszystkich innych typów danych, dzięki czemu aplikacje klienckie mogą wykonywać co najmniej milion operacji na sekundę w wirtualnym, 8-rdzeniowym systemie.

AirConcurrentMap to mapa w pamięci, która implementuje interfejs Java ConcurrentMap, ale wewnętrznie wykorzystuje projekt wielordzeniowy, dzięki czemu jej wydajność i pamięć sprawiają, że jest to najszybsza mapa Java podczas składania zamówienia i zawiera średnią lub dużą liczbę wpisów. Iteracja AirConcurrentMap jest szybsza niż jakiekolwiek iteratory Java Map, niezależnie od określonego typu mapy.

Interfejs API mapy

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ą faktycznie przechowywane, ale są pomocnikami, z których każda reprezentuje jedynie niezmienny prefiks krotki. Mapy mogą być tworzone dynamicznie z dużą szybkością, jeśli są potrzebne do uzyskania dostępu, są bezpieczne dla wątków i współbieżne dla wielu rdzeni. Dostępne typy kluczy i wartości obejmują wszystkie prymitywne typy danych Java, daty, ciągi znaków, małe tablice znaków lub bajtów, „ByteStrings”, „wielkie tablice”, indeksy, obiekty o długości znaków lub obiekty o długości binarnej, a także typy specjalnego przeznaczenia „EntityClass” i „Atrybut”. Mapy mogą być wielowartościowe. Aplikacje mogą zdecydować się na korzystanie wyłącznie z 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 prymitywnych typów danych nazywa się „komponentami” i są one atomowe. 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 elementy, są opracowywane przez klienta i obejmują na przykład rekordy o nieograniczonej wielkości z nieograniczoną liczbą kolumn lub atrybutów, ze złożonymi wartościami atrybutów o nieograniczonej wielkości. Klucze mogą być wówczas 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ą rzadkie tablice . Inne struktury wyższego poziomu zbudowane z wielu elementów obejmują skojarzenia klucz/wartość, takie jak uporządkowane mapy, uporządkowane zestawy, sieci czworaków Entity-Attribute-Value, drzewa, DAG, taksonomie lub indeksy pełnotekstowe. Mieszanki tych mogą występować wraz z innymi niestandardowymi strukturami zdefiniowanymi przez klienta.

Dowolna przestrzeń ItemSpace może być reprezentowana jako rozszerzony dokument JSON, a drukarki i parsery JSON są dostarczane. Dokumenty JSON nie są natywne, ale w razie potrzeby są mapowane na zestawy elementów, w dowolnej skali określonej przez przedrostek 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 uporządkowane.

Kodowanie danych

„ItemSpace” reprezentuje całą bazę danych i jest to prosty uporządkowany zestaw elementów, bez żadnego innego stanu. Element jest faktycznie 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 sortuje poprawnie. Programiści traktują komponenty tylko jako prymitywy, a przechowywane dane są silnie typowane. Dane nie są przechowywane jako tekst do analizy ze słabą czcionką, jak w JSON lub XML , ani nie jest analizowany z reprezentacji strumieni binarnych zdefiniowanych przez programistę. Nie ma niestandardowych formatów binarnych opracowanych przez klienta, które mogą stać się kruche i które mogą mieć problemy z bezpieczeństwem, dokumentacją, aktualizacją, testowaniem, wersjonowaniem, skalowaniem i debugowaniem, jak ma to miejsce w przypadku serializacji obiektów Java.

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 naraz z szybkością rzędu 1 miliona operacji na sekundę, agregowanych w wielu wątkach, gdy w pamięci. Operacje są albo standardowym API Map dla get() , put() , iteratorów itd., albo na niższym poziomie insert() , delete() , update() , first() , next() , last () i poprzedni() . Typowe elementy mają około 30 bajtów nieskompresowanych w pamięci, ale na przykład obiekty LOB używają elementów o wielkości 1 KB. Ponieważ każda operacja dotyczy tylko jednego elementu, dostęp do małych struktur danych jest szybki. Jest to w przeciwieństwie do dostępu fragmentarycznego, takiego jak na przykład formatowanie i analizowanie całych tekstów JSON lub XML lub całych wykresów serializacji obiektów Java. Skalowanie przestrzeni i wydajności ItemSpace jest płynne, ponieważ narzucona przez klienta struktura wielu elementów jest tworzona, rośnie, kurczy się lub znika. Wydajność w pamięci masowej jest podobna do każdego B-drzewa zorientowanego na bloki, z blokami o wielkości około 4 KB, czyli O (log( n )) za dostęp. Domyślnie dostępna jest 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 rośnie tylko w razie potrzeby.

Skalowanie przestrzeni

W celu zapewnienia wydajności i wydajności elementy są przechowywane w pojedynczym skompresowanym przedrostku B-drzewa i zmiennej długości jako niezinterpretowana sekwencja bajtów do dalszej kompresji. B-drzewo może zwykle urosnąć do zakresu 100 GB, ale nie ma ograniczeń. Jest tylko jeden plik, więc nie ma dziennika ani innych plików do zapisu i opróżniania. InfinityDB minimalizuje rozmiar pliku bazy danych poprzez cztery rodzaje kompresji ( prefix , suffix, zlib i UTF-8 ).

Aktualizacja bez schematu

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 aktualizujących - stąd model danych jest NoSQL i bez schematu.

Oprócz normalnych typów prymitywnych Java istnieją typy „EntityClass” i „Attribute”, z których każdy jest 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, gdzie każda tabela ma przypisaną konkretną EntityClass w pobliżu przedniej części elementu, a każda kolumna ma przypisany inny atrybut. Każdy element tabeli zaczyna się od określonej klasy EntityClass, następnie jest jeden lub więcej normalnych prymitywów reprezentujących „obiekt” (jak klucz), następnie jest określony atrybut odpowiadający kolumnie, a na koniec 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 w dowolnym atrybucie lub zagnieżdżone atrybuty w innych atrybutach lub atrybuty wielowartościowe i wiele więcej. Nie ma nigdzie ustalonego schematu, więc nowe dane, które docierają do systemu, opisują się same, z dokładnością do poziomu 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ć, przetwarzać i przesyłać jako listę posortowanych sformatowanych elementów lub jako dokumenty JSON lub jako zagnieżdżalne tabele, których widoczna struktura jest określona przez EntityClass i Atrybuty, które są mieszane z elementami. Dynamiczna, luźna elastyczność JSON i formalność tabel są połączone.

Transakcyjność

Dostępne są zarówno globalne transakcje „ACD”, jak i transakcje „ACID” dla poszczególnych wątków. Każda instancja InfinityDB przechowuje dane w pojedynczym pliku bazy danych i nie wymaga dodatkowych plików dziennika ani plików wycofywania zmian. W przypadku jakiejkolwiek katastrofy, poza awarią zasilania lub inną awarią sprzętu, baza danych gwarantuje zgodność ze stanem na dzień zakończenia ostatniego globalnego zatwierdzenia. Odzyskiwanie po nagłym przerwaniu 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” (zamiast „ACID”). Alternatywnie transakcje ACID wykorzystują optymistyczne blokowanie, aby umożliwić izolację między wątkami.

Natychmiastowa zbiórka śmieci

Gdy struktury danych rosną i maleją, zwolniona przestrzeń jest natychmiast odzyskiwana i udostępniana 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 miejsca. Na przykład, potencjalnie bardzo duży atrybut wielowartościowy może zmniejszyć się do jednej wartości, stając się tak samo wydajny jak każdy atrybut jednowartościowy, a jeśli ta ostatnia wartość zostanie usunięta, całe miejsce dla niego zostanie odzyskane, w tym miejsce na atrybut, który był dołączony do, a jeśli wiersz ma tylko atrybuty bez wartości, wiersz jest również całkowicie odzyskiwany. Jeśli tabela straci wszystkie swoje wiersze, miejsce na tabelę zostanie odzyskane. Dowolny rozmiar lub typ struktury danych ma tę właściwość. Nie ma liczników referencyjnych, dlatego każdy rodzaj wykresu jest gromadzony automatycznie.

Produkty

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

  • System klient/serwer zapewniający bezpieczny zdalny współdzielony dostęp do zestawu plików bazy danych InfinityDB Embedded.
  • Zaplecza internetowa konsola zarządzania do bezpiecznego zarządzania użytkownikami, rolami, bazami danych i uprawnieniami.
  • Bezpieczne przeglądanie i edytowanie baz danych zaplecza w sieci za pomocą widoków tabelarycznych, JSON i ItemSpace. Tryb tabelaryczny wyświetla dane jako zagnieżdżone dokumenty, tabele i listy z jednoczesną edycją i aktualizacją na poziomie szczegółowości akapitu lub elementu danych.
  • Bezpieczny dostęp RESTful przez Python i bash przez curl dla danych JSON i BLOB.
  • Zdalny dostęp przez programy Java przy użyciu funkcji RemoteItemSpace.
  • Zapytania o wzorce do arbitralnej restrukturyzacji innej niż SQL i zapytania dotyczące struktur danych ItemSpace, w tym odpowiednika ItemSpace Relacyjnego DBMS, wyboru, projektu, łączenia i porządkowania według.
  • ItemSuffix Transfer zapewnia mobilność danych w obrębie lub między bazami danych za pomocą funkcji kopiowania, przenoszenia, różnicowania, łączenia i przecinania.

Funkcje InfinityDB Encrypted (wersja 5) (w fazie testów beta):

  • Szyfrowanie AES-128 lub AES-256 na poziomie bloku bazy danych
  • Uwierzytelnianie za pomocą HMAC-SHA256 na poziomie bloku
  • Szybkie mieszanie zaszyfrowanych bloków
  • Haszowanie niezaszyfrowanych bloków w celu sprawdzenia autentyczności HMAC
  • Podpisywanie za pomocą wielu certyfikatów lub kluczy publicznych
  • Podpisywanie przyrostowe - każde otwarcie bazy danych pozwala na dodanie kolejnych podpisów
  • Przechowywanie i organizacja certyfikatów w metadanych w pojedynczym pliku db
  • Niestandardowe strategie weryfikacji podpisów klientów — „N of M”, dowolny zweryfikowany certyfikat i więcej
  • Walidacja certyfikatu

Funkcje InfinityDB Embedded (wersja 4):

  • Model NoSQL — jest to posortowany hierarchiczny magazyn kluczy/wartości nazywany „ItemSpace” dla uproszczenia, ale ogólności
  • 1 mln operacji na sekundę, dobra skalowalność wielordzeniowa
  • Kompresja do 10x lub więcej
  • Transakcje
  • Błyskawiczna instalacja, zerowa administracja: cała baza danych znajduje się w jednym pliku
  • Drukowanie/przetwarzanie 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, czyli długie obiekty binarne i długie obiekty znakowe
  • Prymitywne typy danych metadanych „EntityClass” i „Attribute” dla elastycznych struktur rozszerzalnych w czasie wykonywania

AirConcurrentMap to implementacja Java ConcurrentNavigableMap. Zawiera:

  • Szybsze niż mapy JDK dla średnich i dużych rozmiarów. To jest zgłoszone do opatentowania.
  • Lepsza wydajność pamięci niż wszystkie standardowe mapy bibliotek Java powyżej około 1K wpisów.
  • Zastrzeżone równoległe skanowanie mapy jest szybsze niż w Javie 1.8.
  • forEach jest szybszy niż w przypadku map Java 1.8.

Zarówno dla InfinityDB, jak i AirConcurrentMap:

  • Jednoczesne, wielowątkowe przetwarzanie na wielu rdzeniach bez blokad zwiększa wydajność na platformach wielordzeniowych, takich jak Intel i7 , około siedmiokrotnie. Oba produkty są w trakcie patentowania.
  • Używany jest standardowy dostęp do mapy Java. Zaimplementowano udoskonalony interfejs java.util.concurrent.ConcurrentNavigable, który umożliwia bezpośrednie zastąpienie w dowolnej istniejącej aplikacji lub kodzie testowym. 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 opracował silnik bazy danych Infinity ponad 20 lat temu i posiada patenty USA 5283894 i 10417209. Silnik bazy danych Infinity 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. Leksykon kupił RSVE w 1989 roku i znacznie rozszerzył jego zastosowanie do wszystkich rodzajów sportów zawodowych i uniwersyteckich. Wersja Java 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 zarówno do InfinityDB, jak i 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, sprzedawanego przez Boiler Bay Inc. od 2002 roku, obejmują:

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

Zobacz też