無限データベース - 百科事典
InfinityDBは、ハンドヘルドデバイス、サーバー、ワークステーション、分散環境にデプロイされる、全Javaのエンブデッドデータベースエンジンおよびクライアント/サーバーDBMSで、java.util.concurrent.ConcurrentNavigableMapインターフェース(java.util.Mapのサブインターフェース)を拡張しています。このインターフェースは、高性能を達成しつつ、失敗のリスクを低減するように設計されています。
新しいClient/Serverバージョン5.0は、アルファテスト中で、既存のエンブデッドバージョンを統合して、セキュアなリモートサーバーを通じて共有アクセスを提供します。
エンブデッドシステムでは、InfinityDB APIを使用して、可変長のアイテムスペースに直接アクセスできるように、データが単一のエンブデッドデータベースファイルに保存および読み取出されます。データベースクライアントプログラマーは、従属アプリケーションのニーズを直接満たす特別なモデルだけでなく、伝統的な関係を構築できます。アイテムの数、データベースのサイズ、JVMのサイズに制限はなく、InfinityDBは小さなランダムアクセスストレージ環境で機能し、大規模な環境にスケールすることができます。伝統的な関係と特別なモデルは同じデータベースファイルに指向できます。InfinityDBは、標準的な関係だけでなく、すべての種類のデータに対しても最適化が可能で、クライアントアプリケーションが仮想、8コアシステムで1秒に少なくとも100万回の操作を行うことができます。
AirConcurrentMapは、Java ConcurrentMapインターフェースを実装するメモリ内マップで、内部ではマルチコア設計を使用して、並行処理を高速に行います。これにより、並列処理が行われた場合や、中程度から大きなエントリ数を持つ場合に、最も高速なJava Mapとなります。AirConcurrentMapのイテレーションは、特定のマップタイプに関係なく、他のすべてのJava Mapイテレーターより高速です。
Map API
InfinityDBは、拡張された標準java.util.concurrent.ConcurrentNavigableMapとしてアクセスできるだけでなく、低レベルの'ItemSpace' APIを通じてもアクセスできます。ConcurrentNavigableMapインターフェースはjava.util.Mapのサブインターフェースですが、特別な並行処理および並び替えメソッドがあります:これはjava.util.concurrent.ConcurrentSkipListMapと同じAPIです。マップは複雑な構造を形成するためにネスト可能です。マップには標準のシンタックスがありますが、内部では'tuple space'上で動作し、実際にはマップは保持されていません。各マップは、変数長のトゥループプレフィックスがパスを示すように、それぞれが不変のトゥループプレフィックスを表すヘルパーとして動作します。必要に応じて、高速で動的にマップを作成することができます。これらのマップはスレッドセーフでマルチコア並行です。利用可能なキーと値のタイプには、すべてのJavaプリミティブデータタイプ、Date、String、小さなcharやbyteの配列、'ByteStrings'、'巨大な配列'インデックス、Character Long Objects、Binary Long Objects、および特別な用途の'type' 'EntityClass'と'Attribute'が含まれます。マップはマルチ値でできます。アプリケーションは、Mapに基づくアクセスのみを使用することを選択し、同時に低レベルの'ItemSpace'アクセスを同一のトゥループにミックスすることもできます。なぜなら、Mapアクセスは単なるワーパーであり、トゥループレベルの区別はありません。
低レベルの'ItemSpace'データモデル
12のプリミティブデータタイプは'components'と呼ばれ、原子です。これらのコンポーネントは、保存および読み取りの単位である'Items'として連結できます。これらのItemsを組み合わせた高レベルの構造はクライアントによって設計され、例えば無制限のサイズのレコードや無制限の列や属性の複雑な属性値が含まれる無制限のサイズのテーブルや属性が含まれます。キーはコンポーネントの組み合わせで構成できます。属性値は、複合コンポーネントの並び替えされたセット、キャラクターロングオブジェクト(CLOB)、バイナリロングオブジェクト(BLOB)、または無制限のスパース配列で表されます。複数のItemsから構成された他の高レベルの構造には、並び替えされたマップ、並び替えされたセット、四重のEntity-Attribute-Valueネットワーク、ツリー、DAG、分類学、または全文インデックスなどがあります。これらの組み合わせや他のカスタムクライアント定義の構造が発生します。
どのItemSpaceも拡張されたJSONドキュメントとして表現できます。JSONプリンターとパーサーが提供されます。JSONドキュメントはネイティブではありませんが、必要に応じて、Itemsのセットにマッピングされるため、任意のスケールでItemプレフィックスがサブドキュメントへのパスを示すことを決定します。したがって、全体のデータベースやそのサブツリー全体、最終的な値までが拡張されたJSONとして表現できます。Itemsは常に並び替えられるため、オブジェクトのJSONキーは常に並び替えされます。
データエンコーディング
'ItemSpace'は全体のデータベースを表し、それには他の状態はありません。アイテムは実際には、各コンポーネントがチャラーアレイに可変長のバイナリ形式でエンコードされ、標準形式で正しく並び替えられるように了自己説明する標準形式で保存されます。プログラマーはコンポーネントを原始的な形式としてのみ処理し、保存されたデータは強い型であります。データはテキストとして保存され、JSONやXMLのように弱い型で解析されることはありません。プログラマー定義のバイナリストリーム表現から解析されることもありません。カスタムクライアント定義のバイナーフォーマットは存在せず、脆弱性やセキュリティ、文書化、アップグレード、テスト、バージョニング、スケーリング、デバッグなどの問題が発生することがあります。
パフォーマンススケーリング
システムへのすべてのアクセスは、一度に並び替え可能な可変長の'Item'や'tuple'を保存または読み取る数少ない基本的なメソッドを通じて行われます。これらの操作は、複数のスレッドの合計で1M操作/秒のスピードで行われます。操作は標準のMap APIのget()、put()、イテレータ、および他のものが含まれます。または低レベルのinsert()、delete()、update()、first()、next()、last()、およびprevious()が含まれます。典型的なItemsはメモリ内で30バイト未圧縮ですが、例えばLOBのために1KBのItemsを使用します。各操作は1つのアイテムのみを影響します。したがって、小さなデータ構造はアクセスが高速です。これは、例えば、全体のJSONやXMLテキストやJava Objectシリアライゼーショングラフの全体にわたるチャンクアクセスとは対照的です。ItemSpaceのスペースとパフォーマンススケーリングは滑らかで、クライアントが多項式の多項式構造を作成、成長、縮小、または消失した場合でも、スムーズです。ストレージのパフォーマンスは、約4KBのブロックを持つブロック指向のB-treeと似ています。これにより、アクセスごとにO(log(n))です。デフォルトでは、2.5MBのブロックキャッシュがありますが、無制限のサイズですが、通常約100MBです。キャッシュは必要に応じて増加します。
スペーススケーリング
パフォーマンスと効率のために、Itemsは単一のB-treeプレフィックス圧縮および可変長として、さらに圧縮される未解釈のバイトのシークエンスとして保存されます。B-treeは通常100GBの範囲に成長しますが、制限はありません。ファイルは1つしかありません。したがって、ログや他のファイルに書き込んだり、フラッシュしたりする必要はありません。InfinityDBは、4つの種類の圧縮(プレフィックス、接尾辞、zlib、UTF-8)により、データベースファイルのサイズを最小限に抑えます。
スケーマレスアップグレード
構造が拡張または変更された場合のスキーマアップグレードは、実行時における新しい方法でItemsを追加または削除することで行われます。したがって、データモデルはNoSQLでありスケーマレスです。
通常のJavaプリミティブタイプに加えて、「EntityClass」と「Attribute」のタイプがあります。これらは、名前または数で識別される任意の「メタデータ」です。これらは、任意のアイテムの他のコンポーネントと組み合わせることができます。これらは、例えばテーブルを表すことができます。各テーブルは、アイテムの前半に特定のEntityClassが割り当てられ、各列は異なるAttributeが割り当てられます。テーブルの各アイテムは、特定のEntityClassで始まり、その後、エンティティ(キーのよう)を表す1つまたは複数の通常のプリミティブが続きます。次に、特定のAttributeに対応するAttributeがあります。最後に、そのAttributeの値を表す通常のプリミティブがあります。このシンプルなパターンは、いつでも拡張され、例えば、任意のAttribute内にネストされたテーブルや他のAttribute内にネストされたAttribute、マルチ値のAttributeなど、さらに多くのものを許可します。他の場所に固定のスキーマはありません。したがって、システムに到着する新しいデータは、アイテムレベルの粒度で自身を説明します。EntityClassとAttributeの数または名前は、拡張されたJSONで表現できます。データがWebベースのClient/Serverデータベースブラウザで表示された場合、それが並び替えられたフォーマットされたアイテムのリスト、JSONドキュメント、またはEntityClassとAttributeがアイテムに組み込まれたEntityClassとAttributeによって構造が決定されるネスト可能なテーブルとして表示および操作、および移行できます。JSONの動的で柔軟な柔軟性とテーブルの形式性が組み合わされます。
トランザクション性
グローバルの'ACD'およびスレッドごとの'ACID'トランザクションが提供されます。各InfinityDBインスタンスはデータを単一のデータベースファイルに保存し、追加のログやロールバックファイルは必要ありません。電源不足や他のハードウェアの障害を除き、何らかの災害が発生した場合でも、データベースは最後のグローバルコミット時の状態と一致するように保証されます。急激な終了後の復旧は即時に行われ、遅いログ再プレイは必要ありません。バルクロードはグローバルトランザクションであり、データサイズに制限はなく、すべての他の使用と並行です。グローバルトランザクションはスレッド間の隔離を提供しないため、シンタックスは'ACD'('ACID'よりも)です。別の選択肢として、ACIDトランザクションは楽観的ロックを使用してスレッド間の隔離を許可します。
即時ガベージコレクション
データ構造が成長および縮小するにつれて、解放されたスペースは即座に回収され、他の構造に利用可能になります。システムは無限に運行し、徐々にスペースが漏れることや、ガベージ再回収フェーズ中の長い中断が発生することなく動作できます。データ構造が空になった場合、そのすべてのスペースはリサイクルされ、例えば、'墓標'や他のプレースホルダーを残しません。例えば、可能性のある非常に大きなマルチ値の属性が1つの値に縮小し、単一値の属性と同じように効率的になる場合、その最後の値が削除された場合、その属性に対するすべてのスペースが回収され、それに連結された属性のスペースも回収されます。行が属性と値がない場合、行は完全に回収されます。テーブルがすべての行を失った場合、テーブルのスペースも回収されます。どのサイズやタイプのデータ構造でもこの性質があります。参照カウンタはありません。したがって、どの種類のグラフも自動的にインクリメンタルコレクションされます。
プロダクト
InfinityDB Client/Server(アルファテスト状態)の機能は以下の通りです:
InfinityDB エンブデッドデータベースファイルのセットへのセキュアなリモート共有アクセスのためのクライアント/サーバーシステム。
ユーザー、ロール、データベース、許可のセキュアな管理のためのバックエンドウェブ管理コンソール。
タブレット、JSON、ItemSpaceビューでのセキュアなデータベースブラウジングおよび編集を提供するバックエンドウェブセキュアデータベースブラウジングと編集。
Pythonやbashを通じてcurlを使用してJSONとBLOBデータのセキュアなRESTfulアクセス。
JavaプログラムがRemoteItemSpace機能を使用してリモートアクセス。
非SQLの任意の構造再構成およびItemSpaceデータ構造のクエリのためのパターンクエリ。
データベース内でデータの移動を提供するItemSuffix Transfer。
InfinityDB Encrypted(ベータテスト状態)の機能は以下の通りです:
データベースブロックレベルでのAES-128またはAES-256での暗号化。
ブロックレベルでのHMAC-SHA256での認証。
暗号化ブロックの高速ハッシュ化。
非暗号化ブロックのハッシュ化は、HMACの正当性検証のために行われます。
複数の証明書やパブリックキーでの署名。
インクリメンタル署名 - データベースの開閉ごとに追加の署名が可能。
メタデータ内の単一のデータベースファイルでの証明書の保存と整理。
カスタムクライアント署名検証戦略 - 'N of M'、任意の検証済証明書など。
証明書検証。
InfinityDB エンブデッド(バージョン4)の機能は以下の通りです:
NoSQLモデル - シンプルな名前つきのキー/値ストレージである「ItemSpace」で、一般性がありますが、シンプルです。
1M ops/second、良いマルチコアスケーラビリティ。
圧縮率は10x以上。
トランザクション。
インストールが簡単、管理不要:全体のデータベースは1つのファイルに収められています。
拡張されたデータタイプのためにJSONプリンティング/パーサーがあり、JSONはあらゆるItemSpaceデータを表現できます。
堅牢なファイル更新パターンで壊れを防ぎます。
急激なアプリケーション終了後の即時リカバリでログは必要ありません。
12のプリミティブデータタイプ。
BLOBs/CLOBs、すなわちバイナリロングオブジェクトとキャラクターロングオブジェクト。
柔軟で実行時拡張可能な構造のための'EntityClass'と'Attribute'メタデータプリミティブデータタイプ。
AirConcurrentMapはJava ConcurrentNavigableMapの実装で、以下の機能があります:
中程度から大きなサイズのJDK Mapsよりも速い。これは特許出願中です。
約1Kエントリ以上のすべての標準的なJavaライブラリのMapよりも優れたメモリ効率です。
特許出願中の独占的な並行MapスキャンがJava 1.8のそれよりも速いです。
forEachはJava 1.8のMapよりも速いです。
InfinityDBおよびAirConcurrentMapの両方:
並行、マルチスレッド処理、複数のコア上でのロックなしにより、多コアプラットフォーム(例えば、Intel i7)でのパフォーマンスが約7倍に増加します。どちらの製品も特許出願中です。
標準のJava Mapアクセスが使用され、拡張されたjava.util.concurrent.ConcurrentNavigableインターフェースが実装されています。これにより、既存のアプリケーションやテストコードに直接置き換えができます。このインターフ