在使用solr中,当数据量过大时,可以将数据分片,分片的数据可以放在不同的服务器上,也可以放在一起。
具体操作:
在参数后面加上&shards=http://ip:port/solr/core1,http://ip:port/solr/core2(注意:core1和core2上的数据类型可以不一样,但是查询的字段都要有)
可能会报错:
ERROR (http-nio-8080-exec-10) [ x:core1] o.a.s.h.RequestHandlerBase org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://116.62.237.10:8080/solr/core2/select: non ok status: 403, message:
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:545)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:279)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:268)
at org.apache.solr.client.solrj.SolrClient.request(SolrClient.java:1219)
at org.apache.solr.handler.component.HttpShardHandler.lambda$submit$0(HttpShardHandler.java:163)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at com.codahale.metrics.InstrumentedExecutorService$InstrumentedRunnable.run(InstrumentedExecutorService.java:176)
at org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$execute$0(ExecutorUtil.java:229)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
提示403错误,403是指权限不够,这是由于ip白名单没加,就算是服务器调用自己的server的分片,也需要把自己的ip加到白名单里面。
打开ip白名单设置
vi /usr/local/tomcat/conf/server.xml
找到<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="ip1"
将ip加到allow后面,如:
allow="ip1|ip2"
这样在使用shards就不会报403错误了