合并完成后如何运行Sphinx indexer?

合并完成后如何运行Sphinx indexer?,sphinx,Sphinx,我已经设置了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 --rota

我已经设置了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
上面显示的是pgrep,我希望在每个实例中都使用它来检查indexer是否已经在运行。我在这里的意图是防止任何可能需要大量资源的重叠

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

第二组每天运行一次(一个在晚上11:30,另一个在上午12点),并将增量索引合并到它们的主要对应项中

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

我如何确保合并完成后自动发生这种情况?显然,我可以再添加两个cron作业,但我需要在相关合并完成后立即执行它们


提前感谢。

创建一个小的shell脚本

  • 三角洲索引
  • 将增量合并回主节点
  • 更新数据库以更新计数器标志(main已更改,因此Delta需要使用新计数器)
  • 再次为三角洲重新编制索引
  • 作为一个shell脚本,可以确保它们按顺序运行

    从技术上讲,也可能会错过1),因为另一个*/5最近一直在运行


    您还需要运行脚本来运行步骤3)。斯芬克斯不能帮你

    创建一个小shell脚本

  • 三角洲索引
  • 将增量合并回主节点
  • 更新数据库以更新计数器标志(main已更改,因此Delta需要使用新计数器)
  • 再次为三角洲重新编制索引
  • 作为一个shell脚本,可以确保它们按顺序运行

    从技术上讲,也可能会错过1),因为另一个*/5最近一直在运行


    您还需要运行脚本来运行步骤3)。斯芬克斯不能帮你

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

    */6。。。索引器--旋转用户\u增量涟漪\u增量

    ie在一个命令中更新这两个。然后索引器构建两个索引,然后执行旋转

    在两个平行过程中,两个旋转最终可能会相互影响

    (同样对于pgrep,这也意味着两个增量更新中的第二个与第一个不同,第一个总是刚刚开始)

    也改说

    34 23*


    而不是“30”,这意味着发生的时间与三角洲完全相同。而且三角洲很可能已经开始了,这意味着永远不会有合并

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

    */6。。。索引器--旋转用户\u增量涟漪\u增量

    ie在一个命令中更新这两个。然后索引器构建两个索引,然后执行旋转

    在两个平行过程中,两个旋转最终可能会相互影响

    (同样对于pgrep,这也意味着两个增量更新中的第二个与第一个不同,第一个总是刚刚开始)

    也改说

    34 23*


    而不是“30”,这意味着发生的时间与三角洲完全相同。而且三角洲很可能已经开始了,这意味着永远不会有合并

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

    乙二醇


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

    乙二醇


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


    脚本包装器示例(也可用于定期MySQL备份)如下:

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


    脚本包装器示例(也可用于定期MySQL备份)如下所示:

    Wow。。这绝对是个绝妙的主意,而且是我个人永远不会想到的。巴里,你又来拯救斯芬克斯了。我真的很感谢你花时间帮助我度过这一切。:)只是一个关于上述脚本的快速问题。。。在sphinx.conf文件中,我在pre_查询部分自动更新计数器。我是否可以安全地将这些部分从该脚本中删除,还是真的应该在重新索引后运行?是的,合并完成后,您需要手动更新计数器表。斯芬克斯无法为你做这件事。当您执行合并时,将运行非sql查询。请参阅另一篇文章中的bug链接。哇。。这绝对是个绝妙的主意,而且是我个人永远不会想到的。巴里,你又来拯救斯芬克斯了。我真的很感谢你花时间帮助我度过这一切。:)只是一个关于上述脚本的快速问题。。。在sphinx.conf文件中,我在pre_查询部分自动更新计数器。我是否可以安全地将这些部分从该脚本中删除,还是真的应该在重新索引后运行?是的,合并完成后,您需要手动更新计数器表。斯芬克斯无法为你做这件事。当您执行合并时,将运行非sql查询。请看另一篇文章中的bug链接。是的,今天早上早些时候我意识到我可以将这两个作业合并到一个索引行中。不管怎样,创建一个类似于您发布的智能脚本似乎是最好的方法。干杯:)是的,今天早上早些时候我意识到我可以把这两份工作合并成一个索引行。不管怎样,创建一个类似于您发布的智能脚本似乎是最好的方法。干杯:)谢谢,很棒的提示。。。在本例中,我将使用BarryHunters索引守护程序脚本,但您的信息非常有用/有价值。谢谢谢谢,gr
    <?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();
    }