Manticore Search(像Sphinx一样)目前还不支持普通或实时索引的开箱即用复制(尽管我们正在努力,如果您想成为测试者,请在[email protected]联系我们),因此如果您需要在其他地方保留Manticore Search / Sphinx数据的副本,则必须自行实现。为什么你可能需要它:
- 可扩展性:您希望平衡服务器负载(例如,可以将一半的Manticore查询发送到一台服务器,其余的发送到另一台服务器)以增加吞吐量,减少延迟或服务器负载
- 高可用性:您希望有Manticore索引副本,一旦主Manticore存储因某些原因不可用,副本就可立即使用
- 您希望将上述两点结合起来,并具有自动问题检测和服务器切换功能(例如,当一台服务器崩溃时,另一台服务器自动开始处理所有查询)
复制普通索引最简单的方法是只是将Manticore配置复制到另一台服务器并在那里使用"indexer"重建所有索引,但这种情况的问题是,首先浪费了重建索引所需的资源,其次很难提供良好的数据同步级别:Manticore普通索引将从相同的源(例如您的主数据库)分别重建,最终它们应该是相同的,但可能会有一些延迟,因为某台服务器负载稍高或您大量更新源,可能会有多种原因。
以下是我们可以以另一种方式进行操作,以确保副本100%相同且数据出现延迟最小:
- 仅在一个地方进行索引(我们称之为主服务器MASTER)
- 使用rsync或其他方式复制到从服务器SLAVES(或从主服务器运行在从服务器上)
- 告诉所有位置的Manticore使用新重建的数据
以下是它可能的样子:
主服务器上的索引
这里的技巧是创建一个完全继承自普通索引的新"伪"索引,只修改"path"(见下面的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] 。您可以在 此处 查看我们的支持计划。
最后,我想说,在实时索引出现高级复制之前,许多人仍在使用普通索引,所描述的方法是有意义的,并且可以轻松地进行普通索引复制。