普通索引复制

Manticore Search(以及 Sphinx)尚不支持普通或 RT 索引的复制(尽管我们正在努力实现这一点,如果您想成为测试者,请通过 [email protected] 联系我们),因此如果您需要在其他地方拥有 Manticore Search / Sphinx 数据的副本,您必须自己实现它。您可能需要它的原因:

  • 可扩展性:您希望在服务器上平衡负载(例如,您可以将一半的 Manticore 查询发送到一台服务器,另一半发送到另一台服务器),以提高吞吐量,减少延迟或服务器负载
  • 高可用性:您希望拥有 Manticore 索引副本,一旦主 Manticore 存储因某种原因变得不可用,它们可以立即使用
  • 您希望将上述两者结合起来,自动检测问题并在服务器之间切换(例如,当一台服务器崩溃时,另一台服务器会自动开始处理所有查询)

复制普通索引的最简单方法是 只需将您的 Manticore 配置复制到另一台服务器,并在那里的 'indexer' 上索引所有内容,但在这种情况下,坏处在于首先是重建索引所需的资源浪费,其次是很难提供良好的数据同步级别:Manticore 普通索引将从同一来源(例如,您的主数据库)单独重建,最终应该是相同的,但可能会有一些延迟,因为某些服务器负载稍重,或者您对源进行了密集更新,可能有多种原因。

以下是我们可以以另一种方式做到这一点的方法,这将确保副本 100% 一致且数据出现延迟最小:

  1. 仅在一个地方进行索引(我们称之为 MASTER)
  2. 使用 rsync 或其他工具复制到 SLAVEs(或在您在从属服务器上运行时从 MASTER)
  3. 告诉 Manticore 在所有地方它应该开始使用新的重建数据

以下是它可能的样子:

主服务器上的索引

这里的技巧是创建一个完全继承自您的正常索引的新“伪”索引,仅修改“路径”(见下文的 idx_new):

index idx {
    path = sphinx_tmp/idx
    source = src
}

index idx_new:idx {
    path = sphinx_tmp/idx_new
}

“新”索引可以有不同的名称或不同的路径,这无关紧要,我们只需要知道新索引将放置的位置。

构建“新”索引:

[snikolaev@dev01 ~]$ indexer -c sphinx_replication.conf idx_new
Manticore 2.6.1 9a706b4@180119 dev
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2018, Manticore Software LTD (http://manticoresearch.com)

using config file 'sphinx_replication.conf'...
indexing index 'idx_new'...
collected 3 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 3 docs, 29 bytes
total 0.004 sec, 7045 bytes/sec, 728.86 docs/sec
total 7 reads, 0.000 sec, 13.7 kb/call avg, 0.0 msec/call avg
total 12 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

之后,您应该在索引目录中看到如下内容:

[snikolaev@dev01 ~]$ ls -la sphinx_tmp/
total 460
drwxrwxr-x 2 snikolaev snikolaev 4096 Feb 26 01:09 .
drwx------+ 149 snikolaev snikolaev 405504 Feb 26 01:09 ..
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:09 idx_new.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:09 idx_new.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:09 idx_new.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:09 idx_new.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:09 idx_new.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx_new.spk
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx_new.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:09 idx_new.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:09 idx_new.sps
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:07 idx.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:07 idx.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:07 idx.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:07 idx.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:07 idx.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:07 idx.spk
-rw------- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spl
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:07 idx.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:07 idx.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:07 idx.sps

idx.* 是您的正常索引文件,idx_new.* 是“新”索引文件。

复制索引

现在您已经构建了新索引,您需要将其传送到您希望运行的所有地方。您可以为此使用任何您想要的工具:rsync、scp、ftp、samba 等。

scp sphinx_tmp/idx_new.sp* SLAVE:sphinx_tmp/

轮换索引

现在您已经将索引传播到所有从属服务器,剩下的就是轮换索引,以便新的索引取而代之。之前 Sphinx 仅允许通过向 searchd 实例发送 HUP 信号或重启实例来实现这一点。从 Sphinx 2.3.1 及 Manticore Search RELOAD INDEX 可用,这允许通过 SphinxQL 轮换索引,更重要的是传递 searchd 应该找到索引文件的路径,例如在我们的案例中:

[snikolaev@dev01 ~]$ mysql -P9314 -h0 -e "RELOAD INDEX idx FROM 'sphinx_tmp/idx_new'"

之后,您可以看到“新”索引文件在目录中消失:

[snikolaev@dev01 ~]$ ls -la sphinx_tmp/
total 432
drwxrwxr-x 2 snikolaev snikolaev 4096 Feb 26 01:15 .
drwx------+ 149 snikolaev snikolaev 405504 Feb 26 01:09 ..
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:09 idx.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:09 idx.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:09 idx.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:09 idx.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:09 idx.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spk
-rw------- 1 snikolaev snikolaev 0 Feb 26 01:15 idx.spl
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:09 idx.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:09 idx.sps

在 searchd 日志中,您可以看到轮换成功(仅花费 1 毫秒):

[snikolaev@dev01 ~]$ tail -n 2 sphinx_replication.log
[Mon Feb 26 01:15:39.003 2018] [3346] rotating index 'idx': started
[Mon Feb 26 01:15:39.004 2018] [3346] rotating index 'idx': success

因此,您现在要做的就是从您在所有目标上制作的副本中轮换索引,只需在各处调用 RELOAD INDEX 命令,例如:

[snikolaev@dev01 ~]$ for host in SLAVE 0; do echo $host; mysql -P9314 -h$host -e "RELOAD INDEX idx FROM 'sphinx_tmp/idx_new';"; done;
SLAVE
0

注意事项

  • 当您启动 Manticore 时,您可能会看到以下警告:
WARNING: index 'idx_new': prealloc: failed to open sphinx_tmp/idx_new.sph: No such file or directory; NOT SERVING

这个警告是可以的,因为我们不需要 Manticore Search 提供 idx_new,我们只需要这个索引作为新数据的临时存储。

  • 对于巨大的索引,索引同步所花费的时间可能很长,但无论如何,文件系统/网络级别的数据同步对您的服务器来说比使用“indexer”从头重建索引要容易。
  • 请记住,如果您进行属性更新,您也需要在所有从属服务器上进行,因为正如我在开头所说的,目前还没有高等级的复制。如果您需要此功能并希望成为测试者,请与我们联系。
  • 通常,您所做的就是有一个索引脚本,首先准备新索引,然后将其复制到所有需要的地方,然后在各处轮换索引。这是最简单的方法,在实际应用中,您可能还希望进行索引验证,在从属服务器上进行索引以提供索引高可用性,使用锁以确保您不会在 N 台服务器上同时重建索引,等等。我们已经为我们的客户做过很多次。如果您需要在这方面的支持,请通过电子邮件 [email protected] 联系我们。您可以在 这里 查看我们的支持计划。

最后,我想说的是,直到 RT 索引有高等级的复制,许多人仍在使用普通索引,所描述的操作方法是有意义的,并且可以轻松实现普通索引的复制。

安装Manticore Search

安装Manticore Search