Solrの本番環境導入
このセクションでは、Ubuntuなどの*nixプラットフォームでSolrを本番環境で実行するためのセットアップ方法について説明します。具体的には、Linuxホストで単一のSolrインスタンスを実行するためのセットアッププロセスを説明し、同じホストで複数のSolrノードを実行するためのヒントを提供します。
サービスインストールスクリプト
Solrには、LinuxにSolrをサービスとしてインストールするのに役立つサービスインストールスクリプト(`bin/install_solr_service.sh`)が含まれています。現在、このスクリプトはCentOS、Debian、Red Hat、SUSE、Ubuntu Linuxディストリビューションのみをサポートしています。スクリプトを実行する前に、セットアップに関するいくつかのパラメータを決定する必要があります。具体的には、Solrのインストール場所と、Solrファイルとプロセスの所有者となるシステムユーザーを決定する必要があります。
ディレクトリ構造の計画
ログやインデックスファイルなどのライブSolrファイルをSolrディストリビューションバンドルに含まれるファイルから分離することをお勧めします。これは、Solrのアップグレードを容易にし、システム管理者として従うべき良い習慣と考えられています。
Solrインストールディレクトリ
デフォルトでは、サービスインストールスクリプトは配布アーカイブを`/opt`に抽出します。インストールスクリプトを実行するときに`-i`オプションを使用して、この場所を変更できます。スクリプトはまた、Solrのバージョン付きディレクトリへのシンボリックリンクを作成します。たとえば、Solr 9.5.0のインストールスクリプトを実行すると、次のディレクトリ構造が使用されます。
/opt/solr-9.5.0
/opt/solr -> /opt/solr-9.5.0
シンボリックリンクを使用すると、スクリプトが特定のSolrバージョンに依存するのを防ぐことができます。今後、Solrの新しいバージョンにアップグレードする必要がある場合は、シンボリックリンクを更新して、アップグレードされたバージョンのSolrを指すようにするだけです。このページの残りのセクションでは、Solrインストールディレクトリを`/opt/solr`として参照します。
Solrユーザーの作成
セキュリティ上の理由から、Solrを`root`として実行することはお勧めしません。`bin/solr start`コマンドはそれを拒否します。そのため、すべてのSolrファイルと実行中のSolrプロセスの所有者となるシステムユーザーのユーザー名を決定する必要があります。デフォルトでは、インストールスクリプトは**solr**ユーザーを作成しますが、`-u`オプションを使用してこの設定をオーバーライドできます。組織に新しいユーザーアカウントの作成に関する特定の要件がある場合は、スクリプトを実行する前にユーザーを作成する必要があります。インストールスクリプトは、Solrユーザーを`/opt/solr`ディレクトリと`/var/solr`ディレクトリの所有者にします。
これで、インストールスクリプトを実行する準備ができました。
Solrインストールスクリプトの実行
スクリプトを実行するには、最新のSolr配布アーカイブをダウンロードし、以下の手順を実行する必要があります。
tar xzf solr-9.5.0.tgz solr-9.5.0/bin/install_solr_service.sh --strip-components=2
上記のコマンドは、アーカイブからinstall_solr_service.sh
スクリプトを現在のディレクトリに抽出します。Red Hatにインストールする場合は、Solrインストールスクリプトを実行する前にlsofがインストールされていることを確認してください(sudo yum install lsof
)。インストールスクリプトはrootとして実行する必要があります。
sudo bash ./install_solr_service.sh solr-9.5.0.tgz
デフォルトでは、スクリプトは配布アーカイブを/opt
に展開し、Solrがファイルを/var/solr
に書き込むように設定し、Solrをsolr
ユーザーとして実行します。したがって、次のコマンドは前のコマンドと同じ結果を生成します。
sudo bash ./install_solr_service.sh solr-9.5.0.tgz -i /opt -d /var/solr -u solr -s solr -p 8983
インストールスクリプトに渡されるオプションを使用して、サービス名、インストールディレクトリ、ポート、および所有者をカスタマイズできます。使用可能なオプションを確認するには、次の手順を実行します。
sudo bash ./install_solr_service.sh -help
スクリプトが完了すると、Solrはサービスとしてインストールされ、サーバーのバックグラウンドで(ポート8983で)実行されます。確認するには、次の手順を実行します。
sudo service solr status
サービスをすぐに開始したくない場合は、-n
オプションを渡します。その後、設定の完了後などに、サービスを手動で開始できます。
Solrの設定を微調整するために行える追加の設定については、後ほど説明します。先に進む前に、インストールスクリプトによって実行される手順を詳しく見てみましょう。これにより、Solrのインストールに関する重要な詳細を理解し、このガイドの他のページを読む際に役立ちます。たとえば、ページでSolrホームを参照している場合、システム上のどこにあるかを正確に知ることができます。
Solrホームディレクトリ
Solrホームディレクトリ(Solrインストールディレクトリと混同しないでください)は、Solrがインデックスファイルを含むコアディレクトリを管理する場所です。デフォルトでは、インストールスクリプトは/var/solr/data
を使用します。インストールスクリプトで-d
オプションが使用された場合、これは-dオプションに指定された場所のdata
サブディレクトリに変更されます。システム上のSolrホームディレクトリのコンテンツを確認してください。solr.xml
をZooKeeperに保存しない場合、ホームディレクトリにはsolr.xml
ファイルが含まれている必要があります。Solrが起動すると、Solrコントロールスクリプトは-Dsolr.solr.home=…
システムプロパティを使用してホームディレクトリの場所を渡します。
環境オーバーライドインクルードファイル
サービスインストールスクリプトは、bin/solr
スクリプトで使用されるデフォルトをオーバーライドする環境固有のインクルードファイルを作成します。インクルードファイルを使用する主な利点は、環境固有のすべてのオーバーライドが定義されている単一の場所を提供することです。デフォルトパスがインストールスクリプトによって設定されている/etc/default/solr.in.sh
ファイルの内容を確認してください。インストールスクリプトで-s
オプションを使用してサービスの名前を変更した場合、ファイル名の最初の部分は異なります。 solr-demo
という名前のサービスの場合、ファイル名は/etc/default/solr-demo.in.sh
になります。このファイルを使用してオーバーライドできる設定はたくさんあります。ただし、少なくともこのスクリプトはSOLR_PID_DIR
およびSOLR_HOME
変数を定義する必要があります。例:
SOLR_PID_DIR=/var/solr
SOLR_HOME=/var/solr/data
SOLR_PID_DIR
変数は、コントロールスクリプトがSolrサーバーのプロセスIDを含むファイルを書き出すディレクトリを設定します。
ログ設定
SolrはロギングにApache Log4Jを使用します。インストールスクリプトは/opt/solr/server/resources/log4j2.xml
を/var/solr/log4j2.xml
にコピーします。 /etc/default/solr.in.sh
の次の設定を確認して、Solrインクルードファイルがログを正しい場所に送信するように設定されていることを確認してください。
LOG4J_PROPS=/var/solr/log4j2.xml
SOLR_LOGS_DIR=/var/solr/logs
Log4J設定の詳細については、ロギングの設定を参照してください。
init.dスクリプト
LinuxでSolrのようなサービスを実行する場合、システム管理者がservice solr start
などのサービツールを使用してSolrを制御できるように、init.dスクリプトを設定するのが一般的です。インストールスクリプトは、開始するのに役立つ非常に基本的なinit.dスクリプトを作成します。インストールスクリプトによって設定されたデフォルトのスクリプト名である/etc/init.d/solr
ファイルを確認してください。インストールスクリプトで-s
オプションを使用してサービスの名前を変更した場合、ファイル名は異なります。インストールスクリプトに渡されたパラメーターに基づいて、環境に次の変数が設定されていることに注意してください。
SOLR_INSTALL_DIR=/opt/solr
SOLR_ENV=/etc/default/solr.in.sh
RUNAS=solr
SOLR_INSTALL_DIR
およびSOLR_ENV
変数は自明です。 RUNAS
変数は、Solrプロセスの所有者(solr
など)を設定します。この値を設定しないと、スクリプトはSolrをrootとして実行します。これは本番環境では推奨されません。 rootとして次の操作を行うことにより、/etc/init.d/solr
スクリプトを使用してSolrを起動できます。
service solr start
/etc/init.d/solr
スクリプトは、stop、restart、およびstatusコマンドもサポートしています。Solrに付属のinitスクリプトは非常に基本的であり、Solrをサービスとして設定する方法を示すことを目的としていることに注意してください。ただし、LinuxでサービスとしてSolrを制御するには、supervisordやupstartなどのより高度なツールを使用することも一般的です。Solrをsupervisordなどのツールと統合する方法を示すことは、このガイドの範囲外ですが、init.d/solr
スクリプトは、開始するのに十分なガイダンスを提供するはずです。また、インストールスクリプトは、ホストマシンが初期化されるときにSolrサービスが自動的に開始されるように設定します。
進捗チェック
次のセクションでは、本番環境の設定を微調整するのに役立つ追加の環境設定について説明します。ただし、先に進む前に、これまでに達成した内容を確認しましょう。具体的には、/etc/init.d/solr
を使用してSolrを制御できる必要があります。次のコマンドがセットアップで機能することを確認してください。
sudo service solr restart
sudo service solr status
statusコマンドは、実行中のSolrノードに関する基本情報を次のように提供する必要があります。
Solr process PID running on port 8983
{
"version":"5.0.0 - ubuntu - 2014-12-17 19:36:58",
"startTime":"2014-12-19T19:25:46.853Z",
"uptime":"0 days, 0 hours, 0 minutes, 8 seconds",
"memory":"85.4 MB (%17.4) of 490.7 MB"}
status
コマンドが成功しない場合は、/var/solr/logs/solr.log
にエラーメッセージがないか確認してください。
本番環境の微調整
ConcurrentMergeSchedulerの動的デフォルト
マージスケジューラはsolrconfig.xml
で設定され、デフォルトはConcurrentMergeScheduler
です。このスケジューラは、複数のスレッドを使用してバックグラウンドでLuceneセグメントをマージします。
デフォルトでは、ConcurrentMergeScheduler
はmaxThreadCount
およびmaxMergeCount
のデフォルトを自動的に検出します。 maxThreadCount
は4またはJVMで使用可能なプロセッサ数の半分(いずれか大きい方)に設定され、maxMergeCount
はmaxThreadCount + 5
に設定されます。
スピニングディスクを使用している場合は、SolrConfig.xmlのIndexConfigセクションでmaxThreadCount
およびmaxMergeCount
の値を明示的に設定して、ハードウェアに適した値が使用されるようにすることをお勧めします。
メモリとGC設定
デフォルトでは、bin/solr
スクリプトは最大Javaヒープサイズを512M(-Xmx512m)に設定します。これはSolrを使い始めるのに適しています。本番環境では、検索アプリケーションのメモリ要件に基づいて最大ヒープサイズを増やす必要があります。本番サーバーでは、8〜16ギガバイトの値は珍しくありません。Solrサーバーのメモリ設定を変更する必要がある場合は、インクルードファイルのSOLR_HEAP
変数を使用します。例:
SOLR_HEAP="8g"
必要なことがわかっている場合を除き、非常に大きなJavaヒープを割り当てないでください。詳細については、メモリヒープ設定の選択を参照してください。 |
また、Solrコントロールスクリプトには、さまざまなワークロードでSolrでうまく機能することが示されている、事前設定されたGarbage Firstガベージコレクション設定が付属しています。ただし、これらの設定は、Solrの特定の使用方法には適していない場合があります。したがって、GC設定を変更する必要がある場合があります。これは、/etc/default/solr.in.sh
インクルードファイルのGC_TUNE
変数を使用して行う必要があります。
ガベージコレクション設定の詳細については、次の記事を参照してください。 。https://cwiki.apache.org/confluence/display/solr/ShawnHeisey 。https://www.oracle.com/technetwork/articles/java/g1gc-1984535.html
メモリとガベージコレクションの設定を調整するには、JVM設定を参照することもできます。
SolrCloudを使用した本番環境への移行
SolrをSolrCloudモードで実行するには、インクルードファイルのZK_HOST
変数をZooKeeperアンサンブルを指すように設定する必要があります。埋め込みZooKeeperの実行は、本番環境ではサポートされていません。たとえば、デフォルトのクライアントポート2181(zk1、zk2、zk3)で次の3つのホストにホストされているZooKeeperアンサンブルがある場合、次のように設定します。
ZK_HOST=zk1,zk2,zk3
ZK_HOST
変数が設定されている場合、Solrは「クラウド」モードで起動します。
ZooKeeper chroot
他のシステムで共有されているZooKeeperインスタンスを使用している場合は、ZooKeeperのchrootサポートを使用してSolrCloud znodeツリーを分離することをお勧めします。たとえば、SolrCloudによって作成されたすべてのznodeが/solr
に格納されるようにするには、ZK_HOST
接続文字列の末尾に/solr
を配置します。例:
ZK_HOST=zk1,zk2,zk3/solr
初めてchrootを使用する前に、Solrコントロールスクリプトを使用してZooKeeperにルートパス(znode)を作成する必要があります。 dafür können wir den Befehl mkroot verwenden
bin/solr zk mkroot /solr -z <ZK_node>:<ZK_PORT>
既存の |
不明なコアの削除
Solrがファイルシステムからコアをロードすると、ZooKeeperで対応するクラスター状態をチェックします。対応するエントリが存在しない場合、コアはスキップされ、警告がログに記録されます。これにより、構成が修正された後もインデックスが有効なままになる誤設定(間違ったZooKeeperインスタンスまたはchrootへの接続など)から保護されます。ただし、コレクションの意図的な削除の一部として正常に削除されていない不要なコアを手動で削除する必要がある場合があります。
孤立したファイルを自動的に削除したい場合は、インクルードファイルを編集してSOLR_DELETE_UNKNOWN_CORES
をtrue
に設定できます。
SOLR_DELETE_UNKNOWN_CORES=true
Solrホスト名
インクルードファイルのSOLR_HOST
変数を使用して、Solrサーバーのホスト名を設定します。
SOLR_HOST=solr1.example.com
Solrサーバーのホスト名を設定することをお勧めします。特にSolrCloudモードで実行する場合、ZooKeeperに登録するときのノードのアドレスが決まるためです。
管理UIの環境バナー
誤って間違ったクラスタに変更を加えないように、現在運用環境で作業しているかどうかを管理UIで視覚的に表示するように設定できます。そのためには、solr.in.sh
またはsolr.in.cmd
ファイルを-Dsolr.environment=prod
設定で編集するか、environment
という名前のクラスタプロパティを設定します。許可される値はdev
、test
、stage
、またはprod
です。これらのそれぞれには、デフォルトのラベルと色が事前に定義されています。ラベルや色を指定するには、以下のようにカンマ区切りの形式を使用します。ラベルは色の前に定義する必要があります。引用符を避けるために、スペースの代わりに+
文字を使用できます。色は、有効なCSSの色または数値(たとえば、明るい赤の場合は#ff0000
)を指定できます。有効な環境設定の例
-
prod
(デフォルトのラベルは「本番環境」、デフォルトの色は赤系統の色です) -
test,label=機能+テスト
(デフォルトの色は黄色のままですが、ラベルは上書きされます) -
dev,label=MyDev,color=blue
(ラベルと色の両方を名前で上書きします) -
stage,color=#ff8888
(コードで色をカスタマイズします)
solrconfig.xml での設定の上書き
Solrでは、起動時に-Dproperty=value
構文を使用して渡されるJavaシステムプロパティを使用して、設定プロパティを上書きできます。たとえば、solrconfig.xml
では、デフォルトの自動ソフトコミット設定は次のように設定されています。
<autoSoftCommit>
<maxTime>${solr.autoSoftCommit.maxTime:3000}</maxTime>
</autoSoftCommit>
一般的に、Solr設定ファイルで${solr.PROPERTY:DEFAULT_VALUE}
構文を使用しているプロパティが表示された場合は、Javaシステムプロパティを使用して上書きできることがわかります。たとえば、ソフトコミットのmaxTimeを10秒に設定するには、次のように-Dsolr.autoSoftCommit.maxTime=10000
を使用してSolrを起動します。
bin/solr start -Dsolr.autoSoftCommit.maxTime=10000
bin/solr
スクリプトは、起動時に-D
で始まるオプションをJVMに渡すだけです。本番環境で実行するには、インクルードファイルに定義されているSOLR_OPTS
変数にこれらのプロパティを設定することをお勧めします。ソフトコミットの例に従って、/etc/default/solr.in.sh
では、次のようにします。
SOLR_OPTS="$SOLR_OPTS -Dsolr.autoSoftCommit.maxTime=10000"
ulimit 設定(*nix オペレーティングシステム)
監視し、できるだけ高く設定する必要がある設定がいくつかあります。できれば「無制限」に設定することをお勧めします。ほとんどの*nixオペレーティングシステムでは、コマンドプロンプトで次のように入力することで、現在の値を確認できます。
ulimit -a
特に、次の4つの設定は非常に高く設定することが重要です。可能であれば無制限に設定してください。
-
最大プロセス数(
ulimit -u
):推奨される*最小*値は65,000です。 -
ファイルハンドル(
ulimit -n
):推奨される*最小*値は65,000です。すべて のレプリカで使用されるすべてのファイルのファイルハンドルが一度に開かれるため、これは非常に大きくなる可能性があります。 -
仮想メモリ(
ulimit -v
):無制限に設定します。これは、インデックスのMMappingに使用されます。 -
最大メモリサイズ(
ulimit -m
):MMapでも使用されます。無制限に設定します。 -
システムがサポートしている場合は、
sysctl vm.max_map_count
も無制限に設定する必要があります。
これらの設定を永続的に上げることを強くお勧めします。永続的に上げるための正確なプロセスは、オペレーティングシステムによって異なります。システムによっては、設定ファイルを編集してサーバーを再起動する必要があります。特定の環境でのガイダンスについては、システム管理者に相談してください。
カーネルまたはオペレーティングシステムをアップグレードするたびに、これらの制限を確認してください。これらの操作により、これらの制限がデフォルト値にリセットされる可能性があります。 |
これらの制限を超えた場合、Solrによって報告される問題は、制限を超えた特定の操作によって異なります。「開いているファイルが多すぎる」、「接続エラー」、「最大プロセス数を超えました」などのエラーが報告されているほか、SolrCloudのリカバリが失敗する場合があります。 |
スワップの回避(*nix オペレーティングシステム)
SolrのようなJavaアプリケーションを実行する場合、OSがメモリをディスクにスワップするのは非常に悪い状況です。通常、Solrノードがスワップしてパフォーマンスの低下、タイムアウト、システムの不安定化を引き起こすのではなく、他の正常なSolrノードが引き継げるように、ハードクラッシュの方が望ましいです。そのため、ホストのスワップを完全に無効にするか、「スワップ性」を低くすることをお勧めします。これらの手順は、Linux環境で有効です。また、DockerコンテナでSolrを実行する場合は、これらの変更を**ホスト**に適用する必要があることに注意してください。
スワップの無効化
Linuxシステムのスワップを一時的に無効にするには、swapoff
コマンドを実行します。
sudo swapoff -a
この設定を永続的にするには、まずホストに十分な物理RAMがあることを確認してから、スワップを無効にするための正しい手順について、Linuxシステムのドキュメントを参照してください。
スワップ性の低減
別の方法として、システムの「スワップ性」を低くすることができます。Linuxシステムはデフォルトでは、高いデフォルトの「スワップ性」値を持つことにより、メモリをディスクにスワップすることに非常に積極的です。これを非常に低い値に減らすと、swapoff
を使用するのと同じ効果が得られますが、緊急時にはLinuxがスワップできるようになります。現在のスワップ性設定を確認するには、次を実行します。
cat /proc/sys/vm/swappiness
次に、設定を永続的に変更するには、rootユーザーとして/etc/sysctl.conf
を開きます。次に、ファイルのこの行を変更または追加します。
vm.swappiness = 1
または、次のコマンドを実行して設定を一時的に変更することもできます。
echo 1 > /proc/sys/vm/swappiness
セキュリティに関する考慮事項
管理者は、本番環境に移行する際の重要なステップとして、セキュリティ設定を慎重に検討する必要があります。Solrは、ユーザーのセキュリティニーズを満たすために、すぐに使用できる多くの機能を提供しています。認証と承認は、さまざまなセキュリティプラグインを使用して構成でき、SSL / TLSを有効にすることでプライバシーを強化でき、(SolrCloudでは)ZooKeeperデータはACLルールで保護して、不正な読み取りと書き込みを防ぐことができます。
これらの対策やその他の対策が講じられたとしても、Solrは常にファイアウォールで保護することを強くお勧めします。Solrは、オープンインターネットに公開するように設計されていません。
また、Solrは厳密に必要なネットワークインターフェースのみにリッスンすることを強くお勧めします。管理者がSolrを意図せずに広範囲に公開するのを防ぐため、Solrはデフォルトではループバックインターフェース( "127.0.0.1")のみをリッスンします。ほとんどのデプロイメントでは、他のボックスからアクセスできるように、この値を制限の少ない値に変更する必要があります。これは、環境の「インクルードスクリプト」(solr.in.sh
またはsolr.in.cmd
)でSOLR_JETTY_HOST
値を設定することで実行できます。
----
SOLR_JETTY_HOST="0.0.0.0"
----
同じ設定は、-Dsolr.jetty.host
システムプロパティとしても使用できます。
Solrで実行される場合、埋め込みZookeeperについても同様です。デフォルトでは、埋め込みZookeeperはループバックインターフェース( "127.0.0.1")のみをリッスンします。バインドホストは、環境の「インクルードスクリプト」(solr.in.sh
またはsolr.in.cmd
)のSOLR_ZK_EMBEDDED_HOST
値によって制御されます。
----
SOLR_ZK_EMBEDDED_HOST="0.0.0.0"
----
同じ設定は、-Dsolr.zk.embedded.host
システムプロパティとしても使用できます。
ホストごとに複数のSolrノードを実行する
bin/solr
スクリプトは、1台のマシンで複数のインスタンスを実行できますが、**一般的な**インストールでは、この設定は推奨されません。追加のインスタンスごとに、追加のCPUとメモリリソースが必要になります。単一のインスタンスは、複数のインデックスを簡単に処理できます。
推奨事項を無視する場合
すべての推奨事項には例外があります。上記の推奨事項の場合、その例外は、極端なスケーラビリティについて議論する場合に主に適用されます。1つのホストで複数のSolrノードを実行する最大の理由は、非常に大きなヒープの必要性を減らすことです。 Javaヒープが非常に大きくなると、起動スクリプトがデフォルトで提供するGCチューニングを行っても、ガベージコレクションの休止時間が非常に長くなる可能性があります。ヒープが「非常に大きい」と見なされる正確なポイントは、Solrの使用方法によって異なります。これは、しきい値として指定できる具体的な数値がないことを意味しますが、ヒープが16〜32ギガバイトに達している場合は、ノードの分割を検討する時期かもしれません。理想的には、これはより多くのマシンを意味しますが、予算の制約により、それが不可能になる場合があります。 ヒープが32GBに達すると、別の問題が発生します。32GB未満では、Javaは圧縮ポインタを使用できますが、それを超えると、より大きなポインタが必要になり、メモリが消費され、JVMの速度が低下します。 ユースケースで31GBを超えるヒープが必要な場合は、複数のノードを検討してください。通常、32GBを超えるヒープを持つ1つのノードよりもパフォーマンスが優れているためです。 |
ユースケースで複数のインスタンスが必要な場合は、少なくとも実行するノードごとに一意のSolrホームディレクトリが必要です。理想的には、複数のSolrノードがディスク上のファイルにアクセスするときに互いに競合しないように、各ホームは異なる物理ディスク上にある必要があります。異なるSolrホームディレクトリを持つということは、ノードごとに異なるインクルードファイルが必要になることを意味します。さらに、/etc/init.d/solr
スクリプトを使用してSolrをサービスとして制御する場合、ノードごとに個別のスクリプトが必要です。最も簡単な方法は、サービスインストールスクリプトを使用して、同じホストに複数のサービスを追加することです。次に例を示します。
sudo bash ./install_solr_service.sh solr-9.5.0.tgz -s solr2 -p 8984
上記のコマンドは、書き込み可能(別名「ライブ」)ファイルに/var/solr2
を使用して、ポート8984で実行されているsolr2
という名前のサービスを追加します。2番目のサーバーは引き続きsolr
ユーザーが所有および実行し、/opt
にあるSolr配布ファイルを使用します。solr2サービスをインストールした後、次のようにして正しく機能することを確認します。
sudo service solr2 restart
sudo service solr2 status