Solr(Master-Slave) を Vagrant で構築する

Vagrant で Solr を Master-Slave で構築しました. Solr のバージョンは 6.2.0 です.

f:id:mt9116:20190613162005p:plain

構成

Solr の構築はシェルでやることにしました.

D:\vagrant\solrmasterslave
┣Vagrantfile
┗create_solr.sh

Vagrantfile

  • OS は CentOS 7 を使用します.
  • プロビジョナでシェルを実行します.
slave_cnt = 2

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  config.proxy.enabled  = true
  config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.no_proxy = "localhost,127.0.0.1"

  config.vm.define "master" do | master |
    master.vm.hostname = "master"
    master.vm.network "private_network", ip: "192.168.33.40"
    master.vm.provision :hosts, :sync_hosts => true
    master.vm.provision :shell, path: "./create_solr.sh"
  end
  
  (1..slave_cnt).each do |i|
    config.vm.define "slave#{i}" do | slave |
      slave.vm.hostname = "slave#{i}"
      slave.vm.network "private_network", ip: "192.168.33.4#{i}"
      slave.vm.provision :hosts, :sync_hosts => true
      slave.vm.provision :shell, path: "./create_solr.sh"
    end
  end
  
end

create_solr.sh

Standalone のときと同じです. ただ文書の登録は後のお楽しみにとっておきます.

# Java をインストールする
yum install -y java-1.8.0-openjdk

# Solr を構築する
cd /usr/local/src/
yum install -y wget
wget https://archive.apache.org/dist/lucene/solr/6.2.0/solr-6.2.0.tgz
tar xzf solr-6.2.0.tgz
./solr-6.2.0/bin/install_solr_service.sh solr-6.2.0.tgz

# core を作成する
sudo -u solr /opt/solr/bin/solr create -c examplecore
# 文書は登録しない

# Port を開放する
systemctl enable firewalld.service
systemctl start firewalld.service
firewall-cmd --zone=public --add-port=8983/tcp --permanent
firewall-cmd --reload

Solr を構築する

> pwd
D:\vagrant\solrmasterslave
> vagrant up

Master を設定する

  • Solr を停止します.
  • core にある solrconfig.xml に Master の設定を追加します.
  • Solr を起動します.
> vagrant ssh master
$ su root
$ service stop solr
$ vi /var/solr/masterslave/master/data/examplecore/conf/solrconfig.xml
$ service start solr
  <requestHandler name="/replication" class="solr.ReplicationHandler" >
    <lst name="master">
      <str name="replicateAfter">commit</str>
      <str name="replicateAfter">optimize</str>
      <str name="replicateAfter">startup</str>
      <str name="confFiles">schema.xml,stopwords.txt</str>
    </lst>
  </requestHandler>

Slave を設定する

  • Solr を停止します.
  • core にある solrconfig.xml に Slave の設定を追加します.
  • Solr を起動します.
> vagrant ssh slave1
$ su root
$ service stop solr
$ vi /var/solr/masterslave/master/data/examplecore/conf/solrconfig.xml
$ service start solr

> vagrant ssh slave2
$ su root
$ service stop solr
$ vi /var/solr/masterslave/master/data/examplecore/conf/solrconfig.xml
$ service start solr
  <requestHandler name="/replication" class="solr.ReplicationHandler" >
    <lst name="slave">
      <str name="masterUrl">http://master:8983/solr/examplecore</str>
      <str name="pollInterval">00:00:30</str>
    </lst>
  </requestHandler>

Replication 確認

Master に文書を登録して Slave に反映されるか確認します. まず,core を作成しただけなので検索結果が空であることを確認します.

> curl -X GET "http://192.168.33.40:8983/solr/examplecore/select?q=*:*&fl=id&wt=json&indent=on" --noproxy 192.168.33.40
{
  "responseHeader":{
    "status":0,
    "QTime":23,
    "params":{
      "q":"*:*",
      "indent":"on",
      "fl":"id",
      "wt":"json"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}
> curl -X GET "http://192.168.33.41:8983/solr/examplecore/select?q=*:*&fl=id&wt=json&indent=on" --noproxy 192.168.33.41
{
  "responseHeader":{
    "status":0,
    "QTime":23,
    "params":{
      "q":"*:*",
      "indent":"on",
      "fl":"id",
      "wt":"json"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}
> curl -X GET "http://192.168.33.42:8983/solr/examplecore/select?q=*:*&fl=id&wt=json&indent=on" --noproxy 192.168.33.42
{
  "responseHeader":{
    "status":0,
    "QTime":23,
    "params":{
      "q":"*:*",
      "indent":"on",
      "fl":"id",
      "wt":"json"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}

Master に文書を登録します.

> vagrant ssh master -c "sudo -u solr /opt/solr/bin/post -c examplecore -p 8983 /opt/solr/example/exampledocs/*.xml"

再度検索してみます.

> curl -X GET "http://192.168.33.40:8983/solr/examplecore/select?q=*:*&fl=id&wt=json&indent=on" --noproxy 192.168.33.40
{
  "responseHeader":{
    "status":0,
    "QTime":6,
    "params":{
      "q":"*:*",
      "indent":"on",
      "fl":"id",
      "wt":"json"}},
  "response":{"numFound":32,"start":0,"docs":[
      {
        "id":"GB18030TEST"},
      {
        "id":"SP2514N"},
      {
        "id":"6H500F0"},
      {
        "id":"F8V7067-APL-KIT"},
      {
        "id":"IW-02"},
      {
        "id":"MA147LL/A"},
      {
        "id":"adata"},
      {
        "id":"apple"},
      {
        "id":"asus"},
      {
        "id":"ati"}]
  }}
> curl -X GET "http://192.168.33.41:8983/solr/examplecore/select?q=*:*&fl=id&wt=json&indent=on" --noproxy 192.168.33.41
{
  "responseHeader":{
    "status":0,
    "QTime":11,
    "params":{
      "q":"*:*",
      "indent":"on",
      "fl":"id",
      "wt":"json"}},
  "response":{"numFound":32,"start":0,"docs":[
      {
        "id":"GB18030TEST"},
      {
        "id":"SP2514N"},
      {
        "id":"6H500F0"},
      {
        "id":"F8V7067-APL-KIT"},
      {
        "id":"IW-02"},
      {
        "id":"MA147LL/A"},
      {
        "id":"adata"},
      {
        "id":"apple"},
      {
        "id":"asus"},
      {
        "id":"ati"}]
  }}
> curl -X GET "http://192.168.33.42:8983/solr/examplecore/select?q=*:*&fl=id&wt=json&indent=on" --noproxy 192.168.33.42
{
  "responseHeader":{
    "status":0,
    "QTime":27,
    "params":{
      "q":"*:*",
      "indent":"on",
      "fl":"id",
      "wt":"json"}},
  "response":{"numFound":32,"start":0,"docs":[
      {
        "id":"GB18030TEST"},
      {
        "id":"SP2514N"},
      {
        "id":"6H500F0"},
      {
        "id":"F8V7067-APL-KIT"},
      {
        "id":"IW-02"},
      {
        "id":"MA147LL/A"},
      {
        "id":"adata"},
      {
        "id":"apple"},
      {
        "id":"asus"},
      {
        "id":"ati"}]
  }}

Replication が実行されて Master のインデックスが Slave にも反映されました.

あとがき

一気に Master-Slave 構成を構築する際の Vagrantfile,シェル,構成です. 共有ディレクトリを用意して,設定済みの solrconfig.xml を配布します(solrconfig.xml には Master,Slave の設定を追記しています).

slave_cnt = 2

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.synced_folder "./shared", "/home/vagrant/shared", owner: "vagrant", group: "vagrant"

  config.proxy.enabled  = true
  config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.no_proxy = "localhost,127.0.0.1"

  config.vm.define "master" do | master |
    master.vm.hostname = "master"
    master.vm.network "private_network", ip: "192.168.33.40"
    master.vm.provision :hosts, :sync_hosts => true
    master.vm.provision :shell, path: "./create_solr.sh"
    master.vm.provision :shell, path: "./setup_master.sh"
  end
  
  (1..slave_cnt).each do |i|
    config.vm.define "slave#{i}" do | slave |
      slave.vm.hostname = "slave#{i}"
      slave.vm.network "private_network", ip: "192.168.33.4#{i}"
      slave.vm.provision :hosts, :sync_hosts => true
      slave.vm.provision :shell, path: "./create_solr.sh"
      slave.vm.provision :shell, path: "./setup_slave.sh"
    end
  end
  
end
service solr stop
\cp -f /home/vagrant/shared/master/solrconfig.xml /var/solr/data/examplecore/conf/solrconfig.xml
service solr start
service solr stop
\cp -f /home/vagrant/shared/slave/solrconfig.xml /var/solr/data/examplecore/conf/solrconfig.xml
service solr start
D:\vagrant\solrmasterslave
┣Vagrantfile
┣shared
┃┣master
┃┃┗solrconfig.xml
┃┗slvae
┃  ┗solrconfig.xml
┣create_solr.sh
┣setup_master.sh
┗setup_slave.sh