2017-11-08 7 views
3

Djangoアプリケーションの複数のインスタンスが同じデータベースの移行を同時に実行できるようにしても安全ですか?マルチコンテナDockerの設定でDjangoの移行を実行する

シナリオの説明

これは、Djangoアプリケーションの複数のインスタンスがロードバランサの背後で実行されている設定です。 Dockerコンテナの更新されたバージョンが利用可能になると、古いDockerイメージのそれぞれが新しいバージョンに置き換えられます。

Distributed Django application diagram

新しいDjangoのマイグレーションが存在する場合、それらを実行する必要があります。これは、複数のコンテナが同時に移行(python manage.py migrate)を実行できるようにするのは安全ですか?


私はこの質問に対する答えが何であるかについて2つの仮説を持っています。

  1. はい、安全です。データベースレベルのロックにより、移行は競合することはなく、最後に1つの移行スクリプトが実行され、もう1つは適用する移行がないことを報告します。
  2. これは安全ではありません。 2つの移行は、データベースを変更しようとするときに互いに競合する可能性があります。

答えて

1

いいえ、すべてのコンテナで同時に移行を実行することは安全ではありません。同じ移行を2回適用する可能性があるためです。

2の可能なケースがあります。二回(例えば、テーブルの列を追加する)、マイグレーションを適用

  1. は、データベースの制約に違反し、そのため、移行を実行する唯一の第一の容器は、移行を完了するために管理しています。この場合、他のコンテナは死にますが、オーケストレーションシステムがおそらく再起動します。

  2. 移行を2回適用すると制約に違反しないため、複数回適用できます。この場合、重複したデータに終わる可能性があります。

いずれの場合でも、同時に1つのコンテナに移行を適用するようにしてください。

関連する問題