0

尝试备份 sphinx 索引文件时,备份脚本出现间歇性问题。备份命令或多或少只是tar对所有文件的命令,/var/lib/sphinxsearch/data具有一些排除模式(spl,,tmp等...)

但是我遇到的问题是我们运行几乎连续的重新索引,这意味着 tar 是操作员的文件不断地被新版本轮换出来。我有一个计划来解决这个问题,即使用 sphinx 锁文件:

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

我担心的是,我似乎找不到任何关于锁定文件在 sphinx 中的行为方式的详细文档。这将是一个在低级别与 sphinx 的并发交互的工具,我看到了很多潜在的陷阱(并发让我害怕)。我想知道是否:

  1. 有没有什么地方可以全面描述锁文件在 sphinx 中的工作方式?
  2. 我备份 sphinx 的计划是正确的计划吗?我环顾谷歌,找不到更好的方法,但有人知道更好的方法。
4

1 回答 1

1

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

如果 lockfile 存在,indexer 将拒绝重新索引索引。

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

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


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

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

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


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

于 2013-08-06T16:14:56.990 回答