SOLR slave 正在执行完整复制,因为它无法删除未使用的索引目录

Posted

技术标签:

【中文标题】SOLR slave 正在执行完整复制,因为它无法删除未使用的索引目录【英文标题】:SOLR slave is doing full Copy as it was not able to Delete unused Index dir 【发布时间】:2018-04-27 01:02:55 【问题描述】:

当从服务器复制索引时,它会创建一个名称格式为的索引目录 index.timestamp 下次复制时,它会尝试清理并创建一个带有新时间戳的新文件夹,但在我的情况下,它没有发生,每次我看到这个警告和 Slave 都会触发 fullCopy

Unable to cleanup unused lucene index files so we must do a full copy instead

谁知道为什么 slave 不能清理未使用的索引文件。

谢谢

【问题讨论】:

slave 只会保留主索引的副本,不会自行清理。奇怪的是,你的主人仍然保留着未使用的索引。如果您可以测试,请备份您的索引并尝试“优化”核心。看看你是否可以在你的奴隶中复制这个问题。 【参考方案1】:

不知道你的 solr 版本很难回答。

根据我的经验,solr 复制不同的索引文件(比时间戳新)。但是,如果您的索引被合并,那么它将触发完整复制。

这是一些相关的票

https://issues.apache.org/jira/browse/SOLR-6640

** 2017 年 11 月 27 日更新**

这是 5x 分支中的相关部分,

https://github.com/apache/lucene-solr/blob/branch_5x/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java#L398-L418

try 
    IndexWriter indexWriter = writer.get();
    int c = 0;
    indexWriter.deleteUnusedFiles();
    while (hasUnusedFiles(indexDir, commit)) 
        indexWriter.deleteUnusedFiles();
        LOG.info("Sleeping for 1000ms to wait for unused lucene index files to be delete-able");
        Thread.sleep(1000);
        c++;
        if (c >= 30) 
            LOG.warn("IndexFetcher unable to cleanup unused lucene index files so we must do a full copy instead");
            isFullCopyNeeded = true;
            break;
        
    
    if (c > 0)  
        LOG.info("IndexFetcher slept for " + (c * 1000) + "ms for unused lucene index files to be delete-able");
    
 finally 
    writer.decref();

因此,您有超过 30 个未使用的索引文件,这将触发警告消息和完整副本。 我会尝试从 master 优化或合并索引,看看是否复制了 fullCopy。

【讨论】:

是传统的主从还是solrcloud?我以为是主/从,但你的标签让我很困惑。 SOLR 版本使用的是 5.2.1 及其传统的主/从设置。大多数时候我在日志中看到警告说无法清理未使用的索引目录并因此触发完整复制复制关于如何避免这种情况的任何想法 分享的链接内容丰富,但我认为它与所面临的问题无关。

以上是关于SOLR slave 正在执行完整复制,因为它无法删除未使用的索引目录的主要内容,如果未能解决你的问题,请参考以下文章

mysql结构复制从master到slave,slave数据完整

数据库集群的级联复制完整实现

redis主从复制数据延迟解决方案

关于SQLServer无法对数据库'XXX'执行删除,因为它正用于复制

SQLServer “无法对数据库'XXX' 执行删除,因为它正用于复制”的解决方法

SQLServer “无法对数据库'XXX' 执行删除,因为它正用于复制”的解决方法