
2026/07/03 5:01
Lightning メモリーマップデータベースマネージャー(LMDB) 1.0
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
LMDB ライブラリは、BerkeleyDB API に大雑把にモデル化された高性能なメモリーマッピングデータベースシステムであり、完全なデータベースをメモリーマップとして露出することで効率性を高めています。このライブラリはコピーオンライト戦略を採用しており、データ改ざんの防止、特別なクラッシュ回復手順の不要化、そしてリードがワライタをブロックしないマルチバージョン化を実現します。書き込みは完全にシリアル化され、整合性が保証され、また周期性のあるチェックポイントやメンテナンス作業なしで非制限的なストレージ成長を防ぐため、自由ページを効率的に管理します。
BerkeleyDB にモデル化されていますが独自の特徴を持ち、LMDB はメモリーマップをデフォルトで読み取り専用として設定することで、改ざんの完全な免疫を提供しますが、アプリケーションコードがバグっている場合に腐敗のリスクがある代わりに、高いパフォーマンスをもたらす読み書きモードも用意されています。バージョン 0.9.10 より以後、ライブラリは使用されていないファイル領域を自動的に初期化し(
MDB_NOMEMINIT が設定されない限り)、廃棄データを防ぎます。また、複数のスレッド/プロセスからの同時アクセスをサポートしており、各スレッドが単一のトランザクションと子トランザクションのみを管理する限りです。
LMDB はメンテナンスを簡素化しますが、ユーザーは特定の運用制約に遵从する必要があります:BSD や SysV システムでのマルチユーザーセマフォア構成は起動失敗を引き起こすことがあり、通常はアプリケーションをオーナーまたはルートとして実行することで解決されます。また、ロックファイルの必要性から純粋な読み取り専用モードは一般的に利用できません(読み取り専用FileSystem上の場合や
MDB_NOLOCK を使用する場合を除く)。さらに、中止されたプログラムからの古くなったリーダートランザクションについては、mdb_reader_check または mdb_stat を通じた定期的なチェックが必要となり得ますが、古くなったワライタは通常自動的にクリアされます。全体として、LMDB はユーザーが所有権要件、バージョン固有の挙動、および同時実行性を遵守すれば、複雑なデータ管理の安定した基盤を提供します。本文
LMDB データベース管理ライブラリ概要
基本概念と仕組み
- 構造: BerkeleyDB の API に基づく簡素化された B 木(B-tree) を採用しています。
- メモリ管理:
- 全体データをメモリマップとして公開します。
- データフェッチはマッピング済みメモリから直接行われるため、
やmalloc
が発生しません。memcpy - 独自のページキャッシュレイヤーが不要で、極めてシンプルかつ高パフォーマンスを実現します。
- トランザクション性: 完全なACID 準拠のセマンティクスを提供します。
- メモリマップが「読み取り専用モード」の場合、アプリケーションによる誤書き込み(stray pointer)で整合性が損なわれることはありません。
重要な特性とパフォーマンス
- スレッド対応: 完全なマルチスレッド・マルチプロセスサポートがあり、同時並行的な読み取り・書き込みが可能です。
- コピートンライト(Copy-on-Write)戦略:
- データページの過上書きを防ぎ、整合性侵害への耐性を高めます。
- システムクラッシュ後の特別な回復手順が不要です。
- ロック機構:
- データベース構造はマルチバージョン管理のため、リーダにはロックが必要ありません。
- ライターとリーダの相互排他処理なく、一方が他方をブロックすることはありません(ライター間はシリアル化)。
- メンテナンス不要:
- Write-Ahead Log (WAL) や Append-Only データベースと異なり、動作中にログチェックポイントやコンパクションが不要です。
- 使用済みページの再利用により、通常の運用環境ではデータベースファイルが無制限に成長することはありません。
モード設定:読み取り専用 vs 読み取り書き込み
| モード | デフォルト | メリット | デメリット・リスク |
|---|---|---|---|
| 読み取り専用 | ✅ | 完全な整合性侵害への免疫が得られます。 | 書き込み不可。 |
| 読み取り書き込み | ❌ | 書き込みパフォーマンスが大幅に向上します。 | アプリケーションコードのバグによる誤書き込みでデータベースが静かに破損するリスクがあります。(コードがバグフリーなら問題なし) |
注意喚起事項とトラブルシューティング
ロックファイルおよびセマフォ関連のトラブル
- 古くなったリーダトランザクションの影響:
- 中止されたプログラムによって残った古リーダーダーは、新規書き込みをブロックし、データベースファイルを急速に成長させる原因となります。
- 対処法:
関数またはmdb_reader_check
ツールで定期的にチェックしてください。mdb_stat- Windows / BSD / SysV セマフォ系システムでは、古いライターが自動クリアされます。
- Linux(Robust オプション有効)でも自動クリアされます。
- それ以外の場合は、環境を閉じることでロックファイルリセットが実行されます。
- セマフォ所有権問題:
- BSD や特定のシステムでは、異なるユーザ ID がセマフォを所有している場合、起動に失敗することがあります。
- 対処法: セマフォを所有しているユーザ(または
)でデータベースを開きかつ閉じることで解決します。(※他のプロセスが使用していない必要があります)root
制限事項と注意点
- ユーザ権限: データベースの所有者以外は通常使用不可。複数ユーザでの同時運用は起動失敗の原因になります。
- 純粋な読み取り専用モード: 基本的にリーダロックファイルへの書き込みが必要ですが、以下例外可能です。
- ファイルシステム自体が「読み取り専用」の場合。
にmdb_env_open()
フラグを指定した場合。MDB_NOLOCK
- メモリアドレス空間の予約: 将来拡張用に未使用メモリやファイルサイズを多数予約することがあります(実際の使用量を超えるため、容量不足に怯えずください)。
- ゼロ初期化のコスト:
- デフォルトでは書き込み前に未使用メモリのゼロ初期化が行われます(0.9.10 以前は非実装だった場合がありましたが、現在はデフォルト)。
- これによりわずかなパフォーマンスコストが発生するため、高速性を優先する場合は
フラグを使用します。MDB_NOMEMINIT - ⚠️ 機密データを扱う場合: このフラグは使用しないでください(未初期化領域にデータが書き込まれるため)。
を使用中はこの挙動は無関係です。MDB_WRITEMAP
- トランザクションの制限:
- 1 スレッドあたり 1 トランザクションまでです(子トランザクションも含まれます)。
- 例外:読み取り専用トランザクションのみであれば
フラグで複数使用可能。MDB_NOTLS - プロセス分割 (
): オープンしたfork()
をMDB_env*
の後にそのまま使用しないでください。fork() - 重複オープン: 同じプロセス内で同じ DB を二回オープンすることは禁止(
アドバイソリロックの破損)。但し、fcntl()
後の再オープンは OK(ロックファイルにfork()/exec()
が設定されているため)。FD_CLOEXEC
- 長命トランザクションの回避:
- 読み取りトランザクションが長期間開放されると、ページ再利用を防ぎ DB 成長の原因になります。
- 書き込みトランザクションも、シリアル化により他のライティングをブロックします。
- プロセス中断への注意:
- アクティブなトランザクションを持つプロセスを中止すると「長命トランザクション」状態と同様の不具合が起きます。
- ライターコミット後に停止されたリーダは、誤ったデータを返す可能性があります。
マルチプロセス環境での運用指針
- プロセス中止の禁止: アクティブトランザクションを持つプロセスを強制的に終了させないでください(ロック解放の遅延により破損するリスク)。
- ※システムが自動クレンジャ(古いライター)として動作する場合、書き込みトランザクションには適用されません。
- ロックファイルのリセット: 万が一中止した場合でも、定期チェックか環境の閉じ開放でロックファイルをリセットしてください。
- リモートファイルシステムの禁止: 同じホスト内のプロセス間でも、リモート FS 上の LMDB は使用しないでください(
の破損や同期問題が起きるため)。flock() - 同時オープン/クローズへの注意: 他のプロセスがまさに DB を開閉している最中は、オープン操作が失敗する可能性があります。
ライセンス情報
- 著作権: Copyright 2011-2026 Howard Chu, Symas Corp.
- ライセンス: OpenLDAP Public License に基づき、ソースコードおよびバイナリの再配布・使用が許可されます。
- 派生元: Martin Hedenfalk 氏による
を基盤としています(Copyright (c) 2009, 2010)。btree.c
免責事項
- ソフトウェアは**「現状のまま」**提供され、いかなる保証も行いません。
- 明示的な保証はありません。また、商売性および特定の用途への適合性に関する黙示的保証も排除されます。
- 著者は、使用や実行に関連するすべての損害(損失、データ破損、利益喪失など)について一切の責任を負わないものとします。