4

我正在使用 RavenDB 888 版。

我的客户端应用程序将数十万个文档插入 RavenDB。它工作正常。插入后,我的应用程序将从我预定义的静态索引中查询一些数据。我不想要过时的结果,所以我的应用程序会定期查询并等到索引是最新的。

不幸的是,今天我发现我的应用程序挂起(更准确地说,是一次又一次地查询 RavenDB),因为服务器总是告诉它索引仍然是陈旧的。这有点奇怪,因为上次插入很久以前就完成了——理论上服务器应该已经完成​​了索引。

我查看了管理工作室并检查了我最简单的索引,该索引对我的一种文档集合进行了一些计数。有趣的是,索引给出的计数是最新的(与我在管理工作室的“收藏”选项卡中看到的数字相同),但状态是“陈旧”。它的最后一次更新显示“6 小时前”。总而言之,我的索引中有一半是这样陈旧的,但根据工作室的说法,另一半是新鲜的。

我不知道为什么 RavenDB 会让它们变得陈旧,以及 RavenDB 现在在做什么。它的 CPU 使用率不高。如何调试场景?

更新:

我想我发现了一件事可能有助于找到根本原因。在将我的非陈旧索引与总是陈旧的索引进行比较之后,reduce 结果似乎很重要:陈旧索引在 reduce 结果中具有较大的 Value 属性,而最新索引具有较小的 Value 属性。

public class ReduceResult
{
    public string ID { get; set; }
    public string Key { get; set; }
    public long Value { get; set; } //This field seems to matter
}

这是我的索引定义之一:

public class InternalPageCountIndex : AbstractIndexCreationTask<InternalPage, ReduceResult>
{
    public InternalPageCountIndex()
    {
        Map = posts => from post in posts
                       select new
                       {
                           Key = post.BatchID,
                           Value = 1
                       };

        Reduce = results => from result in results
                            group result by result.Key
                                into g
                                select new
                                {
                                    Key = g.Key,
                                    Value = g.Sum(c => c.Value)
                                };
    }
}

顺便说一句,服务器日志看起来也很有趣。今天下午服务器认为没有工作要做:

2012-04-07 16:36:44.6725,Raven.Database.Tasks.ReduceTask,Debug,Indexed 65 reduce keys in 00:00:03.5535907 with 493666 results for index SNRTotalByteSizeIndex, 2012-04-07 17:35:21.1888,Raven .Database.Indexing.WorkContext,Debug,"未找到工作,workerWorkCounter: 5, for: ReducingExecuter, 将等待额外工作", 2012-04-07 17:35:21.1888,Raven.Database.Indexing.WorkContext,Debug "未找到工作,workerWorkCounter: 5,for:IndexingExecuter,将等待额外的工作",2012-04-07 18:35:39.4759,Raven.Database.Indexing.WorkContext,Debug,"未找到工作,workerWorkCounter : 5, for: ReducingExecuter, 将等待额外的工作”, 2012-04-07 18:35:39.4759,Raven.Database.Indexing.WorkContext,Debug,"未找到工作, workerWorkCounter: 5, for: IndexingExecuter, 将等待额外的工作”,2012-04-07 19:35:56.5994,Raven.Database.Indexing.WorkContext,Debug,"未找到工作,workerWorkCounter: 5,for:ReducingExecuter,将等待额外工作",2012-04-07 19:35 :56.5994,Raven.Database.Indexing.WorkContext,Debug,"未找到工作,workerWorkCounter: 5,for:IndexingExecuter,将等待额外工作", 2012-04-07 20:36:12.3345,Raven.Database.Indexing .WorkContext,Debug,"未找到工作,workerWorkCounter: 5,for:ReducingExecuter,将等待额外工作", 2012-04-07 20:36:12.3345,Raven.Database.Indexing.WorkContext,Debug,"无工作被发现,workerWorkCounter: 5, for: IndexingExecuter, 将等待额外的工作”,将等待额外的工作”,2012-04-07 19:35:56.5994,Raven.Database.Indexing.WorkContext,Debug,“没有找到工作,workerWorkCounter:5,for:IndexingExecuter,将等待额外的工作”,2012 -04-07 20:36:12.3345,Raven.Database.Indexing.WorkContext,Debug,"未找到工作,workerWorkCounter: 5, for: ReducingExecuter, 将等待额外工作", 2012-04-07 20:36: 12.3345,Raven.Database.Indexing.WorkContext,Debug,"未找到工作,workerWorkCounter: 5,for:IndexingExecuter,将等待额外工作",将等待额外的工作”,2012-04-07 19:35:56.5994,Raven.Database.Indexing.WorkContext,Debug,“没有找到工作,workerWorkCounter:5,for:IndexingExecuter,将等待额外的工作”,2012 -04-07 20:36:12.3345,Raven.Database.Indexing.WorkContext,Debug,"未找到工作,workerWorkCounter: 5, for: ReducingExecuter, 将等待额外工作", 2012-04-07 20:36: 12.3345,Raven.Database.Indexing.WorkContext,Debug,"未找到工作,workerWorkCounter: 5,for:IndexingExecuter,将等待额外工作",ReducingExecuter, 将等待额外的工作”, 2012-04-07 20:36:12.3345,Raven.Database.Indexing.WorkContext,Debug,"没有找到工作, workerWorkCounter: 5, for: IndexingExecuter, 将等待额外的工作” ,ReducingExecuter, 将等待额外的工作”, 2012-04-07 20:36:12.3345,Raven.Database.Indexing.WorkContext,Debug,"没有找到工作, workerWorkCounter: 5, for: IndexingExecuter, 将等待额外的工作” ,

但是当我今晚通过 Management Studio 查询 RavenDB 以查看有多少陈旧索引时,服务器开始执行 map/reduce!是的,下午和今晚之间没有插入,但是服务器在工作室查询后发现与索引有关...

2012-04-07 21:23:16.9357,Raven.Database.Tasks.ReduceTask,Debug,Read 1 reduce keys in 00:03:05.6481176 with 505406 results for index InternalPageCountIndex,

2012-04-07 21:23:19.5103,Raven.Database.Indexing.Index.Indexing,Debug,“批量索引/1 结果索引 PageCountMissingDescriptionIndex 给出了文档:__reduce_key I-:批次/1 键 IS:批次/1 值IS: 505406 Value_Range IS: 505406",

2012-04-07 21:23:19.6797,Raven.Database.Indexing.Index.Indexing,Debug,Reduce 为减少键的 InternalPageCountIndex 生成 1 个条目:batchs/1, 2012-04-07 21:23:19.6797,Raven .Database.Tasks.ReduceTask,Debug,Indexed 00:00:02.7426449 中的 1 个减少键,索引 InternalPageCountIndex 的结果为 505406,

根据工作室查询,服务器仍然告诉我一半的索引是陈旧的:(

过时的索引

4

2 回答 2

1

这是一个错误。

感谢 Ayende 和 RavenDB 团队,自构建 909 以来,此问题已得到修复。有关更多信息,请参阅http://groups.google.com/group/ravendb/browse_thread/thread/13b16ce3f562472d

于 2012-04-18T06:14:08.023 回答
0

看起来您正在减少 BatchID,并且有很多具有相同批次 ID 的项目。这意味着对于每个唯一键,我们必须加载该唯一键的所有映射结果,在您的情况下,其中有 505,406 个,所以这需要时间。映射结果花费的时间相对较少。减少它们需要时间,因为我们需要减少大量数据。

于 2012-04-08T10:55:24.773 回答