您现在的位置是:首页 > 正文

solr replication原理探究

2024-01-30 23:24:17阅读 1

【转载至http://sbp810050504.blog.51cto.com/2799422/1423199】


无论是垂直搜索,还是通用搜索引擎,对外提供搜索服务其压力都比较大,经常有垂直电商在做活动的时候服务器宕机。对面访问压力比较大的情况,一般的应对方法就是【集群】+【负载均衡】。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配置:



Slave配置:



Repeater配置:



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



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( 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" );
   }



   定时任务的时间间隔是



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


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



当然还会有细节的处理,比如系统缓存同步、数据校验,日志记录等等……处理全过程都是以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端的运行过程就是执行这三种命令的过程。






网站文章

  • ORACLE运行的数据库突然连接报“无监听程序”

    ORACLE运行的数据库突然连接报“无监听程序”

    远程:用远程的数据库连接工具用localhost可以连接,用ip地址除127.0.0.1不可连接。 可能是日志文件满了,解决办法如下: 第一步:关闭数据库监听程序【任务管理器--》服务--》右键停止服...

    2024-01-30 23:24:09
  • ARM  CPSR (Current Program Status Register)

    ARM CPSR (Current Program Status Register)

    2024-01-30 23:24:02
  • 远程调用debug

    远程调用debug

    这里写自定义目录标`在这里插入代码 org.springframework.boot spring-boot-maven-plugin -Xdebug -Xrunjdwp:transport=dt_s...

    2024-01-30 23:23:33
  • iOS-最全的App上架教程

    文章出处:http://www.cocoachina.com/appstore/20160708/16990.html

    2024-01-30 23:23:26
  • 三人三鬼过河问题

    三人三鬼过河问题: 三个人和三个鬼在河边,都想要到河的对岸去;河边有一只船,只能搭载两个人、或者两个鬼、或者一人一鬼;如果在岸上或者在船上,鬼的数目多于人的数目,鬼就会把人吃掉。 怎样安排人和鬼的组合上船过河,才能使三个人和三个鬼都安全到河的对岸去呢? 程序思路: 人鬼过河问题实际上可以考虑为状态之间的迁移,或者是构建一个有向图,然后在图中寻找可行的路径。 我们把当前岸边作为左岸,河的对

    2024-01-30 23:23:20
  • RSA公钥/私钥/签名工具包

    package com.example.demo.utils;import org.apache.commons.codec.binary.Base64;import org.springframew...

    2024-01-30 23:22:49
  • 软件项目的开发的时间视乎永远都不够用

    从大学毕业到现在已经5年了,在这5年的时间里一直没有离开过软件行业,也一直在做ERP系统的开发,设计和管理工作。 在此期间经历了3家公司包括现在这家,这3家公司性质各不相同,第一家是日企,第二家是国内私人企业,现在所在的这家是一家新加坡企业。虽然企业的文化及背景差异很大,但是对于我们这些IT从业者来说,感觉在项目工作上的时间总是被压的很紧。...

    2024-01-30 23:22:42
  • 浅谈-计算机加电后的启动过程(一)

    加载BIOS 当PC的电源打开后, 80x86结构的CPU将自动进入实模式.并且CPU的 cs:ip 寄存器被强制初始化为 0xF0000 : 0xFFF0. 先抛出来个问题, 为什么 cs:ip 寄...

    2024-01-30 23:22:35
  • BI低代码数字化应用搭建平台

    BI低代码数字化应用搭建平台

    易搭可以集成企业的各类数据源,高效打通企业分散的数据,结合业务场景,通过可视化的数据建模加工、报表制作与数据分析功能,敏捷开发出各类领导驾驶舱、复杂固定报表,统一用户权限管控,打造企业级的数据分析平台或数据中台,实现业务数据化、管理数字化。

    2024-01-30 23:22:25
  • 电脑怎么连接手机wifi

    1、首先打开手机,点击打开设置中的“其他无线连接”。 2、然后在弹出来的窗口中点击打开个人热点中的“开启个人热点”后面的开关。 3、然后打开电脑,点击打开右下角WiFi图标。 4、然后在弹出来的窗口中点击想要连接到WiFi下方的“连接”即可。

    2024-01-30 23:21:57