zoukankan      html  css  js  c++  java
  • solr replication原理探究

    无论是垂直搜索,还是通用搜索引擎,对外提供搜索服务其压力都比较大,经常有垂直电商在做活动的时候服务器宕机。对面访问压力比较大的情况,一般的应对方法就是【集群】+【负载均衡】。Solr提供了两种解决方案来对应访问压力。其一是Replication,其一是SolrCloud

     

    Replication采用了master/slave  模式,用读写分离的思想来提高对外服务能力。但本质上还是单兵作战。Master/slave模式在数据库领域应用广泛,像MySQLRedis等主流的数据库都实现这一功能。Replication的另一个功能就是数据备份。


    SolrCloud采用Zookeeper作为配置中心,对索引数据进行分片(shard),实现了真正的分布式搜索。像Hadoop,HBase,Storm等分布式系统都是建立在Zookeeper基础之上的。


     

     

    个人认为二者没有谁优谁劣,应用场景不同而已。


     

     

    本文主要探究Replication的实现原理。


    1. Replication的配置


    Replicationsolrconfig.xml中默认是关闭的,要打开很简单。对于Replication,首先需要确定Solr服务的角色。Solr服务的角色有三种[master],[slave],[repeater]。这三种角色的配置如下:


    Master配置:


     

    wKioL1ORrUSjuF5WAAHACrfhpPg906.jpg

    Slave配置:


     

    wKiom1ORrYjBm0H2AAHm6b1jVEM579.jpg 

    Repeater配置:


     

    wKioL1ORrWvCaLsxAAHS6MjYxf0489.jpg 

     

     

    Repeater就是一个solr服务器既是master,又是slave。为什么需要Repeater角色呢?我们试想,如果一个master服务器同时带上10slave甚至100slave,会出现什么情况?Master很容易就被累死了。就算不累死,网络带宽也会很容易被占用干净。假如我们需要4台的集群,但是每个master又只能带2slave,通过repeater就很容易实现。


     

     

    wKioL1ORrXuz9HybAADx_Qm5pYw487.jpg

    2. replication的工作原理


    通过配置我们知道replication的功能是通过ReplicationHandler来实现的。通过以ReplicationHandler为切入口,应该能很容易地追溯到replication的运行过程。


    2.1 slave端的运行过程


    Solr在启动的过程中会通过ReplicationHandler.inform()方法,按照slave的配置启动一个定时任务,定时向master端发起同步请求。任务的代码如下:


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    private void startExecutorService() {
        Runnable task = new Runnable() {
          @Override
          public void run() {
            if (pollDisabled.get()) {
              LOG.info("Poll disabled");
              return;
            }
            try {
              executorStartTime = System.currentTimeMillis();
              replicationHandler.doFetch(nullfalse);
            catch (Exception e) {
              LOG.error("Exception in fetching index", e);
            }
          }
        };
        executorService = Executors.newSingleThreadScheduledExecutor(
            new DefaultSolrThreadFactory("snapPuller"));
        long initialDelay = pollInterval - (System.currentTimeMillis() % pollInterval);
        executorService.scheduleAtFixedRate(task, initialDelay, pollInterval, TimeUnit.MILLISECONDS);
        LOG.info("Poll Scheduled at an interval of " + pollInterval + "ms");
      }

     



       定时任务的时间间隔是


    wKiom1ORrePTa48kAABxYCuklTw119.jpg

     

    slave端对master而言是透明的。换句话说,masterslave之间的通信是无状态的http连接。Slave端通过发送不同的commandServer端取得数据,即在数据同步的过程中,slave端是占主导作用的。这也是为什么最好先从slave端入手。


    一次replicate操作关键步骤如下:


    wKioL1ORrcvBE2_gAAHtodF_OIs371.jpg

     

     

    当然还会有细节的处理,比如系统缓存同步、数据校验,日志记录等等……处理全过程都是以SnapPuller.fetchLatestIndex()方法为主线进行的,如果跟踪源码,则重点关注该方法。

     

     

     

     

    2.2 master端的运行过程


    由于master端是被动的(master接收slave端传递过来的命令,然后依照命令执行),所以master端的工作过程相对比较简单。值得注意的是,通过master端可以更好的理解solr索引更新的过程。


    1.CMD_INDEX_VERSION 命令


    通过该命令可以得到索引的latestVersionlatestGeneration。其中lastestVersion其实就是索引的更新时间点,而latestGeneration就是存储在SegmentInfos中的generation信息。通过这两个信息的对比,就可以判断出slave端的索引是否需要更新。


    2. CMD_GET_FILE_LIST命令


    通过该命令可以得到需要同步的索引文件信息。


    3. CMD_GET_FILE 命令


    通过该命令可以下载文件。该命令执行次数由文件大小和CMD_GET_FILE_LIST得到的文件数量决定。下载文件每次最多下载1M,如果文件大于1M,则分多次下载。数据正确性的校验由Adler32 算法来完成。关于Adler32算法,这里不细说。关于详细代码,可以参看DirectoryFileStream.write()方法。


    综上,一次replication操作在master端的运行过程就是执行这三种命令的过程。

  • 相关阅读:
    c# 发送邮件
    C# Android 开发中使用 Sqlite.NET ORM
    VS2015 使用 Visual Studio Emulator For Android 调试无法命中断点的解决办法?
    asp.net 下载文件
    ScriptManager 发送错误到客户端
    C# 比较两个路径是否指向同一对象
    IIS 集成模式 导致 AjaxPro 无法正常运行
    C#编码、解码与ASP.NET编码解码对应函数
    FTP 命令连接(带用户名和密码)方法
    医学-药物-大环内酯类-阿奇霉素(Azithromycin)
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/12573314.html
Copyright © 2011-2022 走看看