工作中用到solr做搜索,由于没有Lucene基础,有些理论性的知识完全不能理解,不过大概还是把搜索的任务做好了,没有用到分词等功能。在使用LBHttpSolrServer的时候遇到了一个问题,就是写入的数据比预期的少一半,Solr的Wiki上这样解释LBHttpSolrServer的用法:
What is LBHttpSolrServer?
LBHttpSolrServer or "Load Balanced HttpSolrServer" is just a wrapper to CommonsHttpSolrServer. This is useful when you have multiple SolrServers and query requests need to be Load Balanced among them. It offers automatic failover when a server goes down and it detects when the server comes back up.
This should NOT be used for indexing in traditional master/slave architectures since updates have to be routed to the correct master. In SolrCloud architectures, use CloudSolrServer which will take advantage of this class automatically.
其实已经有点明白了,上面说在更新索引的时候不要使用LBHttpSolrServer了,而恰好我在更新的时候用了这个API,通过阅读源码,弄明白了LBHttpSolrServer的原理,与我预期想的不一致造成了问题的产生。我以为LBHttpSolrServer首先拿第一个可获得的节点去操作,如果当前节点挂了自动去获取下一个节点,其实LBHttpSolrServer是轮流的拿节点来操作。
public class LBHttpSolrServer extends SolrServer { private final CopyOnWriteArrayList<ServerWrapper> aliveServers = new CopyOnWriteArrayList<ServerWrapper>(); private final CopyOnWriteArrayList<ServerWrapper> zombieServers = new CopyOnWriteArrayList<ServerWrapper>(); private ScheduledExecutorService aliveCheckExecutor; private HttpClient httpClient; private final AtomicInteger counter = new AtomicInteger(-1); private ReentrantLock checkLock = new ReentrantLock(); private static final SolrQuery solrQuery = new SolrQuery("*:*"); .....
上面摘选了LBHttpSolrServer的相关属性部门,其中值得注意的是 counter 这个属性,LBHttpSolrServer通过这个属性来记录使用LBHttpSolrServer中的哪个地址来做相关操作。通过 counter 与 存活的 server 总数取余,代码如下:
public NamedList<Object> request(final SolrRequest request) throws SolrServerException, IOException { int count = counter.incrementAndGet(); int attempts = 0; Exception ex; int startSize = aliveServers.size(); while (true) { int size = aliveServers.size(); if (size < 1) throw new SolrServerException("No live SolrServers available to handle this request"); ServerWrapper solrServer; try { solrServer = aliveServers.get(count % size); //这里是关键 } catch (IndexOutOfBoundsException e) { //this list changes dynamically. so it is expected to get IndexOutOfBoundsException continue; } try { return solrServer.solrServer.request(request); } catch (SolrException e) { // Server is alive but the request was malformed or invalid throw e; } catch (SolrServerException e) { if (e.getRootCause() instanceof IOException) { ex = e; moveAliveToDead(solrServer); } else { throw e; } } catch (Exception e) { throw new SolrServerException(e); } attempts++; if (attempts >= startSize) throw new SolrServerException("No live SolrServers available to handle this request", ex); } }
其实代码中都已经详细说明了LBHttpSolrServer的相关特性,希望在用LBHttpSolrServer操作solr的时候注意好本身项目的特性,采用合适的做法。我的项目做法,不适合使用LBHttpSolrServer,原因如下:
我的项目没有采用SolrCloud做备份等操作,而是自己定义一个节点做所谓的master,这个负责读写索引,而在其他机器上装一个类似的环境slave,这个负责做备份,而master完全不知道有哪些节点在做它的备份,只需要在slave上执行如下命令即可同步slave与master一致:
http://slave:8984/solr/core1/replication?command=fetchindex&masterUrl=http://master:7674/solr/core1/replication
至于为什么采用这种方式备份,是因为SolrCloud不适合我的应用,我的应用会频繁的做大量数据的写入索引,每一次在提交时都会触发备份,导致服务器负载非常高,这里采用这种办法缓解服务器压力,只需要在slave机器上通过curl或者其他命令执行以上命令就可以完成备份操作。
相关推荐
- **步骤说明**: 在项目的构建文件中添加SolrJ的依赖项。 - **操作详情**: 对于Maven项目,在`pom.xml`文件中添加如下依赖: ```xml <groupId>org.apache.solr <artifactId>solr-solrj <version>1.4.1 `...
- **4.2 Solrj的使用说明**:通过示例代码展示如何使用Solrj。 - **4.2.1 AddingData to Solr**:如何使用Solrj添加数据到索引。 - **4.2.2 Directly adding POJOs to Solr**:如何直接将Java对象转换为Solr文档。 -...
里面有非常详细的说明交你怎么使用solrj客户端来操作solrAPI
在使用SolrJ时,首先需要在项目中引入SolrJ的依赖。通常,这可以通过Maven或Gradle等构建工具完成。添加对应的依赖项后,便可以开始创建Solr服务器实例,并连接到运行的Solr实例。例如: ```java import org.apache...
SolrJ是Apache Solr官方提供的Java客户端库,它使得在Java应用程序中与Solr进行交互变得简单。这个“solrj使用教程”很可能是为了帮助开发者了解如何使用SolrJ来连接、查询和管理Solr索引。下面将详细介绍SolrJ的...
solr详细配置教程与solrj的使用
在本文中,我们将深入探讨Solr-Solrj的使用、功能及其与自建Solr服务的集成,特别是涉及到中文分词的场景。 Apache Solr是一款流行的开源全文搜索引擎,提供高效的全文检索、文档分类、拼写建议等功能。Solr-Solrj...
SolrJ是Apache Solr官方提供的Java客户端库,它使得在Java应用程序中与Solr搜索引擎进行交互变得简单...在实际项目中,开发者应当根据具体需求将这些库添加到项目的类路径中,以便顺利地使用SolrJ进行Solr的相关操作。
"solr-solrj-6.1.0.jar"文件是Solrj的二进制库,包含了所有必要的类和方法,用于在Java项目中导入并使用Solrj。而"solr-solrj-6.1.0.txt"可能是相关的文档或日志文件,提供了关于该版本的更多信息,如使用指南、API...
SolrJ的使用是大数据环境中实现高效全文检索和数据分析的关键组件。在Java项目中,正确集成SolrJ所需的jar包对于建立与Solr服务器的连接至关重要。 首先,我们需要理解SolrJ的核心功能。SolrJ提供了一系列API,用于...
相反,如果项目需要利用Solr 5.x的新功能,或者已经升级到Solr 5.x,那么应使用5.0.0版本的SolrJ。 在实际开发中,SolrJ通过提供简单的Java接口,使得开发者可以方便地执行以下操作: 1. 创建和管理Solr核心...
在使用 SolrJ 时,开发人员需要将这些库添加到项目的类路径中,以便能够调用 SolrJ 提供的各种类和方法。例如,可以通过 `SolrClient` 接口连接到 Solr 服务器,使用 `SolrInputDocument` 类来构建要索引的文档,...
solrj工具类封装,包括条件批量查询,批量增删改,分段修改。
简单的SolrJ使用示例,包括文件:News.java(PO对应的class),SolrService.java(对solrJ的包装),SolrServiceHook.java(在查询前修改SolrQuery的行为)
### SolrJ 使用详解 #### 一、环境搭建与初始化 在正式介绍如何使用SolrJ之前,我们首先需要确保已经正确地搭建好开发环境。根据提供的内容,环境搭建主要包含以下几个步骤: 1. **创建Java工程**:首先,我们...
solr-solrj-4.9.0.jar