100万個のファイルをリモートサーバーと効率的に同期するオプションはありますか?


27

私が働いている会社には、「プレイリスト」と呼ばれるものがあります。これは、それぞれ100〜300バイトの小さなファイルです。それらの約百万があります。それらの約100,000は1時間ごとに変更されます。これらのプレイリストは、異なる大陸にある他の10台のリモートサーバーに1時間ごとにアップロードする必要があり、理想的には2分以内にすばやく実行する必要があります。マスターで削除されたファイルは、すべてのレプリカでも削除されることが非常に重要です。現在、インフラストラクチャにLinuxを使用しています。

内容を比較せずにファイル全体をコピーするために、-Wオプションでrsyncを試すことを考えていました。まだ試していませんが、rsyncの経験が豊富な人なら、それが実行可能なオプションかどうかを教えてくれるでしょうか?

他にどのようなオプションを検討する価値がありますか?

更新: lsyncdオプションを回答として選択しましたが、これは最も人気があったためです。その他の推奨代替案も独自の方法で有効です。


1
変更または削除されたファイルを示すログがありますか?
オリバー

3
プレイリストのみがmysqlレコードだった場合。その後、データベースレプリケーションを使用して、送信/受信に必要なものをmysqlで解決できます。
マット

@oliverやってます。ただし、そのログを信頼する必要があります。つまり、ログを生成するコードが正しい必要があり、そのログを処理するカスタムコードが必要です。私はむしろ、コミュニティによって広範にテストされた何かに対してそれを行うために、社内でビルドされたコードを避けたいです。
ジルビナス

変更を1時間ごとにのみ適用したいですか?または、インスタントレプリケーションも使用できますか?
フェイカー

1
rsyncが100万個のファイルを処理するのにかかる時間を過小評価しないでください。試してみてください、あなたはあなたが今何をしているかがわかります。そのログがある場合は、それを使用するか、提案された他の解決策を試してください。
オリバー

回答:


39

インスタント更新も許容されるため、lsyncdを使用できます。
ディレクトリを監視し(inotify)、rsyncスレーブに変更します。
起動時に完全rsyncに実行されるため、しばらく時間がかかりますが、その後は変更のみが送信されます。
ディレクトリの再帰的な監視が可能です。スレーブサーバーがダウンしている場合、同期が戻るまで同期が再試行されます。

これがすべて単一のディレクトリ(またはディレクトリの静的リスト)にある場合は、incronも使用できます。
欠点は、フォルダーを再帰的に監視できないため、同期機能を自分で実装する必要があることです。


再び素晴らしいヒント:)
ジルビナス

1
+1これは本質的にキャッシュの一貫性の問題であり、変更をプッシュするモニターが最も簡単なソリューションです。lsyncd道具...その
クリスS

1
私が調査しますlsyncdinotify深くとしてあなたの特定のサーバOSに適用されます。利用可能なinotifyウォッチの数には制限があります。デフォルトは、特定のLinuxバージョンに応じて約1500または8000であると思います。ほとんどのカーネルでは制限を引き上げることができますが、100万個のファイルを監視することは実用的ではありません。2008年にはうまくいきませんでした。また、inotifyイベントキューがオーバーフローしてイベントが失われる可能性があるため、そこから回復する方法が必要です。綿密に調整されたlsyncd実装と毎日rsyncが、2012年にベースをカバーするために機能する可能性があります。
古いプロ

2
実際には、個々のファイルではなくディレクトリiontify上で行います。いくつのディレクトリを見ることができますか?チェックします(通常8192)。/proc/sys/fs/inotify/max_user_watches
フェイカー

2
〜50kのディレクトリでは、inotifyはおそらく十分に拡張できません。2009年に100kディレクトリで同様のアプローチを試みたとき、すべてのディレクトリをサブスクライブするのに時間がかかりました。@OldProに関しては、私たちにとってはうまくいきませんでした。
-neovatar

11

GlusterFSなどの分散ファイルシステムの使用を検討してください。レプリケーションと並列処理を念頭に置いて設計されているため、GlusterFSはinotifyおよびを含むアドホックソリューションよりもはるかにスムーズに最大10台のサーバーに拡張できますrsync

この特定のユースケースでは、10レプリカの10サーバーGlusterFSボリューム(つまり、サーバーごとに1レプリカ/ブリック)を構築し、各レプリカがボリューム内の他のすべてのレプリカの正確なミラーになるようにします。GlusterFSは、ファイルシステムの更新をすべてのレプリカに自動的に伝播します。

各場所のクライアントはローカルサーバーに接続するため、ファイルへの読み取りアクセスは高速になります。重要な質問は、書き込みレイテンシを許容できるほど低く保つことができるかどうかです。答える唯一の方法は、それを試すことです。


Glusterfsのための1
トム・オコナー

8

私は疑うrsync百万のファイルをスキャンし、リモートシステムに10回、それを比較すると、longにかかるので、通常の方法で、このために働くだろう。inotify変更されたファイルのリストを保持し、それらをリモートサーバーにプッシュするようなものでシステムを実装しようとします(これらの変更が別の方法で記録されない場合)。次に、このリストを使用して、転送する必要があるファイルをすばやく特定できます。rsync(またはそれ以上の10個の並列インスタンス)を使用してもかまいません。

編集:少しの作業で、このinotify / log watchアプローチを使用して、変更が発生したらすぐにファイルをコピーすることもできます。


5

さらにいくつかの選択肢:

  • RabbitMQまたはGearmanにジョブを挿入して、プライマリサーバーでファイルを削除または追加するたびに非同期ですべてのリモートサーバーで同じファイルを削除(または追加)します。
  • ファイルをデータベースに保存し、レプリケーションを使用してリモートサーバーの同期を維持します。
  • ZFSがある場合は、 ZFSレプリケーションを使用できます
  • 一部のSANにはファイル複製があります。これがインターネット上で使用できるかどうかはわかりません。

4

これは、MongoDBおよびおそらくGridFSの理想的なストーリーブックのユースケースのようです。ファイルは比較的小さいため、MongoDBだけで十分ですが、GridFS APIを使用すると便利な場合があります。

MongoDBはnosqlデータベースであり、GridFSはその上に構築されたファイルストレージです。MongoDBには、レプリケーションシャーディングに関する多くのオプションが組み込まれているため、ユースケースで非常に適切に拡張する必要があります。

おそらく、プライマリデータセンターにあるマスター(同じ場所にフェールオーバーする場合は2番目のマスター)と、世界中に分散している10個の "スレーブ"で構成されるレプリカセットから開始するでしょう。次に、負荷テストを行って、書き込みパフォーマンスが十分かどうかを確認し、ノードへのレプリケーション時間を確認します。さらにパフォーマンスが必要な場合は、セットアップをシャードに変更できます(ほとんどの場合、書き込み負荷をより多くのサーバーに分散させるため)。MongoDBは、「安い」ハードウェアを使用して巨大なセットアップをスケールアップするように設計されているため、安価なサーバーのバッチを投入してパフォーマンスを向上させることができます。


0

私はS3バックエンドを使用し、必要なすべてのサーバーにそれをマウントするだけです-そうすれば、とにかく誰もがすぐに同期します


ストレージは同期されますが、アプリケーションに通知する必要があるため、元の状態に戻るか、誰かがこれらのプレイリストにアクセスするたびにストレージをポーリングする必要があります。どちらの場合もパフォーマンスは恐ろしいでしょう。
クリスS

アプリケーションは、誰かがプレイリストにアクセスするたびにストレージをポーリングする必要はありません。1時間以内に、古いデータがなくてもアプリケーションが実行されるのに十分な時間だけです。また、S3がバックエンドとして使用される場合、アプリケーションが最初にファイルをポーリングする必要があるのはなぜですか?それらは常に最新の状態になります
ミスターITグル

0

まだ言及されていないように見えるオプションは、すべてのファイルを1つの圧縮ファイルにアーカイブすることです。これにより、合計サイズが大幅に削減され、数百万の個々のファイルを処理することによって生じるオーバーヘッドがすべて削除されます。1つの大きな更新でファイルのセット全体を置き換えることにより、削除されたファイルがレプリカで削除されることを保証できます。

欠点は、もちろん、不必要に多くのファイルを転送していることです。これは、圧縮のおかげでサイズが小さくなったため、バランスが取れている場合とない場合があります。また、その数のファイルを圧縮するのにどれくらい時間がかかるかわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.