`

solr主从复制的原理

    博客分类:
  • solr
 
阅读更多
master的工作
对于ReplicationHandler的复制功能来说,核心的问题确定是在一个时间点要复制哪些文件,这就用上了lucene的IndexDeletionPolicy的特性。
lucene在初始化时,会调用IndexDeletionPolicy.onInit(List commits)方法;
lucene在commit(触发的时机也可以是optimize、close,solr在commit时实际上就是close了indexwriter)时,会调用IndexDeletionPolicy.onInit(List commits)。

IndexCommit对象中保存了该次提交关联的文件列表等信息,这使得solr中的复制过程中,slave可以从master得到文件列表后跟本地文件做比较,跳过不变的文件,下载新文件,并删除无用的文件。
IndexDeletionPolicy的两个针对commits的函数,会对当前存在的commits列表做些处理,比如lucene默认的KeepOnlyLastCommitDeletionPolicy会只保留最新的IndexCommit,对那些过时的IndexCommit执行delete操作以将无用的文件删掉。
solr中,SolrDeletionPolicy默认也是保留最新一个IndexCommit,但可以设置maxCommitAge、maxCommitsToKeep、maxOptimizedCommitsToKeep来保留更多的IndexCommit。但solr真正使用的IndexDeletionPolicy实现是IndexDeletionPolicyWrapper,它是SolrDeletionPolicy的wrap。
在slave从master复制文件的过程中,要保证当前正在复制的IndexCommit点不能被删除,这就用到了IndexDeletionPolicyWrapper中的void setReserveDuration(Long indexVersion, long reserveTime)方法,该方法会在master向slave响应indexversion、filelist命令前、以及每向slave传送5M的索引文件内容时调用,而默认的reserveTime时间是10s,如果慢速网络传输5M数据需要10秒以上,就需要调整该值了。
ReplicationHandler复制文件没有采用rsync,而是使用http,它在读一个文件内容传输到slave时,默认是按照1M大小分段输出内容到slave(http chunked?),并且默认是对每段内容做了checksum,保证传输的内容的正确性。上面提到的setReserveDuration点,主要就是它在packetsWritten % 5 == 0次数后触发一次修改。
ReplicationHandler还可以备份索引文件。由于lucene的索引文件只是追加新文件而不会修改已有文件,所以只要针对一个IndexCommit点做备份,其过程还是很简单的。

slave的工作

slave启动时会创建SnapPuller对象,SnapPuller会启动一个线程定时的(pollInterval间隔)从master复制数据(fetchLatestIndex方法)。对于一次复制过程,slave和master交互处理细节如下:
1、slave首先向master询问最新的索引版本号(indexversion命令),slave检查得到的latestVersion、latestGeneration有效后,和本地的IndexCommit的getVersion()、getGeneration()比较,如果不相等,则需要往下进行,否则等待下一次调度。
2、slave向master请求之前得到的indexversion下的文件列表(filelist命令,包括索引文件和可选的配置文件)。如果文件列表为空,则返回等待下一次调度。否则,就需要检查哪些文件需要被下载过来。这里做的判断有:1)如果本地的commit.getGeneration() >= latestGeneration,说明本地索引文件被破坏(比如对slave不小心提交了修改索引的命令),需要完全将master的文件复制过来。2)逐个检查文件列表中的文件是否在本地存在,不存在就下载下来。
3、对于下载文件内容,对应命令是filecontent。下载的文件显然需要放到临时目录中,这个临时目录和已有的索引目录(默认名字index)在同一数据目录下,只是命名为index.<时间戳>。下载完毕后,copy数据有两种情况:
1)如果是完全下载,则不需要将临时目录中的文件copy到已有目录中,而是修改数据目录中的index.properties,标识索引目录为新生成的临时目录,而旧索引目录并不会被删除,可以手工删掉,当然,通常是不应该出现slave的Generation大于master的异常情况。
2)通常就是把临时索引目录的文件copy到旧索引目录,copy时要把segments_N放到最后copy,避免copy中途出现异常造成数据被毁。
4、当新索引和可选的配置文件copy完毕之后,slave会对solrcore的UpdateHandler做commit操作,这会close掉indexwriter并强制重启新的indexsearcher提供服务。同时,如果solrcore的UpdateHandler是DirectUpdateHandler2(不应该不是),会强制调用handler.forceOpenWriter()来删除旧的无用的索引文件,并调用replicationHandler.refreshCommitpoint()来更新slave的indexCommitPoint。
5、如果索引复制失败,slave会向数据目录下的replication.properties输出复制失败的信息。
本文固定链接: http://www.chepoo.com/solr-master-slave-principle.html | IT技术精华网


参考:http://www.chepoo.com/solr-master-slave-principle.html
分享到:
评论

相关推荐

    solr(solr-9.0.0-src.tgz)源码

    - **复制与恢复**:Solr支持主从复制,确保数据的一致性和高可用性。 3. **源码结构** 解压后的源码包`solr-9.0.0`包含了以下几个关键部分: - `server`: 存放Solr服务器端代码,如SolrJetty容器、管理API等。 ...

    Hbase同步数据到Solr的方案

    这一过程与MySQL的主从复制机制类似,每个Region Server都有自己的WAL Log,并且在ZooKeeper中维护同步位置。 操作时序图大致如下: 1. 客户端(Client)对HBase执行Put或Delete操作。 2. 操作被记录在本地Region ...

    solr1.4教程

    1.2.6 复制:Solr支持主从复制,确保数据的安全性和高可用性,可以轻松地扩展集群规模。 1.2.7 管理接口:Solr提供了一个基于HTTP的Web管理界面,方便用户监控和配置系统状态。 二、Solr服务原理 1.3.1 索引 ...

    solr教材-PDF版

    - 描述了Solr如何通过主从架构实现数据的复制和分发,从而提高系统的可用性和容错性。 #### 二、Solr的安装与配置 **2.1 在Tomcat下Solr安装** - **2.1.1 安装准备**:介绍安装前需要准备的软件环境和硬件要求。 ...

    solr 企业搜索引擎教程

    - **复制架构**:通过主从复制模式提高系统可用性,支持主节点和多个副本节点之间的数据同步。 #### 7. Solr 的安装与配置 - **安装准备**:需要Java环境、Tomcat容器等。 - **安装过程**:解压Solr包、配置环境...

    开源企业搜索引擎solr的应用教程

    Solr支持数据复制,通过主从复制策略,实现集群的高可用性和数据冗余,保证系统的稳定运行。 1.2.7 管理接口 Solr内置了基于Web的管理界面,方便用户监控和管理索引、日志、系统状态等,简化运维工作。 1.3 Solr...

    开源企业搜索引擎SOLR的 应用教程

    Solr支持主从复制机制,可以在多个节点之间同步索引数据,从而提供高可用性和负载均衡。 - **1.2.7 管理接口** Solr提供了一个Web管理界面,可以方便地监控系统状态、执行管理命令等。 **1.3 Solr服务原理** - *...

    开源企业搜索引擎SOLR的应用教程

    Solr支持主从复制和分布式复制,可以实现数据的冗余存储,提高了系统的可用性和容错能力。 ##### 管理接口 Solr提供了一个强大的管理界面,可以进行索引管理、查询分析、系统监控等操作,方便了系统维护和故障排查...

    大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程

    - 主从复制:实现数据备份与读写分离。 - 分片:将数据分散存储到多个节点上。 - Sentinel:监控主从状态并自动切换。 3. **Redis应用场景**: - 缓存热点数据:减少数据库压力。 - 限流控制:防止恶意访问。 ...

    activemq,dubbo,linux,redis,shiro,solr笔记整合,基本都是面试会问到的经典题型

    面试中,除了基本的Redis数据类型(如字符串、哈希、列表、集合和有序集合)之外,还会讨论其持久化方法(RDB和AOF)、主从复制、事务处理、lua脚本以及Redis在缓存和消息队列等场景的应用。 **Shiro** 是一个轻量...

    solrcloud windows 环境搭建

    - **集群管理**:Zookeeper负责维护集群状态,支持主从管理、负载均衡、高可用性管理等功能。 - **配置文件集中管理**:在Solr集群中,Zookeeper用于统一管理各节点的配置文件,确保一致性。 - **集群高可用性**:...

    Eclipse开发分布式商城系统+完整视频代码及文档

    ├─补充2:Redis3.0新特性、主从复制、集群视频教程 │ │ 打开必读.txt │ │ │ ├─相关资料 │ │ redis-3.0.1.tar.gz │ │ redis-3.0.2.tar.gz │ │ redis-3.2.1.gem │ │ Redis集群.docx │ │ ...

    大型网站系统与JAVA中间件实践

    4. **数据库优化**:数据库是系统性能瓶颈的关键,优化SQL查询、合理设计索引、主从复制、分库分表等都是提升数据库性能的重要手段。 5. **搜索引擎**:如Elasticsearch、Solr等,用于提供全文搜索功能,提升用户...

    LBS空间搜索架构的优化历程.1c18c6f0-7e53-11e6-831e-83ec0cef607e.pdf

    MongoDB在处理大量骑手坐标上报时,由于其库级锁机制,导致从服务器CPU负载升高,查询性能和吞吐量降低,主从复制延迟增加。为解决这些问题,可以考虑升级到支持行级锁的MongoDB版本(如2.8+)并进行分片,以提高...

Global site tag (gtag.js) - Google Analytics