[NeDBを使い方]データベースの永続性やパフォーマンスについて。

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

NeDBはJavaScriptで作られたデータベースです。 Node.js、nw.js、エレクトロン、ブラウザ等で動かすことができます。 Github NeDBはドキュメント型データベースでJSONをそのまま保存できます。 そのため、JavaScriptのプログラムと親和性が高く、データの取得、利用が簡単にできます。 また、NeDBはMongoDBと互換性があり、一つのデータベースはMongoDBのコレクションと対応しています。 対応は下記の通りです。
  • データベース→コレクション
  • データロウ→ドキュメント
今回は、NeDBデータベースに付随する情報について書いていきます。正直この辺りはGithubを読んだ方が良さそうです。

永続性

NeDBの永続化はパフォーマンス維持の理由から追記専用フォーマットを利用しています。 これは全てのアップデートやデリートは、実際には結果をデータファイルの末尾に追加することを意味しています。 データファイルの末尾にアップデートやデリートが追記されているので、DB内には一時的に重複した複数のドキュメントが存在していることになります。この重複はデータベースをロードするタイミングでドキュメントが圧縮され解消されます。 これらの圧縮機能に関する処理が下記のメソッドとして定義されています。
  • Datastore.persistence.compactDatafile():手動で圧縮することができます。データファイルの圧縮処理はキューに投入され、全ての操作は順番に処理されます。圧縮機能が完了すると”compaction.done”イベントを発生されます。
  • Datastore.persistence.setAutocompactionInterval(interval):定期的に圧縮処理が実行されます。引数のintervalはミリ秒で指定することができます。intervalの最小値は5秒です。
  • Datastore.persistence.stopAutocompaction():圧縮機能の定期実行を止めることができます。
圧縮機能の実行には一定の時間がかかることに注意してください。一般的な機器開発機器では50kレコードで130ms程度の時間がかかります。また、圧縮機能が動いている間は他の操作を止めてしまうので、アプリケーションで実際に使うことはお勧めしません。 圧縮機能は破損したドキュメントを即座に削除します。 ドキュメントが破損しているかどうかは、ドキュメントの破損率がcorruptAlertThresholdオプションで設定した値を下回っているかどうかで判断されます。 耐久性は主要なデータベースと同様に機能します。データファイルに追加するのではなく、圧縮によってOSはデータを物理的にディスクにフラッシュします(OSはデータのフラッシュを担当します)。これにより、パフォーマンスを維持しながら、サーバーのクラッシュによってデータが完全に失われることは決してありません。 起こりうる最悪の事態は2つの同期の間のクラッシュであり、2つの同期の間のすべてのデータの損失を引き起こします。通常、同期は30秒間隔で行われるため、最大30秒のデータになります。AntirezによるRedisの永続化に関する記事では、これをより詳細に説明しています。NeDBは、appendfsyncオプションをnoに設定したRedis AOFの永続化に非常に近いものです。

パフォーマンス

データ操作速度

NeDBはMongoDBのような大規模データベースの代わりになることを目的とはしていません。また、速度を重要視した設計にもなっていません。 しかし、ある程度の早い速度で動作し、特にインデックスを使うことで高速に動作することができます。 一般的なマシン(高速な開発マシン等)でインデックスが設定された10,000ドキュメントのコレクションに対して下記のような速度で動作します。
  • Insert: 10,680 ops/s
  • Find: 43,290 ops/s
  • Update: 8,000 ops/s
  • Remove: 11,750 ops/s
benchmarksマークフォルダで簡単なベンチマークテストを実行することができます。 簡単な実行につい絵は–helpを使ってヘルプを参照してください。

メモリ使用量

A copy of the whole database is kept in memory. This is not much on the expected kind of datasets (20MB for 10,000 2KB documents). データベース全体のコピーがメモリに保存されます。これは、予想される種類のデータセットにはあまり関係ありません(2KBのドキュメントが10,000ドキュメントあると20MB)。

他のサービスの使用

connect-nedb-session

connect-nedb-sessionはConnectおよびExpress用のセッションストアであり、nedbによって支援されています。 ほとんどの場合、ロギング目的でNeDBを使用していて、アプリケーションのメモリ使用量をそれほど大きくしたくない場合は、NeDB Loggerを使用してNeDB読み取り可能データベースにドキュメントを挿入できます。

nedb-camo

nedb-camoはNeDBデータベースからMongoDBコレクションにデータを転送します。 NeDBの限界になってMongoDBへの切り替えが必要になった場合に利用しましょう。