このセクションは技術的すぎるため、ほとんどの読者には理解しにくいかもしれません。技術的な詳細を削除せずに、( 2017年12月) |
InfinityDBは、 Javaで構築された組み込みデータベースエンジンおよびクライアント/サーバーDBMSです。拡張されたjava.util.concurrent.ConcurrentNavigableMapインターフェース(java.util.Mapのサブインターフェース)を備えており、ハンドヘルドデバイス、サーバー、ワークステーション、分散環境に導入されています。独自のロックレス、並行処理、Bツリーアーキテクチャに基づいて設計されており、クライアントプログラマーは障害のリスクなしに高いパフォーマンスを実現できます。[ 1 ]
新しいクライアント/サーバー バージョン 5.0 はアルファ テスト中であり、確立された組み込みバージョンをラップして、安全なリモート サーバー経由で共有アクセスを提供します。
組み込みシステムでは、可変長のアイテム空間に直接アクセスできる InfnityDB APIを使用して、単一の組み込みデータベース ファイルにデータが保存され、そこから取得されます。データベース クライアント プログラマーは、従来のリレーションシップだけでなく、依存アプリケーションのニーズを直接満たす特殊なモデルも構築できます。アイテム数、データベース サイズ、JVMサイズに制限はないため、InfinityDB は、ランダム アクセス ストレージを提供する最小の環境でも、大規模な設定に拡張できる環境でも機能します。従来のリレーションシップと特殊なモデルは、同じデータベース ファイルに送ることができます。InfinityDB は、標準的なリレーションシップだけでなく、他のすべての種類のデータに対しても最適化できるため、クライアント アプリケーションは、仮想の 8 コア システムで 1 秒あたり最低 100 万回の操作を実行できます。
AirConcurrentMapは、Java ConcurrentMapインターフェースを実装したメモリ内マップです。 [ 2 ]しかし、内部的にはマルチコア設計を採用しているため、順序付けが実行され、中規模から大規模なエントリが保持されるときに、パフォーマンスとメモリが最も高速なJava Mapとなります。[ 3 ] AirConcurrentMapの反復処理は、特定のマップタイプに関係なく、どのJava Map反復処理よりも高速です。
マップAPI
InfinityDB には、拡張標準 java.util.concurrent.ConcurrentNavigableMap として、または低レベルの「ItemSpace」API 経由でアクセスできます。ConcurrentNavigableMap インターフェースは java.util.Map のサブインターフェースですが、特別な順序付けと並行処理メソッドを備えています。これは java.util.concurrent.ConcurrentSkipListMap と同じ API です。マップはネストして複雑な構造を形成できます。マップは標準的なセマンティクスを持ちますが、内部的には「タプルスペース」上で動作します。マップは実際には保存されず、ヘルパーとして機能し、それぞれが不変のタプルプレフィックスを表すだけです。マップは、アクセスの必要に応じて高速に動的に作成でき、スレッドセーフでマルチコア同時実行が可能です。利用可能なキーと値の型には、すべてのJavaプリミティブデータ型、日付、文字列、小さなchar配列またはbyte配列、バイト文字列、巨大配列インデックス、文字型Longオブジェクトまたはバイナリ型Longオブジェクト、そして特殊用途型であるEntityClassとAttributeが含まれます。マップは複数の値を持つことができます。アプリケーションはマップベースのアクセスのみを使用することも、同じタプルに対して低レベルのItemSpaceアクセスを混在させることもできます。これは、マップアクセスは単なるラッパーであり、タプルレベルの区別がないためです。
下位レベルの「ItemSpace」データモデル
12 個の基本データ型は「コンポーネント」と呼ばれ、アトミックです。コンポーネントは、保存と検索の単位である「アイテム」と呼ばれる短い複合体に連結できます。これらのアイテムを組み合わせた高レベルの構造はクライアントが考案し、たとえば、無制限の数の列または属性を持つ無制限のサイズのレコードや、無制限のサイズの複雑な属性値などが含まれます。キーは、コンポーネントの組み合わせである場合があります。属性値は、複合コンポーネントの順序付きセット、 文字ラージ オブジェクト(CLOB)、バイナリ ラージ オブジェクト(BLOB)、または無制限のスパース配列にすることができます。複数のアイテムから構築されるその他の高レベルの構造には、順序付きマップ、順序付きセット、4 つのエンティティ - 属性 - 値ネット、ツリー、DAG、タクソノミ、または全文インデックスなどのキーと値の関連付けがあります。これらを他のカスタムのクライアント定義構造と混在させることもできます。
あらゆるItemSpaceは拡張JSONドキュメントとして表現でき、JSONプリンタとパーサーが提供されています。JSONドキュメントはネイティブではありませんが、必要に応じてItemセットにマッピングされます。マッピングのスケールは、サブドキュメントへのパスを表すItemプレフィックスによって決定されます。したがって、データベース全体、または単一の値に至るまでの任意のサブツリーを拡張JSONとして表現できます。Itemは常にソートされた状態で保持されるため、オブジェクトのJSONキーは常に順序どおりに保たれます。
データのエンコード
「ItemSpace」はデータベース全体を表し、他の状態を持たない、順序付けられた単純なアイテムの集合です。アイテムは実際には、各コンポーネントが可変長バイナリ形式でエンコードされた char 配列に格納されます。各コンポーネントは、正しくソートされる標準形式で自己記述的です。プログラマはコンポーネントをプリミティブとしてのみ扱い、格納されたデータは強い型付けがされています。データは、JSONやXMLのように弱い型付けで解析されるテキストとして格納されることも、プログラマが定義したバイナリ ストリーム表現から解析されることもありません。Java オブジェクトのシリアル化の場合のように、セキュリティ、ドキュメント、アップグレード、テスト、バージョン管理、スケーリング、デバッグの問題が発生する可能性のある、脆弱になる可能性のあるクライアント独自のバイナリ形式はありません。
パフォーマンスのスケーリング
システムへのすべてのアクセスは、いくつかの基本メソッドを介して行われます。これらのメソッドでは、メモリ内にあるときに複数のスレッドにわたって集約された約 1M 操作/秒の速度で、一度に 1 つの可変長の「アイテム」または「タプル」を順番に格納または取得できます。操作は、、、反復子などの標準 Map API、またはより低いレベルの、、、、、、、、、およびです。一般的get()なput()アイテムinsert()はメモリ内で圧縮されていない状態で約 30 バイトですが、たとえば LOB は 1 KB のアイテムを使用します。各操作は 1 つのアイテムのみに影響するため、小さなデータ構造へのアクセスは高速です。これは、たとえば JSON または XML テキスト全体または Java オブジェクト シリアル化グラフ全体のフォーマットと解析などのチャンク アクセスとは対照的です。ItemSpace のスペースとパフォーマンスのスケーリングは、クライアントが課した任意のサイズのマルチアイテム構造が作成、拡大、縮小、または消失してもスムーズです。ストレージ上でのパフォーマンスは、ブロック指向Bツリーと同様に、ブロックサイズが約4KBで、アクセスあたりO (log( n ))です。ブロックキャッシュはデフォルトで2.5MBあり、サイズに制限はありませんが、通常は約100MBです。キャッシュは必要に応じて拡張されます。 delete()update()first()next()last()previous()
空間スケーリング
パフォーマンスと効率性の向上のため、アイテムは単一のBツリー内に、プレフィックス圧縮された可変長の未解釈バイト列として保存され、さらに圧縮されます。Bツリーは通常100GB程度まで拡張できますが、制限はありません。ファイルは1つだけなので、ログファイルやその他のファイルへの書き込みやフラッシュは不要です。InfinityDBは、4種類の圧縮方法(プレフィックス、サフィックス、zlib、UTF-8)によってデータベースファイルのサイズを最小限に抑えます。
スキーマレスアップグレード
構造が拡張または変更されるときのスキーマのアップグレードは、実行時に新しい方法でアイテムを追加または削除することによって行われ、アップグレード スクリプトはありません。したがって、データ モデルはNoSQLでスキーマレスです。
通常のJavaプリミティブ型に加えて、「EntityClass」型と「Attribute」型があり、それぞれ名前または番号で識別されます。これらはオプションの「メタデータ」であり、任意のアイテムの他のコンポーネントと混在させることができます。これらを使用してテーブルを表すことができます。例えば、各テーブルにはアイテムの先頭近くに特定のEntityClassが与えられ、各列には異なる属性が与えられます。テーブルのアイテムはそれぞれ特定のEntityClassで始まり、次に「エンティティ」(キーなど)を表す1つ以上の通常のプリミティブが続き、次に列に対応する特定の属性が続き、最後にその属性の値を表すいくつかの通常のプリミティブが続きます。このシンプルなパターンはいつでも拡張でき、任意の属性内にネストされたテーブル、他の属性内にネストされた属性、複数値属性など、様々なものが可能になります。他の場所には固定スキーマがないため、システムに着信する新しいデータは、アイテムレベルの粒度で自身を記述します。エンティティクラスと属性の番号または名前は、拡張JSONで表現できます。Webベースのクライアント/サーバー型データベースブラウザにデータを表示すると、ソートされたフォーマット済みのアイテムのリスト、JSONドキュメント、またはアイテムに混在するエンティティクラスと属性によって可視構造が決定されるネスト可能なテーブルとして、表示、操作、転送できます。JSONの動的な緩やかな柔軟性とテーブルの形式性が融合されています。
トランザクション性
グローバルな「ACD」トランザクションとスレッドごとの「ACID」トランザクションの両方が提供されます。各InfinityDBインスタンスは、単一のデータベースファイルにデータを保存し、追加のログファイルやロールバックファイルは必要ありません。停電やその他のハードウェア障害を除くあらゆる災害が発生した場合、データベースは最後のグローバルコミット完了時点の状態との整合性が保証されます。突然の終了後のリカバリは即座に行われ、時間のかかるログの再生は不要です。バルクロードはグローバルトランザクションで、データサイズは無制限で、他のすべての用途と並行して実行されます。グローバルトランザクションはスレッド間の分離を提供しないため、セマンティクスは「ACID」ではなく「ACD」です。一方、ACIDトランザクションは、スレッド間の分離を可能にするために楽観的ロックを採用しています。
即時ガベージコレクション
データ構造が拡大または縮小すると、解放された領域は直ちに再利用され、他の構造に利用できるようになります。システムは、徐々に領域がリークしたり、ガベージ再利用フェーズで長時間中断したりすることなく、無期限に稼働できます。データ構造が空になると、「墓石」やその他のプレースホルダーを残さずに、その領域がすべて再利用されます。たとえば、非常に大きい可能性がある複数値属性は 1 つの値に縮小され、単一値属性と同じくらい効率的になり、その最後の値が削除されると、その値が関連付けられていた属性の領域も含めて、その最後の値の領域がすべて再利用されます。また、行に値のない属性だけがある場合、その行も完全に再利用されます。テーブルがすべての行を失った場合、テーブルの領域も再利用されます。あらゆるサイズやタイプのデータ構造にこの特性があります。参照カウンターは存在しないため、あらゆるタイプのグラフが自動的に増分収集されます。
製品
InfinityDB クライアント/サーバー (アルファテスト状態) の機能:
- InfinityDB Embedded データベース ファイルのセットに安全にリモート共有アクセスするためのクライアント/サーバー システム。
- ユーザー、ロール、データベース、権限を安全に管理するためのバックエンド Web 管理コンソール。
- 表形式、JSON、ItemSpaceビューを使用した、バックエンドWebのセキュアなデータベース閲覧と編集。表形式モードでは、ネスト可能なドキュメント、表、リストとしてデータが表示され、段落またはデータアイテム単位での同時編集と更新が可能です。
- JSON および BLOB データに対して、curl 経由で Python および bash による安全な RESTful アクセスを実現します。
- RemoteItemSpace 機能を使用した Java プログラムによるリモート アクセス。
- パターン クエリは、ItemSpace データ構造の非 SQL 任意の再構築とクエリを実行するためのもので、リレーショナル DBMS の ItemSpace 相当、選択、投影、結合、順序付けが含まれます。
- ItemSuffix Transfer は、コピー、移動、差異、結合、交差を使用して、データベース内またはデータベース間でのデータの移動を提供します。
InfinityDB Encrypted (バージョン 5) (ベータテスト中) の機能:
- データベースブロックレベルでのAES-128またはAES-256による暗号化
- ブロックレベルでのHMAC-SHA256による認証
- 暗号化されたブロックの高速ハッシュ
- HMAC の信頼性チェックのための暗号化されていないブロックのハッシュ
- 複数の証明書または公開鍵による署名
- 増分署名 - データベースを開くたびに署名を追加できます
- 単一の db ファイル内のメタデータでの証明書の保存と整理
- カスタムクライアント署名検証戦略 - 「N of M」、検証済みの証明書など
- 証明書の検証
InfinityDB Embedded (バージョン 4) の機能:
- NoSQLモデル - シンプルでありながら汎用性を持たせるために「ItemSpace」と呼ばれる階層的なキー/値ストアです。
- 100万オペレーション/秒、優れたマルチコアスケーラビリティ
- 最大10倍以上の圧縮
- 取引
- 即時インストール、管理不要:データベース全体が 1 つのファイルにまとめられています
- より多くのデータ型の拡張機能を備えた JSON 印刷/解析: JSON は任意の ItemSpace データを表すことができます。
- 堅牢なファイル更新パターンにより破損を防止
- ログなしで突然アプリケーションが終了した後の即時回復
- 12個のプリミティブデータ型
- BLOB/CLOB、つまりバイナリロングオブジェクトとキャラクタロングオブジェクト
- 柔軟で実行時に拡張可能な構造のための「EntityClass」および「Attribute」メタデータ基本データ型
AirConcurrentMap は Java の ConcurrentNavigableMap 実装です。以下の機能を備えています。
- 中規模から大規模の規模ではJDK Mapsよりも高速です。特許出願中。
- 約 1K エントリ以上のすべての標準 Java ライブラリ マップよりもメモリ効率が優れています。
- 独自の並列 Map スキャンは、Java 1.8 のものよりも高速です。
- forEach は Java 1.8 Maps よりも高速です。
InfinityDB と AirConcurrentMap の両方の場合:
- ロックなしで複数のコア上で同時マルチスレッド処理を実行することで、 Intel i7などのマルチコアプラットフォームにおけるパフォーマンスが約7倍向上します。両製品とも特許出願中です。
- 標準的なJava Mapアクセスを使用します。拡張されたjava.util.concurrent.ConcurrentNavigableインターフェースが実装されており、既存のアプリケーションやテストコードに直接置き換えることができます。このインターフェースは、特殊な並行処理メソッドと、元のSortedSetを改良した順序付け機能を提供します。
歴史
Roger L. Deran は、20 年以上前に Infinity Database Engine を設計、開発し、米国特許 5283894 [ 4 ]および 10417209 [ 5 ]を保有しています。Infinity Database Engine は、1980 年代に NFL チームにライセンス供与された ROSCOR スポーツ ビデオ エディタ (RSVE) で、Intel 8088アセンブリ言語で初めて導入されました。Lexiconは1989 年に RSVE を購入し、その導入をあらゆる種類のプロスポーツと大学スポーツに大幅に拡大しました。[ 6 ] Java バージョン 2.0 ではトランザクション機能が追加され、バージョン 3.0 では特許出願中の並行処理機能が追加され、InfinityDB と AirConcurrentMap の両方に適用されます。Infinity DB は数千ものさまざまな種類のサイトで現在もアクティブに使用されていますが、AirConcurrentMap は新しいものです。
2002 年から Boiler Bay Inc. が販売している 100% JAVA の InfinityDB の用途は次のとおりです。
- 医薬品と医療データの統合
- 鳥類学データの収集、記述、統合、共有
- 様々なタイプの分類の表現
- ソースコードリポジトリナビゲーションなどのプログラミング環境ツール
- テキストインデクサー
- 電子メール統合システム
- 分散型産業データ収集システム。
参考文献
- ^ Peters, L & Lavers, T (2008). Swing Extreme Testing: The Extreme Approach to Complete Java Application Testing . Packt Publishing. p. 224. ISBN 9781847194824。
- ^ 「Map インターフェース (Java™ チュートリアル > コレクション > インターフェース)」。
- ^ 「AirConcurrentMap パフォーマンステスト」(PDF) 。2016年3月11日時点のオリジナル(PDF)からアーカイブ。
- ^ US 5283894 「キャッシュノードに対するロックレス同時Bツリーインデックスメタアクセス方法」
- ^ US 10417209 「コピーオンライトを使用した同時インデックス」
- ^ニューヨーク・タイムズ - スポーツワールド特集:ビデオテクノロジー、カスタムリプレイ