ユーザー管理インデックスレプリケーション
ユーザー管理インデックスレプリケーションは、リーダーインデックスの完全なコピーを1つまたは複数のフォロワーレプリカに配布します。リーダーはインデックスの更新を管理し続けます。すべてのクエリはフォロワーによって処理されます。この役割分担により、Solr は大規模な検索量に対するクエリに適切に対応できるようにスケールできます。
下の図は、インデックスレプリケーションを使用する Solr 構成を示しています。リーダサーバのインデックスがフォロワーに複製されます。

Solr でのインデックスレプリケーション
Solr には HTTP 経由で動作するインデックスレプリケーションが含まれています
-
レプリケーションに影響を与える構成は、単一のファイル
solrconfig.xml
によって制御されます。 -
インデックスファイルだけでなく、構成ファイルのレプリケーションもサポートします。
-
同じ構成でプラットフォームをまたいで動作します。
-
OS 依存のファイルシステム機能(ハードリンクなど)に依存しません。
-
Solr と緊密に統合されており、管理ページではレプリケーションの各側面を細かく制御できます。
-
Java ベースのレプリケーション機能は、リクエストハンドラとして実装されています。したがって、レプリケーションの設定は、通常のリクエストハンドラの設定と似ています。
SolrCloud でのレプリケーション
SolrCloud クラスタには、リーダーノードまたはフォロワーノードという明示的な概念はありませんが、このページで説明する SolrCloud を使用する場合、 |
ReplicationHandler の設定
以下に説明するリーダーとフォロワーの役割に特有のReplicationHandler
構成オプションに加えて、一般的にサポートされるいくつかの特別な構成オプションがあります(SolrCloudを使用している場合でも)。
-
maxNumberOfBackups
は、このノードがbackup
コマンドを受信する際にディスクに保持するバックアップの最大数を指定する整数値です。 -
Solr の他のほとんどのリクエストハンドラーと同様に、defaults, invariants, および/または appends パラメータのセットを構成して、コマンドを処理する際に、
ReplicationHandler
でサポートされる任意のリクエストパラメータに対応させることができます。
リーダーサーバーの設定
レプリケーションを実行する前に、ハンドラーの初期化時に以下のパラメータを設定する必要があります。
replicateAfter
-
オプション
デフォルト:なし
レプリケーションを発生させるアクションを指定する文字列。有効な値は以下のとおりです。
-
commit
:リーダーインデックスでコミットが実行されるたびにレプリケーションをトリガーします。 -
optimize
:リーダーインデックスが最適化されるたびにレプリケーションをトリガーします。 -
startup
:リーダーインデックスが起動するたびにレプリケーションをトリガーします。
このパラメータには複数の値を指定できます。例:
+
<str name="replicateAfter">startup</str> <str name="replicateAfter">commit</str> <str name="replicateAfter">optimize</str>
+
startup
を使用する場合は、今後のコミットや最適化でレプリケーションをトリガーしたい場合に、commit
および/またはoptimize
のエントリも追加する必要があります。 -
backupAfter
-
オプション
デフォルト:なし
バックアップを発生させるアクションを指定する文字列。有効な値は
commit
、optimize
、またはstartup
です。このパラメータには複数の値を指定できます。レプリケーションには必須ではありませんが、バックアップを作成します。 maxNumberOfBackups
-
オプション
デフォルト:なし
保持するバックアップの数を指定する整数。これを使用して、最新の*N*個のバックアップを除くすべてを削除できます。
confFiles
-
オプション
デフォルト:なし
フォロワーにレプリケートする設定ファイルをカンマで区切って指定します。これらは、スキーマ、ストップワード、およびリーダー上で変更され、クエリの処理時に使用するためにフォロワー上で更新する必要がある同様の設定ファイルである必要があります。
solrconfig.xml
をコピーする場合は、リーダーの設定がフォロワーの設定を上書きしないように特別な注意が必要です。次のような行は、ローカル設定solrconfig_follower.xml
がフォロワーでsolrconfig.xml
として保存されることを保証します。<str name="confFiles">solrconfig_follower.xml:solrconfig.xml,managed-schema.xml,stopwords.txt</str>
リーダーサーバーでは、フォロワー設定ファイルの名前は何でもかまいませんが、
confFiles
文字列で名前が正しく識別されている必要があります。次に、コロン ':' の後に表示されるファイル名で保存されます。上記の例では、他のすべてのファイルは元の名前で保存されます。 commitReserveDuration
-
オプション
デフォルト:
00:00:10
コミットが非常に頻繁でネットワークが遅い場合は、このパラメータを調整して、データ転送に必要と予想される時間を増やすことができます。デフォルトは
00:00:10
、つまり10秒です。
以下の例は、ReplicationHandler
の可能な「リーダー」構成を示しています。これには、固定数のバックアップと、フォロワーがネットワークインターフェイスを飽和させないようにするためのmaxWriteMBPerSec
リクエストパラメータの不変設定が含まれています。
<requestHandler name="/replication" class="solr.ReplicationHandler">
<lst name="leader">
<str name="replicateAfter">optimize</str>
<str name="backupAfter">optimize</str>
<str name="confFiles">schema.xml,stopwords.txt,elevate.xml</str>
</lst>
<int name="maxNumberOfBackups">2</int>
<str name="commitReserveDuration">00:00:10</str>
<lst name="invariants">
<str name="maxWriteMBPerSec">16</str>
</lst>
</requestHandler>
フォロワーサーバーの設定
フォロワーの設定は、このアプローチではフォロワーが更新されたインデックスおよびその他のファイルのリクエストをリーダーに開始するため、リーダーとは異なる必要があります。
以下のパラメータを使用します。
leaderUrl
-
オプション
デフォルト:なし
リーダーのレプリケーションハンドラーの完全修飾URL。
このパラメータは、リーダーから新しいインデックスファイルと設定ファイルをフェッチするために定義する必要がありますが、
solrconfig.xml
で定義する必要はありません。fetchindex
コマンドのリクエストパラメータとして渡すことができます。 pollInterval
-
オプション
デフォルト:なし
フォロワーがリーダーをポーリングする間隔。形式は
HH:mm:ss
です。これが指定されていない場合、フォロワーは自動的にポーリングしません。構成されていない場合は、管理者UIまたはHTTP APIからfetchindexをトリガーできます。
compression
-
オプション
デフォルト:なし
インデックスファイルの転送中の圧縮を有効にします。可能な値は
internal
またはexternal
です。値がexternal
の場合は、リーダーのSolrにAccept-Encodingヘッダーを尊重するための設定があることを確認してください。これがinternal
に設定されている場合は、すべてが自動的に処理されます。このパラメータは一般的に使用すると便利に見えるかもしれませんが、リーダーノードとフォロワーノード間の帯域幅が一貫して低い場合にのみ必要になるのが通常です。
httpConnTimeout
-
オプション
デフォルト:
5000
リーダーへの接続を待機する時間(ミリ秒単位)。帯域幅が極端に低い場合や、レイテンシが非常に高い場合を除き、通常はデフォルトのままにすることができます。
httpReadTimeout
-
オプション
デフォルト:
10000
インデックスファイルの読み込みを待機する時間(ミリ秒単位)。
httpConnTimeout
と同様に、帯域幅が極端に低い場合や、レイテンシが非常に高い場合を除き、通常はデフォルトのままにすることができます。 httpBasicAuthUser
-
オプション
デフォルト:なし
リーダーがHTTP Basic認証で構成されている場合に使用するユーザー名。
httpBasicAuthPassword
-
オプション
デフォルト:なし
リーダーがHTTP Basic認証で構成されている場合に使用するパスワード。
次の例は、フォロワーでのReplicationHandler構成を示しています。
<requestHandler name="/replication" class="solr.ReplicationHandler">
<lst name="follower">
<str name="leaderUrl">http://remote_host:port/solr/core_name/replication</str>
<str name="pollInterval">00:00:20</str>
<!-- THE FOLLOWING PARAMETERS ARE USUALLY NOT REQUIRED-->
<str name="compression">internal</str>
<str name="httpConnTimeout">5000</str>
<str name="httpReadTimeout">10000</str>
<str name="httpBasicAuthUser">username</str>
<str name="httpBasicAuthPassword">password</str>
</lst>
</requestHandler>
ReplicationHandlerを使用したリピーターの設定
リーダーは、パフォーマンスに影響を与えることなく、ごく少数のフォロワーしかサービスを提供できない場合があります。一部の組織では、複数のデータセンターにフォロワーサーバーをデプロイしています。各フォロワーがリモートデータセンターからインデックスをダウンロードすると、結果としてダウンロードが過剰なネットワーク帯域幅を消費する可能性があります。このような場合のパフォーマンス低下を回避するために、1つ以上のフォロワーをリピーターとして構成できます。リピーターは、リーダーとフォロワーの両方として機能するノードです。
サーバーをリピーターとして構成するには、solrconfig.xml
ファイル内のレプリケーションrequestHandler
の定義に、リーダーとフォロワーの両方で使用するファイルリストを含める必要があります。
メインリーダーでreplicateAfter
がoptimize
に設定されている場合でも、replicateAfter
パラメータをcommit
に設定してください。これは、リピーター(または任意のフォロワー)では、インデックスがダウンロードされた後にのみコミットが呼び出されるためです。フォロワーでoptimizeコマンドが呼び出されることはありません。
オプションで、compression
パラメータを使用して、リーダーから圧縮されたファイルをフェッチするようにリピーターを構成して、インデックスのダウンロード時間を短縮できます。
以下は、リピーターのReplicationHandler構成の例です。
<requestHandler name="/replication" class="solr.ReplicationHandler">
<lst name="leader">
<str name="replicateAfter">commit</str>
<str name="confFiles">schema.xml,stopwords.txt,synonyms.txt</str>
</lst>
<lst name="follower">
<str name="leaderUrl">http://leader.solr.company.com:8983/solr/core_name/replication</str>
<str name="pollInterval">00:00:60</str>
</lst>
</requestHandler>
レプリケーション画面
レプリケーション画面には、指定したコアの現在のレプリケーション状態が表示されます。
この画面は、SolrをSolrCloudモードで実行していない場合にのみ表示されます。
リーダー/フォロワーインデックスレプリケーションを使用している場合は、この画面を使用して以下を実行できます。
-
レプリケーション可能なインデックスの状態を表示する(リーダーノードの場合)
-
現在のレプリケーションステータスを表示する(フォロワーノードの場合)
-
レプリケーションを無効にする(リーダーノードの場合)

フォロワーレプリケーション
リーダーはフォロワーをまったく認識していません。
フォロワーは、(pollInterval
パラメータに応じて)リーダーの現在のインデックスバージョンを確認するために、リーダーを継続的にポーリングします。フォロワーがリーダーに新しいバージョンのインデックスがあることを検出すると、レプリケーションプロセスを開始します。
手順は次のとおりです。
-
フォロワーは
filelist
コマンドを発行して、ファイルのリストを取得します。このコマンドは、ファイルの名前と、いくつかのメタデータ(サイズ、最終更新タイムスタンプ、エイリアスなど)を返します。 -
フォロワーは、ローカルインデックスにこれらのファイルがあるかどうかを確認します。次に、
filecontent
コマンドを実行して、欠落しているファイルをダウンロードします。これは、(HTTPチャンクエンコーディングのような)カスタム形式を使用して、ファイル全体または各ファイルの一部をダウンロードします。途中で接続が切断された場合、ダウンロードは失敗した場所から再開されます。どの時点でも、フォロワーはレプリケーションを完全に諦める前に5回試行します。 -
ファイルは一時ディレクトリにダウンロードされるため、ダウンロードプロセス中にフォロワーまたはリーダーがクラッシュした場合でも、ファイルが破損することはありません。代わりに、現在のレプリケーションは単に中止されます。
-
ダウンロードが完了すると、新しいファイルがライブインデックスディレクトリに移動され、ファイルのタイムスタンプはリーダー上の対応するファイルと同じになります。
-
フォロワーのReplicationHandlerによって、フォロワーでコミットコマンドが発行され、新しいインデックスがロードされます。
設定ファイルのレプリケーション
設定ファイルをレプリケートするには、confFiles
パラメータでそれらを定義します。リーダーのSolrインスタンスのconf
ディレクトリにあるファイルのみがレプリケートされます。
Solrは、インデックス自体がレプリケートされた場合にのみ設定ファイルをレプリケートします。つまり、リーダーで設定ファイルが変更された場合でも、そのファイルはリーダーのインデックスで新しいコミットまたは最適化が行われた後にのみレプリケートされます。
タイムスタンプが同一かどうかを判断するのに十分なインデックスファイルとは異なり、設定ファイルはチェックサムと比較されます。スキーマファイル(リーダーとフォロワー)は、チェックサムが同一である場合に同一であると判断されます。
設定ファイルをレプリケートする際の予防策として、Solrは設定ファイルを一時ディレクトリにコピーしてから、confディレクトリの最終的な場所に移動します。古い設定ファイルは、同じconf/
ディレクトリで名前が変更されて保持されます。ReplicationHandlerは、これらの古いファイルを自動的にクリーンアップしません。
レプリケーションに少なくとも1つの設定ファイルのダウンロードが含まれている場合、ReplicationHandlerはコミットコマンドの代わりにcore-reloadコマンドを発行します。
フォロワーサーバーでの破損問題の解決
ドキュメントがフォロワーに追加されると、フォロワーはリーダーと同期しなくなります。ただし、リーダーに新しいインデックスデータがあるまで、フォロワーは同期を維持するためのアクションを実行しません。
リーダーでコミット操作が行われると、リーダーのインデックスバージョンはフォロワーのインデックスバージョンとは異なります。フォロワーはファイルのリストをフェッチし、リーダーに存在するファイルの一部がローカルインデックスにも存在するが、サイズとタイムスタンプが異なることを検出します。これは、リーダーとフォロワーのインデックスに互換性がないことを意味します。
この問題を修正するために、フォロワーはリーダーからすべてのインデックスファイルを新しいインデックスディレクトリにコピーし、コアに新しいディレクトリから新しいインデックスをロードするように要求します。
ReplicationHandlerのHTTP APIコマンド
以下のHTTPコマンドを使用して、ReplicationHandlerの操作を制御できます。
enablereplication
-
すべてのフォロワーに対して、「リーダー」でのレプリケーションを有効にします。
http://_leader_host:port_/solr/_core_name_/replication?command=enablereplication
disablereplication
-
すべてのフォロワーに対して、リーダーでのレプリケーションを無効にします。
http://_leader_host:port_/solr/_core_name_/replication?command=disablereplication
indexversion
-
指定されたリーダーまたはフォロワーの最新のレプリケーション可能なインデックスのバージョンを返します。
V1 API
http://_host:port_/solr/_core_name_/replication?command=indexversion
V2 API
http://_host:port_/api/cores/_core_name_/replication/indexversion
fetchindex
-
指定されたフォロワーに、リーダーからインデックスのコピーを取得させます。
http://_follower_host:port_/solr/_core_name_/replication?command=fetchindex
leaderUrl
やcompression
などの追加属性(またはフォロワーサーバーの設定で説明されているその他のパラメーター)を渡して、リーダーから1回限りのレプリケーションを実行できます。これにより、フォロワー構成でリーダーのURLをハードコードする必要がなくなります。 abortfetch
-
リーダーから指定されたフォロワーへのインデックスのコピーを中止します。
http://_follower_host:port_/solr/_core_name_/replication?command=abortfetch
enablepoll
-
指定されたフォロワーがリーダーの変更をポーリングできるようにします。
http://_follower_host:port_/solr/_core_name_/replication?command=enablepoll
disablepoll
-
指定されたフォロワーがリーダーの変更をポーリングできないようにします。
http://_follower_host:port_/solr/_core_name_/replication?command=disablepoll
details
-
構成の詳細と現在のステータスを取得します。
http://_follower_host:port_/solr/_core_name_/replication?command=details
filelist
-
指定されたホストのインデックスに存在するLuceneファイルのリストを取得します。
V1 API
http://_host:port_/solr/_core_name_/replication?command=filelist&generation=<_generation-number_>
V2 API
http://_host:port_/api/cores/_core_name_/replication/files?generation=<_generation-number_>
indexversion
コマンドを実行すると、インデックスの世代番号を調べることができます。 backup
-
サーバーにコミットされたインデックスデータがある場合、リーダーにバックアップを作成します。それ以外の場合は、何も行いません。
http://_leader_host:port_/solr/_core_name_/replication?command=backup
このコマンドは、定期的なバックアップを作成するのに役立ちます。いくつかのサポートされているリクエストパラメータがあります
numberToKeep
-
これは、ハンドラーで
maxNumberOfBackups
初期化パラメーターが指定されていない限り、backupコマンドで使用できます。指定されている場合は、常にmaxNumberOfBackups
が使用され、numberToKeep
リクエストパラメーターを使用しようとするとエラーが発生します。 name
-
(オプション) バックアップ名。スナップショットは、コアのデータディレクトリ内の
snapshot.<name>
という名前のディレクトリに作成されます。デフォルトでは、名前はyyyyMMddHHmmssSSS
形式の日付を使用して生成されます。location
パラメーターが渡された場合は、データディレクトリの代わりに使用されます。 repository
-
使用するバックアップリポジトリの名前。指定しない場合は、デフォルトでローカルファイルシステムになります。
location
-
バックアップの場所。値は使用中のリポジトリによって異なります。ファイルシステムリポジトリの場合、場所はデフォルトでコアのdataDir(データディレクトリ)になり、指定する場合は、
SOLR_HOME
、SOLR_DATA_HOME
、またはsolr.xml
allowPaths
パラメーターで指定されたパス内に存在する必要があります。
restore
-
バックアップリポジトリからバックアップを復元します。
http://_leader_host:port_/solr/_core_name_/replication?command=restore
このコマンドは、バックアップを復元するために使用されます。いくつかのサポートされているリクエストパラメーターがあります
name
-
(オプション) バックアップ名。復元するバックアップされたインデックススナップショットの名前。名前が指定されていない場合は、locationディレクトリにsnapshot.<timestamp>形式のバックアップを探します。その場合は、最新のタイムスタンプのバックアップを選択します。
repository
-
バックアップが格納されているバックアップリポジトリの名前。指定しない場合は、デフォルトでローカルファイルシステムになります。
location
-
バックアップの場所。値は使用中のリポジトリによって異なります。ファイルシステムリポジトリの場合、場所はデフォルトでコアのdataDir(データディレクトリ)になり、指定する場合は、
SOLR_HOME
、SOLR_DATA_HOME
、またはsolr.xml
allowPaths
パラメーターで指定されたパス内に存在する必要があります。
restorestatus
-
実行中の復元操作のステータスを確認します。
http://_leader_host:port_/solr/_core_name_/replication?command=restorestatus
このコマンドは、復元操作のステータスを確認するために使用されます。このコマンドはパラメータを取りません。
ステータス値は、「In Progress」、「success」、または「failed」のいずれかです。失敗した場合は、応答で「exception」も送信されます。
deletebackup
-
backup
コマンドを使用して作成されたバックアップを削除します。http://_leader_host:port_ /solr/_core_name_/replication?command=deletebackup
サポートされているパラメータは2つあります。
name
-
スナップショットの名前。
snapshot.name
という名前のスナップショットが存在する必要があります。存在しない場合はエラーが返されます。 location
-
スナップショットが作成される場所。
分散インデックスの最適化
インデックスの最適化は、ほとんどのユーザーが通常気にする必要はないものです。特に、ReplicationHandler
を使用している場合は、インデックスの最適化の影響に注意する必要があります。
リーダーインデックスの最適化に必要な時間は、大幅に異なる場合があります。小さなインデックスは数分で最適化できる場合があります。非常に大きなインデックスには数時間かかる場合があります。変数には、インデックスのサイズとハードウェアの速度が含まれます。
新しく最適化されたインデックスの配布には、数分から1時間以上かかる場合があります。これもインデックスのサイズと、ネットワーク接続とディスクのパフォーマンス機能によって異なります。最適化中はマシンに負荷がかかり、クエリを適切に処理しません。フォロワーに1時間に数回更新をスケジュールすることを考えると、コミットされたスナップショットごとに最適化を実行することはできません。
最適化されたインデックスをコピーするということは、次の snappull
中に全体インデックスを転送する必要があることを意味します。これは大きなコストですが、どこでも最適化を実行するほど大きくはありません。
この例を考えてみましょう。3つのフォロワーと1つのリーダー構成で、新しく最適化されたインデックスを配布するには、合計で約80秒かかります。階層全体に変更をロールアウトするには、マシン(またはマシン グループ)あたり約10分かかります。この最適化がクエリ層全体でロールアウトされ、最適化されている各フォロワーノードが無効になり、クエリを受信していない場合、ロールアウトには少なくとも20分、場合によっては1時間半もかかる可能性があります。さらに、最適化の後、snappull
が独立して最適化されたファイルが異なると思うことがないように、ファイルを同期する必要があります。これにより、各インデックスがリーダーの完全なコピーである代わりに、インデックスの独立した破損につながる可能性もあります。
リーダーでの最適化により、直接的な最適化操作が可能になります。サービスを停止する必要があるクエリフォロワーはありません。最適化されたインデックスは、クエリが通常どおりサービスされている間にバックグラウンドで配布できます。最適化は、インデックスの更新を提供するアプリケーションにとって都合の良いときにいつでも発生する可能性があります。
最適化が一部の状況でいくつかの利点をもたらす可能性がある一方で、急速に変化するインデックスはその利点を長く保持せず、最適化は集中的なプロセスであるため、マージファクターを下げるなど、他のオプションを検討する方が良い場合があります(セグメントサイズの制御に関するセクションで説明しています)。
検索パフォーマンスが大幅に向上するという具体的な証拠がない限り、インデックスを最適化することを選択しないでください。 |