Solr(Master-Slave) を Vagrant で構築する
Vagrant で Solr を Master-Slave で構築しました. Solr のバージョンは 6.2.0 です.
構成
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