- 浏览: 624329 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (819)
- java开发 (110)
- 数据库 (56)
- javascript (30)
- 生活、哲理 (17)
- jquery (36)
- 杂谈 (15)
- linux (62)
- spring (52)
- kafka (11)
- http协议 (22)
- 架构 (18)
- ZooKeeper (18)
- eclipse (13)
- ngork (2)
- dubbo框架 (6)
- Mybatis (9)
- 缓存 (28)
- maven (20)
- MongoDB (3)
- 设计模式 (3)
- shiro (10)
- taokeeper (1)
- 锁和多线程 (3)
- Tomcat7集群 (12)
- Nginx (34)
- nodejs (1)
- MDC (1)
- Netty (7)
- solr (15)
- JSON (8)
- rabbitmq (32)
- disconf (7)
- PowerDesigne (0)
- Spring Boot (31)
- 日志系统 (6)
- erlang (2)
- Swagger (3)
- 测试工具 (3)
- docker (17)
- ELK (2)
- TCC分布式事务 (2)
- marathon (12)
- phpMyAdmin (12)
- git (3)
- Atomix (1)
- Calico (1)
- Lua (7)
- 泛解析 (2)
- OpenResty (2)
- spring mvc (19)
- 前端 (3)
- spring cloud (15)
- Netflix (1)
- zipkin (3)
- JVM 内存模型 (5)
- websocket (1)
- Eureka (4)
- apollo (2)
- idea (2)
- go (1)
- 业务 (0)
- idea开发工具 (1)
最新评论
-
sichunli_030:
对于频繁调用的话,建议采用连接池机制
配置TOMCAT及httpClient的keepalive以高效利用长连接 -
11想念99不见:
你好,我看不太懂。假如我的项目中会频繁调用rest接口,是要用 ...
配置TOMCAT及httpClient的keepalive以高效利用长连接
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
对于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
发表评论
-
Elasticsearch中mapping全解实战
2022-03-23 10:01 187Elasticsearch中mapping全解实战 深入学习 ... -
如何快速搭建一个简易的ELK日志分析系统
2022-03-22 23:56 179如何快速搭建一个简易的ELK日志分析系统 -
ElasticSearch-ik分词器
2022-03-12 20:11 223ElasticSearch-ik分词器 利用Kibana来 ... -
解决elasticsearch配置network.host: 0.0.0.0导致elasticsearch服务启动不成功的问题
2022-03-10 13:53 1506解决elasticsearch配置network.host: ... -
ElasticSearch中keyword的属性ignore_above详解
2022-02-14 19:54 561ignore_above 含义 在ElasticSearch中 ... -
elasticsearch的keyword与text的区别
2022-01-05 15:46 205elasticsearch的keyword与text的区别 ... -
java使用ElasticSearch的RestHighLevelClient集群配置
2016-08-16 14:23 628Elasticsearch Guide elasticsea ... -
solr下载地址
2016-08-16 09:41 367http://lucene.apache.org/solr/d ... -
Solr中的概念:分析器(analyzer)、字符过滤器(character filter)、分词器(Tokenizer)、词元过滤器(Token Filter
2016-08-15 09:53 1298文本中包含许多文本处理步骤,比如:分词,大写转小写,词干化,同 ... -
solrCloud源码分析之CloudSolrClient
2016-08-12 08:36 994CloudSolrClient是solrj提供的客户端与sol ... -
solr常用查询语句如何写
2016-08-12 08:34 399工作中用到solr,就自己工作中常用查询,简单总结下solr查 ... -
Solr的学习使用之(七)Solr高级查询facet、facet.pivot简介
2016-08-12 08:36 13531 、什么是Faceted Search Facet['fæ ... -
Solr JAVA客户端SolrJ 4.9使用示例教程
2016-08-12 08:37 464简介 SolrJ是操作Solr的JAVA客户端,它提供了增加 ... -
solr 3.5 配置及应用(三)
2016-08-12 08:37 394在solr 3.5 配置及应用(二)中在 Document文档 ... -
Solr相关知识点串讲
2016-08-11 10:14 566Solr是Apache Lucene的一个子项目。Lucene ... -
solrj 更新部分索引域的值
2016-08-11 09:33 3052solrj可以用关键字set对索引进行部分字段更新: Has ...
相关推荐
- **复制与恢复**:Solr支持主从复制,确保数据的一致性和高可用性。 3. **源码结构** 解压后的源码包`solr-9.0.0`包含了以下几个关键部分: - `server`: 存放Solr服务器端代码,如SolrJetty容器、管理API等。 ...
这一过程与MySQL的主从复制机制类似,每个Region Server都有自己的WAL Log,并且在ZooKeeper中维护同步位置。 操作时序图大致如下: 1. 客户端(Client)对HBase执行Put或Delete操作。 2. 操作被记录在本地Region ...
1.2.6 复制:Solr支持主从复制,确保数据的安全性和高可用性,可以轻松地扩展集群规模。 1.2.7 管理接口:Solr提供了一个基于HTTP的Web管理界面,方便用户监控和配置系统状态。 二、Solr服务原理 1.3.1 索引 ...
- 描述了Solr如何通过主从架构实现数据的复制和分发,从而提高系统的可用性和容错性。 #### 二、Solr的安装与配置 **2.1 在Tomcat下Solr安装** - **2.1.1 安装准备**:介绍安装前需要准备的软件环境和硬件要求。 ...
- **复制架构**:通过主从复制模式提高系统可用性,支持主节点和多个副本节点之间的数据同步。 #### 7. Solr 的安装与配置 - **安装准备**:需要Java环境、Tomcat容器等。 - **安装过程**:解压Solr包、配置环境...
Solr支持数据复制,通过主从复制策略,实现集群的高可用性和数据冗余,保证系统的稳定运行。 1.2.7 管理接口 Solr内置了基于Web的管理界面,方便用户监控和管理索引、日志、系统状态等,简化运维工作。 1.3 Solr...
Solr支持主从复制机制,可以在多个节点之间同步索引数据,从而提供高可用性和负载均衡。 - **1.2.7 管理接口** Solr提供了一个Web管理界面,可以方便地监控系统状态、执行管理命令等。 **1.3 Solr服务原理** - *...
Solr支持主从复制和分布式复制,可以实现数据的冗余存储,提高了系统的可用性和容错能力。 ##### 管理接口 Solr提供了一个强大的管理界面,可以进行索引管理、查询分析、系统监控等操作,方便了系统维护和故障排查...
- 主从复制:实现数据备份与读写分离。 - 分片:将数据分散存储到多个节点上。 - Sentinel:监控主从状态并自动切换。 3. **Redis应用场景**: - 缓存热点数据:减少数据库压力。 - 限流控制:防止恶意访问。 ...
面试中,除了基本的Redis数据类型(如字符串、哈希、列表、集合和有序集合)之外,还会讨论其持久化方法(RDB和AOF)、主从复制、事务处理、lua脚本以及Redis在缓存和消息队列等场景的应用。 **Shiro** 是一个轻量...
- **集群管理**:Zookeeper负责维护集群状态,支持主从管理、负载均衡、高可用性管理等功能。 - **配置文件集中管理**:在Solr集群中,Zookeeper用于统一管理各节点的配置文件,确保一致性。 - **集群高可用性**:...
├─补充2:Redis3.0新特性、主从复制、集群视频教程 │ │ 打开必读.txt │ │ │ ├─相关资料 │ │ redis-3.0.1.tar.gz │ │ redis-3.0.2.tar.gz │ │ redis-3.2.1.gem │ │ Redis集群.docx │ │ ...
4. **数据库优化**:数据库是系统性能瓶颈的关键,优化SQL查询、合理设计索引、主从复制、分库分表等都是提升数据库性能的重要手段。 5. **搜索引擎**:如Elasticsearch、Solr等,用于提供全文搜索功能,提升用户...
MongoDB在处理大量骑手坐标上报时,由于其库级锁机制,导致从服务器CPU负载升高,查询性能和吞吐量降低,主从复制延迟增加。为解决这些问题,可以考虑升级到支持行级锁的MongoDB版本(如2.8+)并进行分片,以提高...