`
kernaling.wong
  • 浏览: 78796 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用IndexMergeTool后,导致solrcloud的主从同步失败的解决方案

 
阅读更多

 

   在使用 solrcloud 的时候,很多人都会使用主从同步实现负载均衡与索引的容错性,当索引经过修改,删除或者新增了数据后,索引的段数会不断增多,累积得越多,索引的搜索速度越慢.这时很多人都会提出使用 optimize 优化索引.没错,这一个的确是一个相当重要的手段,而且 solrcloud 也提供了相关的功能即可.本来看似很简单就能解决的问题,深究下去,还是有点意思的.再来一种情况就是,有时候需要把几个 code 合并成一个大的 core ,当然了solrcloud 也有提供相关的功能.但似乎实际用起来并非这么的顺手.出现很多类似时间超时,连接超时等一大堆的问题.

 

   所以我们使用了 lucene 的 misc 包提供的叫 IndexMergeTool 的工具类,在 solrcloud 的官方文件中也有提及,此类除了用于合并索引后,其实还可以用于优化索引,原理都相似.

 

 问题的发现

 

   最近在一次的索引优化中,我们设想就是一个 leader 完成索引优化后,索引发生改变了,其他的 replica 则会把优化后的索引同步过去,我是使用 IndexMergeTool 去优化索引的.但当优化后,其他的 replica 并没有执行同步,我尝试重启 leader , replica 同样没有同步的操作,而看日志的确也没有发生同步.到底是怎么回事?

 

 问题的根源

 

    我开始以为是版本有问题,就尝试更换到 solrcloud 4.7.1 ,我发现把replica关闭,然后先写到 leader 再重启 replica 数据的确能同步,我通过 solrcloud 后台的 optimize 索引后,同样能正常同步.现在的问题看似是因为我使用了 IndexMergeTool 作为合并的工具而导致了不能同步了.

 

    对比情况

             我用 IndexMergeTool 合并完的索引与 solrcloud 后台操作优化索引对比了一下,大小与结构上差别不大,而且两份索引搜索出来的结果是相同的,证明索引是没有因为优化而损坏.通过 solrcloud 后台对比后有了一个发现,

    正常能同步的索引显示

             

 

              而通过IndexMergeTool 后,索引版本成为

                  

             看来,因为是版本问题导致了索引并不能正常同步成功了.再查看 solrcloud 优化的 handle 的源码后,恍然大悟,原来 solrcloud在优化索引后做了一些额外的处理

     

// 此类为 DirectUpdateHandler2 类,的 commit(CommitUpdateCommand cmd) 方法里面.
IndexWriter writer = iw.get();
        if (cmd.optimize) {
     // 普通的索引优化处理,跟IndexMergeTool 处理是一样的.
          writer.forceMerge(cmd.maxOptimizeSegments);
        } else if (cmd.expungeDeletes) {
          writer.forceMergeDeletes();
        }
        
        if (!cmd.softCommit) {
          synchronized (solrCoreState.getUpdateLock()) { // sync is currently needed to prevent preCommit
                                // from being called between preSoft and
                                // postSoft... see postSoft comments.
            if (ulog != null) ulog.preCommit(cmd);
          }
          
          // SolrCore.verbose("writer.commit() start writer=",writer);
     // 这里却添加在索引合并完后,添加了这一个对合并完操作后的版本时间写入
          if (writer.hasUncommittedChanges()) {
            final Map<String,String> commitData = new HashMap<String,String>();
            commitData.put(SolrIndexWriter.COMMIT_TIME_MSEC_KEY,
                String.valueOf(System.currentTimeMillis()));
            writer.setCommitData(commitData);
            writer.commit();
          } else {
            log.info("No uncommitted changes. Skipping IW.commit.");
          }

 

    通过源码可以看到,除了做合并后,最后还向索引中添加了一个叫"commitTimeMSec"的时间点,经后面发现那个时间点跟显示的 version 为一致的,说明就是那个时间点作为同步的依据了.同时查看了 msic 包下面的 IndexMergerTool 源码,因为本来就是 lucene 的包,所以不会象 solrcloud 再做这样子的处理了,后面添加上后,索引版本号就能正常显示也能正常同步了.

 

   解决方案

     修改IndexMergerTool 代码,红色框中所显示的

     

 

                            欢迎连载,但请注明出处及作者     

             http://kernaling-wong.iteye.com/blog/2066793

                 by kernaling.wong

  • 大小: 26.8 KB
  • 大小: 20.3 KB
  • 大小: 75.9 KB
分享到:
评论
1 楼 zaytay 2017-07-06  
赞,正好解决遇到的问题

相关推荐

    mysql主从同步解决方案及优化

    在数据库领域,MySQL作为一款广泛使用的开源关系型数据库系统,其主从同步功能对于提高数据的可靠性、保证数据的高可用性以及负载均衡具有重要作用。淘宝资深工程师丁奇在2009年的分享中详细介绍了MySQL主从同步的...

    mysql主从同步架构设计方案.pdf

    mysql主从同步架构设计方案,可以配置应用最广泛的一主拖多从,也可以多主多从,方案中有监控方案,7 * 24 小时自动监控。

    实现VisualSVN Server主从同步备份.pdf

    知识点三:解决VisualSVN Server主从同步备份中的权限问题 如果在VisualSVN Server主从同步备份过程中,主服务器一直等待提交结束,这种情况通常是因为主服务器需要获得管理员权限,没有管理员权限svn服务器无法执行...

    突破Java面试(50)-MySQL读写分离及主从同步延时解决方案.docx

    ### MySQL读写分离及主从同步延时解决方案 #### 一、引言 在现代互联网应用中,随着用户量的增长和业务复杂度的提高,单一数据库服务器往往难以满足高并发场景下的性能需求。为了有效应对这种挑战,许多企业选择了...

    JAVA 线程实现数据库的主从同步更新

    在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。

    Oracle 12.2主从数据同步方法

    在启动同步后,需要进行同步测试。可以使用 SQL Plus 工具连接到数据库,执行 INSERT、UPDATE 和 DELETE 语句,以验证数据是否已成功同步。 ### 6. 异常排查 在同步过程中,可能会出现一些异常情况,例如数据不...

    12.1: MySQL主从同步 、 主从同步模式 、 总结和答疑.docx

    MySQL主从同步配置和实现 MySQL主从同步是指将一个MySQL服务器的数据实时地复制到另一个或多个服务器上,以实现数据的高可用性和灾难恢复。这种方式可以实现数据的热备援、读写分离、负载均衡等功能。 1. 案例 1:...

    Linux配置mysql主从同步

    2. **从服务器与主服务器时间不一致导致复制失败怎么办?** - 确保所有服务器的时间同步。 - 使用NTP(Network Time Protocol)或其他工具进行时间同步。 3. **如何解决权限问题?** - 检查创建的复制用户是否有...

    MySQL_主从原理问题解决方案和应用

    ### MySQL主从同步原理、问题、解决方案与应用详解 #### 一、MySQL主从同步基本流程 MySQL的主从同步机制是一种数据复制技术,用于在多个数据库服务器间保持数据的一致性。它允许数据从主服务器(Master)自动复制...

    MySQL主从同步配置过程.docx

    MySQL 主从同步配置过程 一、 MySQL 主从同步配置概述 MySQL 主从同步配置是指将 MySQL 数据库的数据从一台服务器(主服务器)同步到另一台服务器(从服务器)的过程。这种配置可以实现数据的高可用性和灾难恢复,...

    mysql主从同步搭建修改优化版.pdf

    - 考虑使用GTID(Global Transaction Identifier)进行更精确的主从同步,避免因日志文件和位置导致的问题。 - 优化网络连接,减少数据传输延迟。 - 定期备份,防止数据丢失。 - 评估并调整主从复制的性能参数,...

    免费的淘宝的数据库主从同步策略,

    淘宝的数据库主从同步策略,受些启发,淘宝丁奇的分享,纠结在主从同步延时的童鞋们可以受些启发。 淘宝的数据库主从同步策略,受些启发,淘宝丁奇的分享,纠结在主从同步延时的童鞋们可以受些启发。

    Linux-Mysql主从同步配置

    Linux-Mysql 主从同步配置 本文将详细解释 Linux-Mysql 主从同步配置的步骤和知识点。 一、主服务器配置 1. 编辑数据库配置文件 my.cnf, 一般在/etc/目录下。 2. 在[mysqld]下面加入以下代码: * log-bin=mysql...

    windows下mysql主从同步备份步骤

    在Windows环境下,MySQL主从同步备份是一种常见的高可用性和数据冗余策略,确保数据的安全性和一致性。以下是详细步骤,适用于MySQL 5.0版本: 1. **创建备份账户**: 在主服务器A上,我们需要创建一个用于复制的...

    amoeba集群文档+Amoeba使用指南pdf+mysql主从同步

    标题中的“amoeba集群文档+Amoeba使用指南pdf+mysql主从同步”是指一系列关于Amoeba中间件和MySQL数据库集群的知识资源,包括Amoeba的集群部署、使用方法以及MySQL的主从同步策略。这些文档将帮助读者理解如何构建高...

    主从同步架构设计方案PPT学习教案.pptx

    主从同步架构是一种常见的数据库高可用性和扩展性的设计方案,它主要应用于大型的、高并发的数据库系统中。这种架构能够确保数据的一致性,并通过读写分离减轻数据库服务器的负载,提高系统的整体性能。 首先,从...

    mysql主从同步配置

    MySQL主从同步是一种数据库复制技术,它允许数据从一个MySQL服务器(称为“主服务器”)实时复制到另一个或多个服务器(称为“从服务器”)。这种配置对于数据备份、负载均衡和高可用性至关重要。在Java开发中,了解...

    mysql主从同步检查脚本

    mysql主从同步检查脚本 。主要运用于日常maysql运行主从同步状态检查。

Global site tag (gtag.js) - Google Analytics