web-dev-qa-db-ja.com

マルチテナントデータベースのテナントごとのバックアップを行う方法

マイクロサービスマルチテナントアプリケーションでのテナントごとのバックアップ/復元に関して、ベストプラクティス、経験、またはガイドラインはありますか?

私の場合、全体として定期的にバックアップされる複数のPostgresサーバーがあります。それぞれにFlywayを使用して移行される単一のデータベースが含まれています。単一のデータベースには、すべてのテナントのデータを含むすべてのテーブルを持つ1つのスキーマが含まれています。テナントはUUIDで識別され、すべてのデータには外部キーの関係があるため、 1つのテナントを簡単に削除できます。

ここで、個々のテナントの復元を実行できるようにする必要があります。これまでのところ、トピック全体についてはほとんどわかりませんが、これまでに思いついた唯一のプロセスは次のとおりです。

  • すべてのバックアップを別のデータベースセットまたは別のデータベースサーバーに復元する
  • 各マイクロサービスの新しいインスタンスを起動して、独立して起動し、必要に応じて必要なデータベースの移行を実行できるようにします。
  • 各本番データベースからテナントを削除する
  • 各サービスでスクリプトまたはコードを実行して、それぞれの復元されたデータベースのデータを識別し、これらの行を本番データベースに正確にコピーします。

ただし、これを実行または自動化することは、私にとっては不釣り合いな努力のようです。私は特に、このプロセスを単純化できる代替(より単純な)アプローチ、ツール、またはデータベース、または他の人々がこの問題に取り組む方法を実際に経験することを探しています。

2
xcq1

Postgresには、テーブルの行のサブセットを意味的にフェレットアウトする機能はありません。私が聞いた他のデータベースもしません。

関連する各テーブルから1つのテナントの行のみを取得するには、独自のコードを記述する必要があります。このコードはアプリ内にある場合もあれば、Postgres内のサーバー上で実行される場合もあります。

また、テナントによって分割されていない他のテーブルも、各テナントのバックアップにコピーする必要があるかどうかを決定する必要があります。

一部のデータベースベンダーがマルチテナンシーを明示的にサポートする機能を検討していると聞きました。データベースは、各テナントのデータを個別に検討し、論理的または物理的なサイロに保管する必要があることを理解します。しかし、私はそのような製品が生産の準備ができていることをまだ知りません。

3
Basil Bourque