solr replication原理探究

http://m.blog.csdn.net/blog/qing419925094/34444897

Replication的实现原理。


1. Replication的配置


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


Master配置:


wKioL1ORrUSjuF5WAAHACrfhpPg906.jpg

Slave配置:


wKiom1ORrYjBm0H2AAHm6b1jVEM579.jpg 

Repeater配置:


wKioL1ORrWvCaLsxAAHS6MjYxf0489.jpg 

 

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


 

wKioL1ORrXuz9HybAADx_Qm5pYw487.jpg

2. replication的工作原理


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


2.1 slave端的运行过程


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


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(null, false);

        } 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而言是透明的。换句话说,master与slave之间的通信是无状态的http连接。Slave端通过发送不同的command从Server端取得数据,即在数据同步的过程中,slave端是占主导作用的。这也是为什么最好先从slave端入手。


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


wKioL1ORrcvBE2_gAAHtodF_OIs371.jpg

 

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

 

 

2.2 master端的运行过程


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


1.CMD_INDEX_VERSION 命令


通过该命令可以得到索引的latestVersion和latestGeneration。其中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端的运行过程就是执行这三种命令的过程。


转载于:https://my.oschina.net/u/1045177/blog/468139

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值