高交通ウェブサイトでSolr Safe DataImportとコアスワップ
-
13-11-2019 - |
質問
ハローフェロー技術者、
月に何百万もの訪問者を持つ(PHP)ウェブサイトを持っていると仮定しましょう。 Solrは、1つのサーバーがマスター、他の3つのサーバーが複製されている4つの別々のサーバー上で実行されています。
は、5分ごとにSolrに何千もの文書を挿入することができます。そしてそれ以外にも、ユーザーはSolrの更新をトリガーする必要がある彼らのアカウントを更新することができます。
文書を逃しずに、インデックス fast と safe を再構築するための安全な戦略を探しています。 safe デルタ/更新戦略を持つこと。私は戦略について考えています、そして私は彼らの意見を聞くためにここに彼らの意見を聞いて、そして私がこのアプローチのために行くべきであるならば、または彼らが何か(完全に)違うならば。
Solr DataImport
すべての操作では、1つのデータインポートハンドラを使用します。 DataImportHandlerDelqueryViaFullDelpPort FullimportHandlerDeltaFuriLimportHandlerDeltaSQueryViaFullDelpPort のようなデータとデルタのインポートをミックスしたい。私たちはMySQLデータベースをデータソースとして使用しています。
私の状況や私の戦略を理解していることを願っています。また、私が考えなかったボトルネックがあるかどうかを知りたいですか? Solrバージョン1.4を実行しています。
私が持っているいくつかの質問は、レプリケーションはどうですか?マスターサーバーがコアをスワップした場合、サラベーションはこれをどのように処理しますか?
解決
良い(そして硬い)質問!
全インポートは非常に重い操作です。一般的に、RDMの最新の変更にインデックスを更新するためにデルタクエリを実行するのが良いことです。フルインポートを実行する必要があるときにマスターを交換する理由を手に入れました。フルインポートが頻繁に使用されていない限り、いいね。
レプリケーションに関しては、マスターコアを交換する前に、再現中にレプリケーションがないことを確認してください。レプリケーションの仕組みの詳細については、 solr wiki を調べることができます。まだやりました。
さらに、マスターコアを交換する前にLive Coreでデルタインポートが実行されていないことを確認します。
他のヒント
私達は私達の終わりにわずかに修正された状況を持っています。 2つのDataImportHandlers - 1つが完全インポート用、その他デルタインポート用です。デルタのインポートは3時間ごとにCRONによって引き起こされ、完了までに数分かかります。約10Mの文書の完全なインポートは~48時間(狂気!)を取る。これの大部分は、膨大な量のデータがすべての文書のMySQLテーブルから取得されるため、ネットワークの待ち時間が含まれます。これら2つのテーブルは、2つの異なるMySQLサーバー上にあり、結合できません。
私たちは「ライブ」コアを持っています。これはデルタインポートを持つものです。別の「再構築」コアを紹介し、~48時間かかるフルインデックスを紹介します。この時期に、「Live」コアから更新/削除されたすべての文書を追跡し、それらの両方を同じ状態にするために「リビルド」コアにデルタインポートします。通常の日に、両方のコアが同じ状態になったら、それらを交換してRebuild Coreから役立ちます。 (誰がRebuild Coreが完全な索引付けされ、デルタパッチも適用されていることを監視しますか?)
「Live」と 'Rebild'の両方のコアを同時に 'abテスト'の両方を持ちたいと思うでしょう。その時には、「Live」と 'Rebuild'の両方のコアが一貫性のためにデルタをインポートすることになり、どちらも役に立ちます。結果に基づいて、我々はスワッピングしてもう一方を取り除きたいと思います。
このセットアップ全体を動作可能に安定させるためには、「再構築」コアが索引付けされているか、またはその状態でチェックされているか確認するモニタプロセスを導入する予定です。インデックス付きの場合、モニタプロセスはデルタ文書で更新し、両方のコアのデルタインデックス作成CRONをアクティブにします。 ABフェーズが完了すると、コアの1つがアンロードされ、もう1つのコアが交換されます。追加のクローは無効になります。
この設計には、より多くの可動部があり、モニタプロセスの信頼性は円滑な操作にとって重要です。 任意の提案/代替案?