在使用 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
相关推荐
在数据库领域,MySQL作为一款广泛使用的开源关系型数据库系统,其主从同步功能对于提高数据的可靠性、保证数据的高可用性以及负载均衡具有重要作用。淘宝资深工程师丁奇在2009年的分享中详细介绍了MySQL主从同步的...
mysql主从同步架构设计方案,可以配置应用最广泛的一主拖多从,也可以多主多从,方案中有监控方案,7 * 24 小时自动监控。
知识点三:解决VisualSVN Server主从同步备份中的权限问题 如果在VisualSVN Server主从同步备份过程中,主服务器一直等待提交结束,这种情况通常是因为主服务器需要获得管理员权限,没有管理员权限svn服务器无法执行...
### MySQL读写分离及主从同步延时解决方案 #### 一、引言 在现代互联网应用中,随着用户量的增长和业务复杂度的提高,单一数据库服务器往往难以满足高并发场景下的性能需求。为了有效应对这种挑战,许多企业选择了...
在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。
在启动同步后,需要进行同步测试。可以使用 SQL Plus 工具连接到数据库,执行 INSERT、UPDATE 和 DELETE 语句,以验证数据是否已成功同步。 ### 6. 异常排查 在同步过程中,可能会出现一些异常情况,例如数据不...
MySQL主从同步配置和实现 MySQL主从同步是指将一个MySQL服务器的数据实时地复制到另一个或多个服务器上,以实现数据的高可用性和灾难恢复。这种方式可以实现数据的热备援、读写分离、负载均衡等功能。 1. 案例 1:...
2. **从服务器与主服务器时间不一致导致复制失败怎么办?** - 确保所有服务器的时间同步。 - 使用NTP(Network Time Protocol)或其他工具进行时间同步。 3. **如何解决权限问题?** - 检查创建的复制用户是否有...
### MySQL主从同步原理、问题、解决方案与应用详解 #### 一、MySQL主从同步基本流程 MySQL的主从同步机制是一种数据复制技术,用于在多个数据库服务器间保持数据的一致性。它允许数据从主服务器(Master)自动复制...
MySQL 主从同步配置过程 一、 MySQL 主从同步配置概述 MySQL 主从同步配置是指将 MySQL 数据库的数据从一台服务器(主服务器)同步到另一台服务器(从服务器)的过程。这种配置可以实现数据的高可用性和灾难恢复,...
- 考虑使用GTID(Global Transaction Identifier)进行更精确的主从同步,避免因日志文件和位置导致的问题。 - 优化网络连接,减少数据传输延迟。 - 定期备份,防止数据丢失。 - 评估并调整主从复制的性能参数,...
淘宝的数据库主从同步策略,受些启发,淘宝丁奇的分享,纠结在主从同步延时的童鞋们可以受些启发。 淘宝的数据库主从同步策略,受些启发,淘宝丁奇的分享,纠结在主从同步延时的童鞋们可以受些启发。
Linux-Mysql 主从同步配置 本文将详细解释 Linux-Mysql 主从同步配置的步骤和知识点。 一、主服务器配置 1. 编辑数据库配置文件 my.cnf, 一般在/etc/目录下。 2. 在[mysqld]下面加入以下代码: * log-bin=mysql...
在Windows环境下,MySQL主从同步备份是一种常见的高可用性和数据冗余策略,确保数据的安全性和一致性。以下是详细步骤,适用于MySQL 5.0版本: 1. **创建备份账户**: 在主服务器A上,我们需要创建一个用于复制的...
标题中的“amoeba集群文档+Amoeba使用指南pdf+mysql主从同步”是指一系列关于Amoeba中间件和MySQL数据库集群的知识资源,包括Amoeba的集群部署、使用方法以及MySQL的主从同步策略。这些文档将帮助读者理解如何构建高...
主从同步架构是一种常见的数据库高可用性和扩展性的设计方案,它主要应用于大型的、高并发的数据库系统中。这种架构能够确保数据的一致性,并通过读写分离减轻数据库服务器的负载,提高系统的整体性能。 首先,从...
MySQL主从同步是一种数据库复制技术,它允许数据从一个MySQL服务器(称为“主服务器”)实时复制到另一个或多个服务器(称为“从服务器”)。这种配置对于数据备份、负载均衡和高可用性至关重要。在Java开发中,了解...
mysql主从同步检查脚本 。主要运用于日常maysql运行主从同步状态检查。