设为首页 收藏本站
查看: 1217|回复: 0

[经验分享] solr replication原理探究

[复制链接]

尚未签到

发表于 2018-11-1 13:25:10 | 显示全部楼层 |阅读模式
  无论是垂直搜索,还是通用搜索引擎,对外提供搜索服务其压力都比较大,经常有垂直电商在做活动的时候服务器宕机。对面访问压力比较大的情况,一般的应对方法就是【集群】+【负载均衡】。Solr提供了两种解决方案来对应访问压力。其一是Replication,其一是SolrCloud。
  Replication采用了master/slave  模式,用读写分离的思想来提高对外服务能力。但本质上还是单兵作战。Master/slave模式在数据库领域应用广泛,像MySQL,Redis等主流的数据库都实现这一功能。Replication的另一个功能就是数据备份。
  SolrCloud采用Zookeeper作为配置中心,对索引数据进行分片(shard),实现了真正的分布式搜索。像Hadoop,HBase,Storm等分布式系统都是建立在Zookeeper基础之上的。
  个人认为二者没有谁优谁劣,应用场景不同而已。
  本文主要探究Replication的实现原理。
1. Replication的配置
  Replication在solrconfig.xml中默认是关闭的,要打开很简单。对于Replication,首先需要确定Solr服务的角色。Solr服务的角色有三种[master],[slave],[repeater]。这三种角色的配置如下:
  Master配置:
DSC0000.jpg

  Slave配置:
DSC0001.jpg

  Repeater配置:
DSC0002.jpg

  Repeater就是一个solr服务器既是master,又是slave。为什么需要Repeater角色呢?我们试想,如果一个master服务器同时带上10个slave甚至100个slave,会出现什么情况?Master很容易就被累死了。就算不累死,网络带宽也会很容易被占用干净。假如我们需要4台的集群,但是每个master又只能带2台slave,通过repeater就很容易实现。
DSC0003.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");
  
  }
  定时任务的时间间隔是
DSC0004.jpg

  slave端对master而言是透明的。换句话说,master与slave之间的通信是无状态的http连接。Slave端通过发送不同的command从Server端取得数据,即在数据同步的过程中,slave端是占主导作用的。这也是为什么最好先从slave端入手。
  一次replicate操作关键步骤如下:
DSC0005.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端的运行过程就是执行这三种命令的过程。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629436-1-1.html 上篇帖子: hive2solr时count的一个bug 下篇帖子: 初识solr-Cookie Chen 我爱小贝
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表