リアルタイムおよび双方向同期用の「ミラー」をインストールする方法

コンピュータープログラマーとして、2つのディレクトリをリアルタイムで双方向に同期するシステムまたはツールが必要になることは何度も起こったに違いありません。 そのようなツールの1つを紹介します 記事上で。 これは、別のマシンに存在するディレクトリ間の双方向のリアルタイム同期をサポートするように構築されています。 これは、強力な専用デスクトップでコマンドラインコンパイル/ビルドプロセスを実行しながら、ラップトップでリモートでファイルを編集する2台のマシン(デスクトップ+ラップトップなど)の開発ワークフローに最適です。

lsyncdのようにディレクトリを同期するために利用できるツールはたくさんありますが、ミラーがユニークなのは、双方向であるということです。つまり、ラップトップからデスクトップ、およびデスクトップからラップトップの両方をリアルタイムで同時に同期します。 以下は、市場で入手可能な同様の既存のツールとの比較です。

既存のオプションとの比較

  • ユニゾンは双方向ですが、リアルタイムではありません
  • rsyncは双方向でもリアルタイムでもありません
  • lsyncdはリアルタイムですが、双方向を公式にサポートしていません
  • sshfsは遅すぎて、inotifyをサポートしていません
  • ドッペルゲンガー(内部ツール)はリアルタイムですが、双方向ではありません

非目標兼制限

  • マージ/長期間の切断サポートなし
  • Unixパーミッション/所有者/グループを維持する
  • 100MBを超える巨大なファイルはサポートされていません
  • rsyncのような超効率的な差分/送信ロジックはありません

ファイルが変更された場合、変更されたものだけを比較しようとするのではなく、ファイル全体を再送信します。

ミラーの設置

ステップ1: Java8以降をインストールします。 インストール済みのJavaバージョンを確認するには、「java-version」コマンドを実行します。 javaがインストールされていない場合は、以下のコマンドを実行してjava8をインストールします。

1)Debianベースのオペレーティングシステム(Ubuntu、Debianなど)

$ sudo apt-get update
$ sudo apt-get install openjdk-8-jre

2)RPMベースのオペレーティングシステム(RHEL、CentOS、 Fedora 等。)

$ sudo yum update
$ sudo yum install java-1.8.0-openjdk

ステップ2(オプション): インストール 警備員。 ウォッチマンがインストールされていない場合、ミラーは組み込みのJava WatchService APIを使用し、基本的には機能しますが、JDKが提供するWatchServiceの実装はそれほど優れていません。Linuxの実装にはバグがあります。

ステップ3: 最新のミラーの実行可能ファイルをホームディレクトリ(またはパス上の他のディレクトリ、たとえば〜/ bin)にダウンロードします。

$ wget https://repo.joist.ws/mirror-all.jar ~/
$ wget https://repo.joist.ws/mirror ~/

ステップ4: ミラーファイルを実行可能にする

 $ chmod u+x mirror

ステップ5: 両方をリモートホームディレクトリ(またはパス上の他のディレクトリ、たとえば〜/ syncwork)にコピーします

$ scp mirror-all.jar your-server.com:~/
$ scp mirror your-server.com:~/

ステップ6: サーバーのホームディレクトリからサーバー側を起動します

$ ./mirror server
2017-08-15 10:44:15 INFO  Listening on 49172, version unspecified

ステップ7: 次に、ホームディレクトリに任意の名前で新しいディレクトリを作成します。「code」という名前の新しいディレクトリを作成しています。 いくつかのコンテンツを含む1つのテキストファイルを作成し、それをコードディレクトリの下に置いてツールをテストします。

$ cd code
$vi test.txt
this is test.

ステップ8: クライアントのホームディレクトリからクライアント側を起動します

$ ./mirror client -h your-desktop.com -l ./code/ -r ./code/
2017-08-15 10:47:04 INFO  Connected, starting session, version unspecified
2017-08-15 10:47:04 ERROR Error creating watchman channel, skipping watchman
java.lang.RuntimeException: Couldn't find watchman in possible paths [., /usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbin, /bin, /usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbin, /bin] with extensions [, .sh, .bat, .exe]
	at joist.util.Execute.resolve(Execute.java:182)
	at joist.util.Execute.getCommandPlusArgsArray(Execute.java:162)
	:
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

2017-08-15 10:47:04 INFO  Watchman not found, using WatchService instead
2017-08-15 10:47:04 INFO    Note that WatchService is buggy on Linux, and uses polling on Mac.
2017-08-15 10:47:04 INFO    While It will work with WatchService, especially to test, you should eventually install watchman.
2017-08-15 10:47:04 INFO  Client has 2 paths
2017-08-15 10:47:04 INFO  Server has 1 paths
2017-08-15 10:47:04 INFO  Tree populated
2017-08-15 10:47:04 INFO  Sending test.txt

上記のログの最後の行からわかるように、ミラーはtest.txtをサーバーに送信しました。 すばらしいです。ミラーのインストールとテストに成功しました。

ノート: チルダ(〜/ codeなど)の使用には注意してください。シェルがそれを解決するため、たとえば/ Users / you / codeになり、クライアントで解決されたパスがサーバーで無効になる可能性があります。 これにより、2台のマシンの$ HOME / codeディレクトリが同期されます。

ミラーの追加構成

デフォルトでは、ミラーは.gitignoreファイルにリストされているファイルを同期しません。 ただし、.gitignoreに加えて、追加のインクルードまたはエクスクルードを使用して構成することもできます。 追加の包含および除外パターンは、クライアントの起動時に渡すことができ、.gitignore形式に従います。例:

$ ./mirror client --exclude '.m2/` --include 'classpath' --include '.install' --exclude `build/`

システムウォッチ制限の構成

ディレクトリがたくさんある場合は、ネイティブファイルシステムの制限を増やす必要があることに注意してください。デフォルトでは、max_user_watchesの制限は8192です。以下のコマンドを実行して、524288に増やします。

$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

2台以上のマシンを同期するためのミラーの使用

Mirrorは、3台以上のマシンの同期もサポートしています。 例:

サーバーはミラーサーバープロセスを実行します(複数のサーバープロセスを開始する必要はありません)

ここで、インストールプロセスでサーバーとクライアントのセットアップ以外のマシンをもう1台同期し、新しいマシン(クライアント2と呼びましょう)で、インストールセクションの手順8を実行して、クライアント2をサーバーに接続するとします。
クライアント1とクライアント2はサーバーに接続し、サーバーの〜/ codeをサーバーの〜/ codeに同期します

これで、3台のマシン(サーバー、クライアント1、クライアント2)すべての同期が維持されます。 これら3つすべての〜/ codeディレクトリが同期されます。 同じアプローチで、必要な数のマシンを追加できます。

Linuxマシンにミラーを正常にインストール、構成、およびテストしました。 世界が知っておくべき疑問や新しいことを気軽に共有してください。