2 つのサーバー間でコンテンツを同期しようとしています。サーバーは同じバージョン(Ubuntu 12.04LTS)で、次のcronジョブを実行してコンテンツを同期します。
rsync -arzc --update --delete /htdocs/testing/www/cms_uploads/* [email protected]:/htdocs/testing/www/cms_uploads/
しかし、プロセスをテストすると、以下のように奇妙な結果が出ました。
最初のテスト
- Node2にaaaa.jpgアップロード
- ノード1に同期
- ノード1から削除
- Node1に再び表示されます。
- ノード2から削除
- Node1から削除
2回目のテスト
- Node1にbbbb.pngをアップロード
- ノード2に同期
- ノード2から削除
- Node2に再び現れる
- ノード1から削除
- Node1に再び表示されます。
私が望むのは、コンテンツが両方のサーバーで常にまったく同じであることを確認することです。私は何が間違っていましたか?
答え1
rsync
双方向同期が設定されていません。特別な助け(変更されたコンピュータの同期など)と幸運がない限り、これを行うことはできません。
変化が頻繁に発生しないようにするには、幸運が必要です。次の同期が始まる前にNode1とNode2が変更された場合(両方のシステムで)、同期中にいくつかの変更が失われます。
また、見ることができますこれ
答え2
問題の説明にはいくつかの基本的な問題があります。サーバーが同期しており、aaaa.jpg
ノード 2 にファイルを生成するとします。次の同期では、ノード2から偽のファイルを削除する必要があります(ノード1には存在しないため削除する必要があります)、ファイルをノード1にコピーする必要があります(ファイルがノード1に存在しないため、新しく作成する必要がありますか?)
同期が実行される順序によって、各ケースで何が起こるかが決まります。多くの場合、これは所望の結果が得られないことが事実上保証される。さらに悪いことに、同期が並行して実行される場合(つまり、ホストの1つが別のホストで実行されている同期操作によってナビゲートされている間に自己同期操作によって更新される場合)、結果はややランダムに見えます。
Rsyncは基本的に一方向同期用に設計されています。 2つのrsyncジョブを実行し、双方向同期を期待することはできません。
調和双方向同期用に設計されたファイル同期装置です。これはあなたの仕事に最適なツールです。これを設定し、unison -auto remote.example.com://path/to/directory /path/to/directory
ホストのいずれかで実行します。
どのツールを使用しても競合が発生する可能性があります。たとえば、同じファイルが2つの異なるコンピュータから2つの異なるバージョンに変わる場合があります。これらの競合を解決する自動化された良い方法はないので、手動介入が必要です。
ほとんどの設定では、正しいアプローチは、あるサーバーをアップロード場所として指定し、そのマスターサーバー上の他のすべてのサーバーを同期することです。誰かがスレーブにファイルをアップロードしている場合は、ローカルで何も変更せずにアップロードをマスターに渡すようにしてください。マスターサーバーのファイルが変更されるたびに、それをスレーブサーバーにプッシュします。
答え3
rsync には -u オプションがあります。
「これを行うと、rsyncがターゲットに存在するすべてのファイルをスキップし、ソースファイルよりも新しい修正時間があります(既存のターゲットファイルの変更時間がソースファイルの変更時間と同じ場合)。したがって、1)ユーザーが提供したコマンドと-uオプションから-cオプションを引いたコマンドと2)同じコマンドですが、反対方向に並べ替えることが
できるシェルスクリプトは2つあります。同期方式ですが、2つの問題があります。 1)リモートサーバーから削除された(または名前が変更された)ファイルはローカルにコピーされます。 b / c rsyncは新しいファイルをローカルで見つけたと見なします。 2)2つの場所で単一のファイルが変更された場合、同期は最新の変更のみを維持します。