2012-10-15 49 views
0

我已成立了4个cron作业自动重新索引我的狮身人面指标如下:如何在合并完成后立即运行Sphinx索引器?

*/5 * * * /usr/bin/pgrep indexer || time /usr/local/sphinx/bin/indexer --rotate --config /usr/local/sphinx/etc/sphinx.conf ripples_delta 
*/5 * * * /usr/bin/pgrep indexer || time /usr/local/sphinx/bin/indexer --rotate --config /usr/local/sphinx/etc/sphinx.conf users_delta 
30 23 * * * /usr/bin/pgrep indexer || time /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --merge users users_delta --merge-dst-range deleted 0 0 --rotate 
0 0 * * * /usr/bin/pgrep indexer || time /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --merge ripples ripples_delta --merge-dst-range deleted 0 0 --rotate 

上面显示p纤ep,我希望在每一个实例被用来检查,看看是否索引器已在运行。我的意图是防止任何潜在的资源饥饿重叠。

前两个Cron作业每5分钟运行一次,并更新我的两个主索引的Delta索引。

第二次每天运行一次(一个在下午11:30,另一个在上午12点),并将三角洲指数合并到他们的主要对应部分。

我的理解是,在这些索引合并之后,我需要重新运行delta上的索引,以便删除所有先前合并的数据,并基本上清理它们以准备第二天的索引。

如何确保在合并完成后自动发生?显然,我可以添加两个cron作业,但是我需要在相关合并完成后立即进行。

在此先感谢。

回答

1

也许更好的方法是创建一个小的“索引”守护进程。

<?php 

while (1) { 
    if (filemtime('path_to_/ripples.sph') < time()-(24*3600)) { 
     `indexer --rotate ripples_delta`; 
     sleep(10); 
     `indexer --merge ripples ripples_delta --rotate`; 
     mysql_query("UPDATE sph_counter ... "); 
     `indexer --rotate ripples_delta`; 

    } elseif (filemtime('path_to_/users.sph') < time()-(24*3600)) { 
     `indexer --rotate users_delta`; 
     sleep(10); 
     `indexer --merge users users_delta --rotate`; 
     mysql_query("UPDATE sph_counter ... "); 
     `indexer --rotate users_delta`; 

    } else { 
     `indexer --rotate ripples_delta users_delta`; 
    } 

    sleep(5*60); 
    clearstatcache(); 
} 

这样,你就离开这个脚本indefinitly运行(我用screen这一点。但是,一个更强大的解决方案是类似monit的)。

它将确保一次只运行一个进程。照顾所有的行为。如果索引需要更长的时间,那么它只会保持5分钟的差距。

要真的聪明可以运行一个MySQL查询,检查rippes或用户表是否有更新。如果没有,甚至不打扰跑指数。

+0

哇..绝对高明的想法和我从来没有亲自想出的东西。巴里,你来拯救所有的狮身人面像。我真的很感激你花时间帮助我完成所有这些。 :) – gordyr

+0

只是对上述脚本的一个简短问题...在我的sphinx.conf文件中,我正在pre_query部分中自动更新计数器。我可以安全地离开这个脚本的这些部分,或者它真的应该运行后重新索引? – gordyr

+0

是的,您需要在合并完成后手动更新计数器表。狮身人面像无法为你做到这一点。在执行合并时,将不运行'sql _...'查询。查看其他帖子中的错误链接。 – barryhunter

1

创建一个小的shell脚本,

  1. 指标增量
  2. 合并增量回主
  3. 更新数据库更新计数器标志(主已经改变,所以增量需要使用新的计数器)
  4. 重新索引三角洲再次

作为一个shell脚本,确保他们在SEQ运行uence。

技术上也可能错过1),因为其他*/5总是最近总是跑。

无论如何,您还需要运行脚本来运行步骤3)。狮身人面像不能为你做。 http://sphinxsearch.com/bugs/view.php?id=517

2

另一个相关的问题,你应该做的

*/6 ...索引--rotate users_delta ripples_delta

即在一个命令同时更新。然后索引器建立两个索引,然后执行旋转。

在两个平行过程中,两个旋转可能最终彼此相向。

(也和pgrep,这也意味着这两个增量更新的第二个是unlikly到第一,将始终刚刚开始)

也改变说

34 23 *。 ..

即,而不是“30”,这意味着发生与三角洲完全相同的时间。三角洲似乎已经开始了,意思是永远不会合并。

+0

是的,我意识到我可能今天上午早些时候的两项工作合并为一个索引行。无论如何创建一个类似于您发布的智能脚本似乎是最好的方法。欢呼声:) – gordyr

1

对于任何定期任务,我建议在脚本的开头创建一个锁定文件以避免重新进入并检查它是否存在于脚本启动中。

脚本包装样品(可用于定期备份MySQL的也)是在这里:http://astellar.com/2012/10/backups-running-at-the-same-time/

+0

感谢,很棒的提示......在这个例子中,我将与BarryHunters索引守护进程脚本一起去,但是您的信息非常有用/有价值。谢谢! – gordyr

相关问题