私の目的は、2 つのリモート ディレクトリ (dir1 と dir2 など) を同期させることです。これにより、dir1 の内容が変更されるたびに (新しいファイルまたはディレクトリの追加や削除、またはディレクトリ内のファイルの内容の変更)、その変更が dir2 に伝播され、その逆も同様になります。
これを実行するために私が思いつく素朴な方法は、両方のマシンで cron 経由で rsync を定期的に実行することです。しかし、このアプローチには誤りがあります:-
- 前回の rsysnc が完了しておらず、前回の rysnc がまだ実行されている間に cron がもう一度 rsync を実行する場合があります。
- dir1 に新しいファイルが追加され、dir2 で rsync が実行される前に dir1 で rsync が実行されると、新しく追加されたファイルは dir2 に存在しないため dir1 から削除される可能性があります。
- また、これはリアルタイムではありません。
これを行うためのより良い方法を提案してもらえますか? セットアップと開始が簡単なオープンソースを探しています。
答え1
競合ウィンドウなしで「ハードリアルタイム」を保証する唯一の方法は、書き込みが両側に到達した後にのみ認識されるようにすることです。これを実現する通常の方法は、共有ブロックデバイス上のクラスタファイルシステム (OCFS2 や GFS2 など) を使用することです。このような共有ブロックデバイスは、DRBD を使用して簡単かつ安価に構築できます。
他の同期メカニズムと同様に、クラスター内ネットワークは許容可能な遅延で変更レートを伝送できる必要があります。
カンニングペーパーは、
- 両側にブロックデバイス(ディスク、パーティション、LVなど)を予約する
- DRBDをインストールして設定する(apt-get install drbd-utils)、優れたドキュメントを使用するウェブサイト
- 選択したクラスター スタックをインストールします。完全な Red Hat (共有ファイル システム以上のものが必要な場合)、または最小限でありながら非常に簡単な O2DLM (OCFS2 に含まれています)。
- DRBDデバイスをGFS2(Red Hatスタックのみ)またはOCFS2(両方のスタックで可能)でフォーマットし、両側にマウントします。
同期されたディレクトリのペアはなくなりました。両方のノードで使用できる単一のディレクトリがあります。これは機能的には同じですが、競合ウィンドウはありません。
答え2
同じマシン上にある場合は、ファイル システム リンクの使用を検討してください。これは、透過的でありながら、dir2 が dir1 を指すか、その逆のいずれかを意味します。これを行うには、ln
eg を使用するln -s /path/to/dir1 /path/to/dir2
か、または相対パスを使用します。-s
これは、シンボリック リンクであるため、パスを参照しているだけで、 の inode を参照しているわけではないことを意味しますdir1
。
編集: 申し訳ありませんが、「両方のマシン」の部分が抜けていました。
ネットワーク共有の使用を検討してください。2 つの場所を (ほぼ) リアルタイムで同期するのは常に困難です。