データベース#

イントロダクション#

そもそも、なぜデータベースなのでしょう?

従来 LXC で行われていたように設定と状態をそれぞれのインスタンスのディレクトリに 保存するのではなく、 LXD ではそれら全ての情報を保管する内部的なデータベースを 持っています。これによりすべてのインスタンスの設定に対する問い合わせをとても 高速に行えます。

例えば、 「どのインスタンスが br0 を使っているのか」というかなり分かりやすい問いが あります。この問いにデータベース無しで答えるとすると、 LXD は一つ一つの インスタンスに対して、設定を読み込んでパースし、そこにどのネットワークデバイスが 定義されているかを見るということを繰り返し行わなければなりません。

インスタンスの数が少なければ、その処理は速いかもしれませんが、2000 個のインスタンスに 対してどれだけ多くのファイルシステムへのアクセスが必要かを想像してみてください。 代わりにデータベースを使うことで、非常に単純なクエリでキャッシュ済みの データベースにアクセスするだけで良くなるのです。

データベースエンジン#

LXD はクラスタリングをサポートし、クラスタの全てのメンバは同じデータベースの 状態を共有する必要があるため、データベースエンジンは SQLite の 分散対応バージョン をベースにしています。 それは外部のデータベースのプロセスを必要とせずに、 レプリケーション、 フォールトトレランス、自動フェールオーバーの機能を提供します。 このデータベースを「グローバル」 LXD データベースと呼びます。

単一の非クラスタノードとして LXD を使う場合であっても、やはりグローバル データベースを使用します。ただし、その場合は実質的には通常の SQLite データベースとして振る舞います。

グローバルデータベースのファイルは LXD のデータディレクトリ (例 /var/lib/lxd/database/global か snap ユーザーは /var/snap/lxd/common/lxd/database/global ) の ./database/global サブディレクトリの下に格納されます。

クラスタの各メンバもそのメンバ固有の何らかのデータを保持する必要があるため、 LXD は単なる SQLite のデータベース (「ローカル」データベース」も使用します。 これは ./database/local.db に置かれます。

アップグレードの前にはグローバルデータベースのディレクトリとローカルデータベースの ファイルのバックアップが作成され、 .bak のサフィックス付きでタグ付けされます。 アップグレード前の状態に戻す必要がある場合は、このバックアップを使うことができます。

データベースのデータとスキーマをダンプする#

データベースのデータまたはスキーマの SQL テキスト形式でのダンプを取得したい場合は、 lxd sql <local|global> [.dump|.schema] コマンドを使ってください。これにより sqlite3 コマンドラインツールの .dump または .schema ディレクティブと同じ出力を 生成できます。

コンソールからカスタムクエリを実行する#

ローカルまたはグローバルデータベースに SQL クエリ (例 SELECT, INSERT, UPDATE) を 実行する必要がある場合、 lxd sql コマンドを使うことができます (詳細は lxd sql --help を実行してください)。

ただ、これが必要になるのは壊れたアップデートかバグからリカバーするときだけでしょう。 その場合、まず LXD チームに相談してみてください ( GitHubのイシュー を作成するか フォーラム に投稿)。

LXD デーモン起動時にカスタムクエリを実行する#

SQL のデータマイグレーションのバグあるいは関連する問題のために アップグレード後に LXD デーモンが起動に失敗する場合、 壊れたアップデートを修復するクエリを含んだ .sql ファイルを 作成することで、その状況からリカバーできます。

ローカルデータベースに対して修復を実行するには、修復に必要なクエリを含む ./database/patch.local.sql というファイルを作成してください。 同様にグローバルデータベースの修復には ./database/patch.global.sql という ファイルを作成してください。

これらのファイルはデーモンの起動シーケンスの非常に早い段階で読み込まれ、 クエリが成功したときは削除されます (クエリは SQL トランザクション内で実行されるので、 クエリが失敗したときにデータベースの状態が変更されることはありません)。

上記の通り、まず LXD チームに相談してみてください。

クラスタデータベースをディスクに同期#

クラスタデータベースの内容をディスクにフラッシュしたいなら、 lxd sql global .sync コマンドを使ってください。これは SQLite そのままの 形式のデータベースのファイルを ./database/global/db.bin に書き込みます。 その後 sqlite3 コマンドラインツールを使って中身を見ることが出来ます。