web-dev-qa-db-ja.com

LXDコンテナを他のLXDホストにバックアップする

Ubuntu16.04とLXD用のRAID1ZFSファイルシステムを実行している2台のサーバーAとBがあります。現在、サーバーAで実行されているコンテナーがいくつかあります。サーバーAの各コンテナーからサーバーBに毎晩バックアップを作成するというアイデアです。このようにして、サーバーAがクラッシュした場合に、サーバーBでコンテナーを起動できるようにします。また、サーバーAのローカルスナップショットを使用して、たとえば誰かが誤ってファイルを削除した場合に、コンテナーを非常に高速に復元することもできます。

最も簡単な方法は、サーバーAでコンテナーCを停止し、スナップショットSnap0を作成して、再起動することです。次に、_lxc copy C/Snap0 serverB:C_を使用してスナップショットをサーバーBにコピーします。ただし、サーバーBをサーバーAのリモートホストとして既に追加していると仮定します。ここでの問題は、これが初めて機能することです。他のバックアップの場合、サーバーBのコンテナーCを削除してから、再度コピーする必要があります。 2番目の問題は、コンテナーがバックアップからバックアップへと成長し、最終的にサーバーBに転送するデータが多すぎて、コンテナーで実行されているすべてのサービスの帯域幅が不十分になることです。

したがって、これに対する解決策は、夜間のスナップショット間の差異のみを転送することです。 _zfs send/receive_をsshと組み合わせて使用​​すると、サーバーAのスナップショット間の差異をssh経由でサーバーBに送信し、これらの差異をサーバーBのファイルシステムに追加できます。しかし、再び問題があります。このコマンドは内部で_lxc copy_を使用していないため、_zfs send/receive_を使用してコンテナーCの初期ファイルシステムを作成した場合は機能しませんが、サーバーBに新しいファイルシステムを作成します。サーバーA上の元のファイルシステム。したがって、差分バックアップは不可能であり、ファイルシステムのチェックサムを比較するときに_zfs receive_はエラーで返されます。

次のアイデアは、_zfs send/receive_のみを使用して、_lxc copy/init_を使用してコンテナーを作成せずに、コンテナーCのファイルシステム全体をサーバーAからサーバーBに転送することです。その後、チェックサムが一致するため、2つの連続するスナップショットの差を毎晩送信しても問題ありません。しかし、_/var/lib/lxd/lxd.db_にあるLXDのデータベースにエントリがないため、緊急時にサーバーBでコンテナーCのコピーを開始できないという問題があり、_lxc start C_は機能しません。 。サーバーAのLXDデータベースの関連エントリをサーバーBのLXDデータベースにコピーして機能させることができると思いますが、それについてはよくわかりません。多分あなたはここで私を助けることができます。これらのデータベースの何も破壊したくありません。

いくつかの背景情報:実際には、サーバーAとBの両方がコンテナーを実行していますが、各サーバーには他のサーバーのコンテナーのバックアップが含まれている必要があります。

おそらく、2つ以上のLXDホストを使用したバックアップ戦略がすでに機能しているのですが、それを見つけることができませんでした。毎晩、rsyncのようなバックアップ戦略またはコンテナ全体のコピーしかありません。

更新:私はこれへのヒントを得ました github commit これはlxdコマンドの新しいサブコマンド、つまり_lxd import_。そのため、_apt-get install -t xenial-backports lxd lxd-client_を使用してUbuntuバックポートを使用して両方のサーバーでlxdをアップグレードする必要がありました。

既存のファイルシステムからコンテナをインポートできないようにする必要があります。私はそれを試してみました。まずサーバーAに移動し、スナップショットを撮ります

_lxc snapshot C Snap0
_

送信者のサイトで追加の引数_zfs send/receive_を使用して_-p_を使用してスナップショットをサーバーBに送信し、ファイルシステムのプロパティも含めます。

_zfs send -p lxd/containers/C@snapshot-Snap0 | ssh serverB zfs receive lxd/containers/C
_

サーバーBに切り替えて、シンボリックリンクを作成します。

_ln -s /var/lib/lxd/containers/C.zfs /var/lib/lxd/containers/C
_

そして今、私はインポートできるはずです:

_lxd import C
_

しかし、代わりにエラーが発生します。

_error: open /var/lib/lxd/containers/C/backup.yaml: no such file or directory
_

この_backup.yaml_ファイルの出所がわからないため、既存の_metadata.yawl_を_backup.yaml_にコピーしようとしました。もう一度試してみると、次のエラーが発生します。

_error: no response!
_

そして今、この_backup.yaml_がどこから来るべきかアドバイスがないので、私は何をすべきかわかりません。

更新2:すでに述べたように、この_backup.yaml_ファイルを取得するには、コンテナーを停止して再開するか、後で別のスナップショットを作成します。 lxc2.7以降にアップグレードします。

だからついに私のスクリプトはようやくうまく機能しました。現在、小さな問題は1つだけです。 _lxc import_でコンテナをインポートした後、コンテナのファイルシステム全体を破壊せずにコンテナを削除することはできません。 _lxc import --update <container>_や_lxc delete --keep-root-fs_などのコマンドを考えています。私はすでにこのアイデアについて機能リクエストを提出しました。

更新3:そしてここで進捗状況を確認できます: LXDバックアップ処理の改善#3005

1
Nicolas

ニコラス

私はあなたが直面しているのと同じ問題を見つけました。私のテストでは、lxd 2.0.8から2.7にアップグレードし、lxc(2.0.xで作成または開始)を停止してから、lxcを再度起動する必要があります。backup.yamlが表示され、次の宛先にコピーできます。 lxdインポートを使用します(インポートする前に、zfs set mountpointを忘れずに、マウントポイントへのリンクコンテナー名を作成してください)

この助けを願っています。

1
bubble