所以这就是我的困境......
我正在使用Solr运行实时搜索索引,每天索引大约6M文档。文件在大约7天后过期。所以每天,我都会添加6M文档,并删除6M文档。不幸的是,我需要经常运行“优化”,否则我将耗尽磁盘空间。
在“优化”期间,Solr继续为读取请求提供服务,但写入请求被阻止。我的所有写入都在队列后面,所以在操作上,一切都很好。但是,由于我的索引太大,“优化”大约需要一个小时,而在这个小时内,没有新的更新可用于读取。所以我的索引是实时的,除了我优化的每一小时。在此期间,看起来索引落后了长达一个小时。这不是最佳的。
我目前的解决方案是:将所有数据写入队列后面的两个Solr索引。每12小时交替“优化”两个索引。在索引1的“优化”期间,将所有读取流量指向索引2,反之亦然。这个基于时间的路由确实看起来非常脆弱和粗糙。
有更好的方法吗?
答案 0 :(得分:4)
答案 1 :(得分:1)
另一个基于时间的选项是为每天维护一个单独的索引,并每天写入所有索引。在这种情况下,您不需要执行删除操作,而是以先进先出(FIFO)方式旋转索引。
Index 1 = Day 1 + Day 2 + Day 3 + Day 4 + Day 5 + Day 6 + (no longer used)
Index 2 = empty + Day 2 + Day 3 + Day 4 + Day 5 + Day 6 + Day 7 + (no longer used)
Index 3 = empty + empty + Day 3 + Day 4 + Day 5 + Day 6 + Day 7 + Day 8
...
你明白了。在第2天,索引1将完全停止使用,您将切换到使用索引2进行读取。
显然这是一个简单的例子,你想要旋转索引命名(索引2 变成索引1,依此类推),但希望这提供了另一种可能导致实现的方法
答案 2 :(得分:0)
您是否尝试使用不同的合并因子或不同的合并策略?如果你在不断写作,那可能是比优化更好的方法。
答案 3 :(得分:0)
使用复制。
写信给你的主人,复制给你的奴隶。优化将在您的主服务器上运行,并针对从服务器运行所有查询。