distributed
分散インデックスについてのメモ
example
今回は5このノードで分散して検索を行ってみる.
mkdir example/nodes
# 5件のノードを作成
for i in $(seq 1 5); do mkdir "example/nodes/node$i" && cp server/solr/solr.xml "example/nodes/node$i/." ; done
for i in $(seq 1 5); do mkdir "example/nodes/node$i" ; done
bin/solr start -s example/nodes/node1 -p 8983
bin/solr start -s example/nodes/node2 -p 8984
bin/solr start -s example/nodes/node3 -p 8985
bin/solr start -s example/nodes/node4 -p 8986
bin/solr start -s example/nodes/node5 -p 8987
bin/solr restart -s example/nodes/node1 -p 8983 -m 24g
bin/solr restart -s example/nodes/node2 -p 8984 -m 24g
bin/solr restart -s example/nodes/node3 -p 8985 -m 24g
bin/solr restart -s example/nodes/node4 -p 8986 -m 24g
bin/solr restart -s example/nodes/node5 -p 8987 -m 24g
bin/solr create_core -c core1 -p 8983
bin/solr create_core -c core1 -p 8984
bin/solr create_core -c core1 -p 8985
bin/solr create_core -c core1 -p 8986
bin/solr create_core -c core1 -p 8987
find /Volumes/mituba_server/birthmark_server_encoded/data/birth_xml -name "birth_uc*.xml" | head -n 40 | xargs -I% bin/post -c core1 % -port 8983
find /Volumes/mituba_server/birthmark_server_encoded/data/birth_xml -name "birth_uc*.xml" | head -n 80 | tail -n 40 | xargs -I% bin/post -c core1 % -port 8984
find /Volumes/mituba_server/birthmark_server_encoded/data/birth_xml -name "birth_uc*.xml" | head -n 120 | tail -n 40 | xargs -I% bin/post -c core1 % -port 8985
find /Volumes/mituba_server/birthmark_server_encoded/data/birth_xml -name "birth_uc*.xml" | head -n 160 | tail -n 40 | xargs -I% bin/post -c core1 % -port 8986
find /Volumes/mituba_server/birthmark_server_encoded/data/birth_xml -name "birth_uc*.xml" | tail -n 40 | xargs -I% bin/post -c core1 % -port 8987
curl "http://localhost:8983/solr/core1/select?q=*:*&indent=true&shards=localhost:8983/solr/core1,localhost:8984/solr/core1,localhost:8985/solr/core1,localhost:8986/solr/core1,localhost:8987/solr/core1&fl=id,name"
# クエリ
curl "http://localhost:8983/solr/core1/select?q=*:*&indent=true&shards=localhost:8983/solr/core1,localhost:8984/solr/core1,localhost:8985/solr/core1,localhost:8986/solr/core1,localhost:8987/solr/core1&rows=398201&fl=filename&wt=json" > tmp.json
# solrconfig いじり
find . -type f -name "solrconfig.xml" | xargs -J% sed -i -e 's/<str name="content-type">text\/plain; charset=UTF-8<\/str>/<str name="content-type">application\/json; charset=UTF-8<\/str>/g' %
type="string" multiValued="false" indexed="true" required="true" stored="true"
クエリを投げたらエラーが出る. どうやらmime typeが違うらしい
"msg":"Error from server at http://localhost:8987/solr/core1: Expected mime type application/octet-stream but got application/xml. <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<response>\n<lst name=\"error\"><lst name=\"metadata\"><str name=\"error-class\">org.apache.solr.common.SolrException</str><str name=\"root-error-class\">org.apache.solr.common.SolrException</str></lst><str name=\"msg\">application/x-www-form-urlencoded content length (3121735 bytes) exceeds upload limit of 2048 KB</str><int name=\"code\">400</int></lst>\n</response>\n",
対処
managed-schemaをいじっていく
# 失敗
find "$i" -name "managed-schema" | xargs -J% sed -i -e 's/multiValued="true"/multiValued="false"/g' %
find . -name "managed-schema" | xargs -J% sed -i -e 's/type=\"strings\"/type=\"string\" multiValued=\"false\" indexed=\"true\" required=\"true\" stored=\"true\"/g' %
find . -name "managed-schema" | xargs -J% sed -i -e 's/<dynamicField name="*_ss" type="string" multiValued="false" required="true" stored="true" indexed="true"\/>/<dynamicField name="*_ss" type="strings" indexed="true" stored="true"\/>/g' %
<dynamicField name="*_ss" type="strings" indexed="true" stored="true"/>
# データが変だったのでちょっと変えた
find . -name "birth_uc*" | xargs -J% sed -i -e 's/&quot;//g' %
stop
bin/solr stop -s example/nodes/node1 -p 8983
bin/solr stop -s example/nodes/node2 -p 8984
bin/solr stop -s example/nodes/node3 -p 8985
bin/solr stop -s example/nodes/node4 -p 8986
bin/solr stop -s example/nodes/node5 -p 8987
わかったこと
件数が多すぎるとタイムアウトしているのかわからないがエラーを吐く 逆に件数が少ないとエラーは吐かない タイムアウト設定いじってみる CursorMarkを使おう
# クエリ
curl "http://localhost:8983/solr/core1/select?q=*:*&indent=true&shards=localhost:8983/solr/core1,localhost:8984/solr/core1,localhost:8985/solr/core1,localhost:8986/solr/core1,localhost:8987/solr/core1&rows=100000&fl=filename,data,score&wt=json&sort=id%20desc&cursorMark=*" > tmp.json
送信データ量の限界に達していたらしい 変更する CursorMark使うと遅すぎる
# 変更
find . -type f -name "solrconfig.xml" | xargs -J% sed -i -e 's/multipartUploadLimitInKB="2048000"/multipartUploadLimitInKB="204800000"/g' %
find . -type f -name "solrconfig.xml" | xargs -J% sed -i -e 's/formdataUploadLimitInKB="2048"/formdataUploadLimitInKB="20480000"/g' %
変更したけど特に改善されなかった・・・
100万件検索した結果 -> 4:16 遅い
10万件 -> 1:21
無理