Apache Solr

 

solrのReplicationHandlerで簡単レプリケーション!

solrのReplicationHandlerを使ってレプリケーションします。snapshotの生成とsnapshotの世代管理も設定し、応用編で起動時にmaster/slaveサーバを選択できるようにします。起動時にmaster/slave設定する事で、サーバによってschema.xmlを変更する必要が無くなります。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

レプリケーションとは、複数のサーバでデータを同期することを言います。

solrのレプリケーションには2通りの方法があります。

solr1.3までのバージョンではssh + rsyncによるレプリケーションが行えます。

solr1.4以降ではReplicationHandlerでhttp通信によるレプリケーションが可能になりました。

ReplicationHandlerはhttp通信なので、ssh+rsync形式と違ってdaemonの起動も不要でportを開ける必要もありません。

solr1.4以降ではReplicationHandlerを使う事をおすすめします。


なお、ReplicationHandlerを行うにはcommons-httpClientが必要なので、jarを追加しましょう。

レプリケーションの設定はsolrconfig.xmlで行います。

solrconfig.xmlの初期設定では、ReplicationHandlerの設定は以下のようになっています。

  <requestHandler name="/replication" class="solr.ReplicationHandler" > 
    <!--
       To enable simple master/slave replication, uncomment one of the 
       sections below, depending on wether this solr instance should be 
       the "master" or a "slave".  If this instance is a "slave" you will 
       also need to fill in the masterUrl to point to a real machine.
    -->
    <!--
       <lst name="master">
         <str name="replicateAfter">commit</str>
         <str name="replicateAfter">startup</str>
         <str name="confFiles">schema.xml,stopwords.txt</str>
       </lst>
    -->
    <!--
       <lst name="slave">
         <str name="masterUrl">http://your-master-hostname:8983/solr</str>
         <str name="pollInterval">00:00:60</str>
       </lst>
    -->
  </requestHandler>

コメントアウトされており、レプリケーションは無効化されています。

ではレプリケーションを有効化してみます。

masterは自分でインックスを生成する側です。

masterからslaveにデータを送信するのではなく、slaveがmasterのデータを取得しにいきます。

  <requestHandler name="/replication" class="solr.ReplicationHandler" > 
    <lst name="master">
      <!-- レプリケーションのトリガー -->
      <str name="replicateAfter">startup</str>
      <str name="replicateAfter">commit</str>
      <!-- snapshotを取得するトリガー -->
      <str name="backupAfter">optimize</str>
      <!-- 同期する設定ファイル名(半角カンマ区切りで複数指定可能) -->
      <str name="confFiles">schema.xml,stopwords.txt,synonyms.txt</str>
    </lst>
    <!-- snapshotの保存件数(指定件数を超えたら古いsnapshotは削除されます) -->
    <int name="maxNumberOfBackups">5</int>
  </requestHandler>

solrはマルチマスター構成はサポートしていないので、masterサーバが1つになるようにしましょう。

slaveは自分でインデックスを生成しない、データを貰いに行く側です。

slaveはmasterに対して定期的にpollingし、データが更新されていないかチェックしています。

  <requestHandler name="/replication" class="solr.ReplicationHandler" > 
    <lst name="slave">
      <str name="masterUrl">http://localhost:8983/solr/${solr.core.name}</str>
      <str name="pollInterval">00:00:30</str>
    </lst>
  </requestHandler>

masterUrlでコア名をベタ書きしても構いませんが、${solr.core.name}とする事で全コア共通の設定が行えます。

レプリケーションの設定が終わったら、solr adminでレプリケーションの状態を確認してみましょう。

まずはmasterサーバを確認します。

テスト環境では http://localhost:8983/solr/#/address/replicationとしています。

solr adminのmasterサーバ

続いてslaveサーバを確認します。

テスト環境では http://localhost:8984/solr/#/address/replicationとしています。

solr adminのslaveサーバ

snapshotはmasterサーバでのみ生成されます

slaveは最新インデックスを同期するのみで、snapshotは持ちません。

master側で5回インデックス生成+commit+optimizeを行った結果が以下の状態です。

├── solr1
│   └── address
│       ├── conf
│       │   ├── lang
│       │   ├── velocity
│       │   └── xslt
│       └── data
│           ├── index
│           ├── snapshot.20130326010002641
│           ├── snapshot.20130326010500216
│           ├── snapshot.20130326011156605
│           ├── snapshot.20130326011441687
│           ├── snapshot.20130326012210916
│           └── tlog
├── solr2
│   └── address
│       ├── conf
│       │   ├── lang
│       │   ├── velocity
│       │   └── xslt
│       └── data
│           ├── index
│           └── tlog
└── tomcat
    └── conf

現在maxNumberOfBackups=5で、再度インデックスを行ってみます。

├── solr1
│   └── address
│       ├── conf
│       │   ├── lang
│       │   ├── velocity
│       │   └── xslt
│       └── data
│           ├── index
│           ├── snapshot.20130326010500216
│           ├── snapshot.20130326011156605
│           ├── snapshot.20130326011441687
│           ├── snapshot.20130326012210916
│           ├── snapshot.20130326235654535 ← 今生成されたsnapshotです
│           └── tlog
├── solr2
│   └── address
│       ├── conf
│       │   ├── lang
│       │   ├── velocity
│       │   └── xslt
│       └── data
│           ├── index
│           └── tlog
└── tomcat
    └── conf

最新のsnapshotが生成され、代わりに一番古いsnapshot.20130326010002641は削除されました。

世代管理が自動で行われる事が確認できましたね。

これでレプリケーションの設定、snapshotの生成、snapshotの自動世代管理は完了です。

前述の設定例では、master毎、slave毎に異なる定義をしなくてはいけません。

その場合、デプロイが少々面倒になったり、記述ミスを誘発したり、変化に弱い状態になります。

javaの-Dオプションで、起動時にmaster/slaveを選択させる事で、solrconfig.xmlの汎用化が可能です。

まずはsolrconfig.xmlの設定です。

  <requestHandler name="/replication" class="solr.ReplicationHandler" > 
    <lst name="master">
      <str name="enable">${solr.repl.master:false}</str>
      <str name="replicateAfter">startup</str>
      <str name="replicateAfter">commit</str>
      <str name="backupAfter">optimize</str>
      <str name="confFiles">schema.xml,stopwords.txt</str>
      <str name="commitReserveDuration">00:00:10</str>
    </lst>
    <lst name="slave">
      <str name="enable">${solr.repl.slave:false}</str>
      <str name="masterUrl">http://localhost:8983/solr/</str>
      <str name="pollInterval">00:00:30</str>
    </lst>
    <int name="maxNumberOfBackups">5</int>
  </requestHandler>

ポイントは「${solr.repl.master:false}」の部分です。初期値は「false」を指定しています。

これは、javaの-Dオプションで「solr.repl.master」を指定した場合のみmasterサーバとして起動します。

「solr.repl.master」未指定時はmasterサーバとして起動しません。

「${solr.repl.slave:false}」も同様に、-Dオプションでslaveとして起動する事ができます。

テスト環境ではjettyで以下のように指定しています。

まずはmasterの起動スクリプトです。

#!/bin/sh
SOLR_HOME=/Applications/eclipse/workspace/solr-server/environment/local/solr1
java -Djetty.port=8983 -Dsolr.solr.home=$SOLR_HOME -Dsolr.repl.master=true -jar start.jar

続いてslaveの起動スクリプトです。

#!/bin/sh
SOLR_HOME=/Applications/eclipse/workspace/solr-server/environment/local/solr2
java -Djetty.port=8984 -Dsolr.solr.home=$SOLR_HOME -Dsolr.repl.slave=true -jar start.jar

これで起動時にmaster/slaveを選択する事ができます。

レプリケーション環境が無い環境ではmaster/slaveのパラメータを与えなければレプリケーションは無効になります。

masterUrlも-Dオプションで指定する形にするといいかもしれませんね。

なお、jettyではなくtomcatの場合はsetenv.sh等で指定する事ができます。

もし/usr/tomcat/bin/setenv.shが無い場合、手動で生成すれば起動時にcatalina.sh経由で読み込まれます。

以下のように設定しておくといいかと思います。

export CATALINA_OPTS="-server -Xmx2048M -Dsolr.repl.master=true"
◯ 広告