`
ahern88
  • 浏览: 4004 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

solrj中LBHttpSolrServer的使用说明

    博客分类:
  • solr
阅读更多

工作中用到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或者其他命令执行以上命令就可以完成备份操作。

 

 

分享到:
评论

相关推荐

    solr配置和solrJ的使用

    - **步骤说明**: 在项目的构建文件中添加SolrJ的依赖项。 - **操作详情**: 对于Maven项目,在`pom.xml`文件中添加如下依赖: ```xml &lt;groupId&gt;org.apache.solr &lt;artifactId&gt;solr-solrj &lt;version&gt;1.4.1 `...

    Solrj 中文教程

    - **4.2 Solrj的使用说明**:通过示例代码展示如何使用Solrj。 - **4.2.1 AddingData to Solr**:如何使用Solrj添加数据到索引。 - **4.2.2 Directly adding POJOs to Solr**:如何直接将Java对象转换为Solr文档。 -...

    非常全面的solrj使用案例

    里面有非常详细的说明交你怎么使用solrj客户端来操作solrAPI

    solrj的使用

    在使用SolrJ时,首先需要在项目中引入SolrJ的依赖。通常,这可以通过Maven或Gradle等构建工具完成。添加对应的依赖项后,便可以开始创建Solr服务器实例,并连接到运行的Solr实例。例如: ```java import org.apache...

    solrj使用教程

    SolrJ是Apache Solr官方提供的Java客户端库,它使得在Java应用程序中与Solr进行交互变得简单。这个“solrj使用教程”很可能是为了帮助开发者了解如何使用SolrJ来连接、查询和管理Solr索引。下面将详细介绍SolrJ的...

    solr详细配置教程与solrj的使用

    solr详细配置教程与solrj的使用

    solr-solrj 5.0.0 demo

    在本文中,我们将深入探讨Solr-Solrj的使用、功能及其与自建Solr服务的集成,特别是涉及到中文分词的场景。 Apache Solr是一款流行的开源全文搜索引擎,提供高效的全文检索、文档分类、拼写建议等功能。Solr-Solrj...

    solrJ 需要的jar文件 (全)

    SolrJ是Apache Solr官方提供的Java客户端库,它使得在Java应用程序中与Solr搜索引擎进行交互变得简单...在实际项目中,开发者应当根据具体需求将这些库添加到项目的类路径中,以便顺利地使用SolrJ进行Solr的相关操作。

    solr-solrj-6.1.0

    "solr-solrj-6.1.0.jar"文件是Solrj的二进制库,包含了所有必要的类和方法,用于在Java项目中导入并使用Solrj。而"solr-solrj-6.1.0.txt"可能是相关的文档或日志文件,提供了关于该版本的更多信息,如使用指南、API...

    SolrJ需要的jar包

    SolrJ的使用是大数据环境中实现高效全文检索和数据分析的关键组件。在Java项目中,正确集成SolrJ所需的jar包对于建立与Solr服务器的连接至关重要。 首先,我们需要理解SolrJ的核心功能。SolrJ提供了一系列API,用于...

    solr-solrj-4.10.3.jar和solr-solrj-5.0.0.jar

    相反,如果项目需要利用Solr 5.x的新功能,或者已经升级到Solr 5.x,那么应使用5.0.0版本的SolrJ。 在实际开发中,SolrJ通过提供简单的Java接口,使得开发者可以方便地执行以下操作: 1. 创建和管理Solr核心...

    SolrJ6.3.0

    在使用 SolrJ 时,开发人员需要将这些库添加到项目的类路径中,以便能够调用 SolrJ 提供的各种类和方法。例如,可以通过 `SolrClient` 接口连接到 Solr 服务器,使用 `SolrInputDocument` 类来构建要索引的文档,...

    solrj工具类封装

    solrj工具类封装,包括条件批量查询,批量增删改,分段修改。

    SolrJ使用示例

    简单的SolrJ使用示例,包括文件:News.java(PO对应的class),SolrService.java(对solrJ的包装),SolrServiceHook.java(在查询前修改SolrQuery的行为)

    1.4、solrj的使用_代码开始1

    ### SolrJ 使用详解 #### 一、环境搭建与初始化 在正式介绍如何使用SolrJ之前,我们首先需要确保已经正确地搭建好开发环境。根据提供的内容,环境搭建主要包含以下几个步骤: 1. **创建Java工程**:首先,我们...

    solr-solrj-4.9.0.jar

    solr-solrj-4.9.0.jar

Global site tag (gtag.js) - Google Analytics