chriszg 发表于 2016-12-15 09:09:20

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]
查看完整版本: Solr学习笔记(四)Solr索引复制-示例说明