Solr学习笔记(四)Solr索引复制-示例说明
准备:为什么要进行索引复制呢?当有很多个客户并发访问某Solr服务器,这可能会导致Solr服务器崩溃(Solr服务器性能达不到这些客户并发访问的需求),这时就可以考虑通过索引复制,将索引复制到多个服务器上,这就是Solr的索引复制,如下图所示:
如图:Master Solr 为性能达不到很多客户并发访问的服务器,是需要被索引复制的服务器,Slave instances 为复制了Master Solr上索引的服务器,这样客户端可以访问Master Solr 和 Slave instances中的任意一个,以便降低了服务器性能的要求;
开始:
同时开启三台Tomcat服务器,端口号分别为:8080,8888,8983,8080代表Master Solr,8888和8983代表Slave instances ;
用前面学习笔记(三)中SolrjClient提供的借口向Master Solr(8080)添加数据,然后在Slave instances上测试;
说明:
要进行索引复制测试需要做一下配置:
Master Solr(8080),在solrconfig.xml中添加如下配置:
<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 instances(8888,8983)solrconfig.xml中添加如下配置:
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<str name="masterUrl">http://localhost:8080/solr/replication</str>
<str name="pollInterval">00:00:60</str>
</lst>
</requestHandler>
配置完后启动三台服务器;
可在控制台点击Replication查看复制页面后台控制页面,如下截图:
Master Solr(8080):
Slave instances(8888,8983):
如上图,可以通过上面所示Button控制索引的复制,如点击Replicate Now马上开始把Master上的索引复制到自己上,如果Disable Poll 值为disable时开启了自动复制功能,即当你Master上添加索引后马上复制到Slave上,可以单击该Button设他的值为enable;
向Master Solr(8080)上添加数据(SolrJClient):代码如下
List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
for (int i = 0; i < 10; i++) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", i);
doc.addField("severity",i);
doc.addField("sLocation","Beijing_" + i);
doc.addField("msg", "kobe bryant" + i);
doc.addField("name", "kylin soong" + i);
docs.add(doc);
}
client.addDocs(docs);
然后在他的Slave instances(8888,8983)任意一个上查询,你都会查询到上面添加到Master Solr上的数据,以8888为例,查询代码如下:
String url = "http://localhost:8888/solr";
SolrjClient client = new SolrjClient();
client.startSolrServer(url);
List<SolrDocument> lists = client.query("kobe");
System.out.println(lists.size());
for(SolrDocument doc : lists) {
for(Iterator iterator = doc.iterator();iterator.hasNext();) {
Map.Entry<String, Object> entry = (Entry<String, Object>) iterator.next();
System.out.print(entry.getKey() + "=" + entry.getValue() + " ");
//System.out.print(iterator.next() + " ");
}
System.out.println();
}
结果:
10
id=0 severity=0 sLocation=Beijing_0 msg=kobe bryant0 name=kylin soong0
id=1 severity=1 sLocation=Beijing_1 msg=kobe bryant1 name=kylin soong1
id=2 severity=2 sLocation=Beijing_2 msg=kobe bryant2 name=kylin soong2
id=3 severity=3 sLocation=Beijing_3 msg=kobe bryant3 name=kylin soong3
id=4 severity=4 sLocation=Beijing_4 msg=kobe bryant4 name=kylin soong4
id=5 severity=5 sLocation=Beijing_5 msg=kobe bryant5 name=kylin soong5
id=6 severity=6 sLocation=Beijing_6 msg=kobe bryant6 name=kylin soong6
id=7 severity=7 sLocation=Beijing_7 msg=kobe bryant7 name=kylin soong7
id=8 severity=8 sLocation=Beijing_8 msg=kobe bryant8 name=kylin soong8
id=9 severity=9 sLocation=Beijing_9 msg=kobe bryant9 name=kylin soong9
结束!
页:
[1]