如何在reindex运行时读取一致版本的sphinx文件

时间:2013-08-06 15:43:32

标签: concurrency sphinx

在尝试备份sphinx索引文件时,我遇到了备份脚本的间歇性问题。备份命令或多或少仅是tar/var/lib/sphinxsearch/data的所有文件的spl命令,其中包含一些排除模式(tmp.spl等等。)

但我遇到的问题是我们运行几乎连续的重新索引,这意味着tar操作员的文件不断被新版本旋转。我有计划处理这个问题,即使用sphinx lockfile:

  • 对于每个索引:
    • 获取.spa文件的锁定(希望阻止reindex同时运行)
    • 添加相关文件(.spd.sph.spi.spk.spm.spp.sps,{ {1}})
    • 释放.spl文件
    • 上的锁定

我担心的是,我似乎无法找到关于完全锁定文件如何在sphinx中表现的详细文档。这将是一个与低级别的sphinx并发交互的工具,我看到了很多潜在的陷阱(并发性让我害怕)。我想知道是否:

  1. 在某处,我可以全面了解锁定文件在sphinx中的工作原理吗?
  2. 我的计划是支持sphinx甚至是正确的计划吗?我环顾谷歌,找不到更好的东西,但有人知道更好的方法。

1 个答案:

答案 0 :(得分:1)

AFAIK'lockfile' - 仅测试是否存在。该文件存在,searchd正在为索引提供服务。文件不存在,索引可以安全地重新创建或删除等。

如果锁存文件存在,

索引器将拒绝重新索引索引。

但是如果指定--rotate,它将创建索引的全新版本(文件名中包含.new。),它不关心是否存在锁定文件,因为它没有触及现有索引。

当完成信号搜索时。然后,searchd将删除活动索引,重命名索引文件,并提供新版本(以不中断服务的方式 - 并且还保持锁定文件到位)


所以从那里起停止索引器(假设你使用--rotate)的唯一方法是创建indexname.new.spl - 我认为这可能有效 - 但从未尝试过。我不认为如果你建议锁定一些东西它会注意到。

获得一致性备份的更好但更狡猾的方法可能是拦截从索引器到searchd的信号。有一个进程从索引器监听sighup,如果备份正在进行暂停直到完成,然后将sighup发送到searchd。

(但是可能需要做一些工作才能让索引器将sighub发送到您的截取者,必须创建一个配置文件,带有假的pid文件。所以它的拦截器的pid没有被搜索)


当然更大的问题是,如果您的索引可以如此轻松地重新创建(无论如何经常重新编写它们),为什么要打扰它们呢?如果丢失则可以重新创建。