堆栈溢出并行更新一个 RT 索引
Stack overflow parallel updating one RT index
是否可以在parallel
中更新一个Real-time Sphinx index
?
澄清一下,我有一个 RT 索引,例如命名为RT1。为了更新RT1,我想要两个甚至更多的更新器。
例如,如果队列中有 100 个文件,我想将 2 个文件并行添加到索引中。 Sphinx 是否支持多线程或 Sphinx 不是线程安全的?
主要问题是,当多个文件同时添加到同一个索引时,Sphinx 是否会损坏自身?我无法在文档中找到答案。
请记住,我 multithread
我的 script
正在向 Sphinx RT-index 添加文件。因此,多个文件将同时(并行)添加到一个索引。
版本:
Sphinx 2.2.9-id64-release (rel22-r5006)
配置:
index_name
{
type = rt
path = /mnt/data001/index_name
rt_field = FileName
rt_field = FileExtension
rt_field = FileContent
rt_field = FileTags
rt_attr_uint = FileReference
rt_attr_uint = FileSize
rt_attr_uint = LastModified
rt_attr_uint = LastModifiedYear
rt_attr_uint = LastModifiedMonth
rt_attr_uint = LastModifiedDay
rt_attr_string = FileContent
rt_mem_limit = 1024M
charset_table = A..Z, a..z, 0..9, U+E1, U+E9, U+FA
ondisk_attrs = pool
}
searchd
{
listen = 9306:mysql41
log = /var/log/sphinxsearch/searchd.log
read_timeout = 5
max_children = 30
pid_file = /var/run/searchd.pid
max_packet_size = 128M
binlog_path = /mnt/data001
}
重要的是要注意字符串只能由A..Z、a..z、0..9、U+E1、U+E9和U+FA组成。 (我已经验证过了)
测试:
为了测试,我在 Ubuntu 上使用 C++ 应用程序通过 MySQL 连接器
与 Sphinx 通信
应该没问题,它不会破坏您的索引,也不应该使守护进程崩溃。
进行了一些测试的相关答案 -
我已经验证了这个问题,请注意!并行更新索引是不可能的!我的索引自身损坏 部分 (索引和守护进程都没有崩溃)。你不会第一眼看到这个问题。我已经通过插入和检查插入的值(通过在插入后直接 select 对其进行验证)验证了这一点,并且返回的值并不总是与插入的值匹配,如下所述。
举例说明。我插入了 test
但我从 select 返回了 t^463t
(在执行插入后立即)。
对于此测试,我插入了分布在 two-threaded
应用程序中的 1.000.000
个文档,其中 43.372
个文档存在上述问题。这当然取决于并行插入文档的确切速率,但是 Sphinx 似乎不是线程安全的。 (假设使用更多线程并行插入文档时会损坏更多文档)
有时我还注意到来自多个文档的单词被连接起来(那些文档是在同一时刻插入的)。
是否可以在parallel
中更新一个Real-time Sphinx index
?
澄清一下,我有一个 RT 索引,例如命名为RT1。为了更新RT1,我想要两个甚至更多的更新器。
例如,如果队列中有 100 个文件,我想将 2 个文件并行添加到索引中。 Sphinx 是否支持多线程或 Sphinx 不是线程安全的?
主要问题是,当多个文件同时添加到同一个索引时,Sphinx 是否会损坏自身?我无法在文档中找到答案。
请记住,我 multithread
我的 script
正在向 Sphinx RT-index 添加文件。因此,多个文件将同时(并行)添加到一个索引。
版本:
Sphinx 2.2.9-id64-release (rel22-r5006)
配置:
index_name
{
type = rt
path = /mnt/data001/index_name
rt_field = FileName
rt_field = FileExtension
rt_field = FileContent
rt_field = FileTags
rt_attr_uint = FileReference
rt_attr_uint = FileSize
rt_attr_uint = LastModified
rt_attr_uint = LastModifiedYear
rt_attr_uint = LastModifiedMonth
rt_attr_uint = LastModifiedDay
rt_attr_string = FileContent
rt_mem_limit = 1024M
charset_table = A..Z, a..z, 0..9, U+E1, U+E9, U+FA
ondisk_attrs = pool
}
searchd
{
listen = 9306:mysql41
log = /var/log/sphinxsearch/searchd.log
read_timeout = 5
max_children = 30
pid_file = /var/run/searchd.pid
max_packet_size = 128M
binlog_path = /mnt/data001
}
重要的是要注意字符串只能由A..Z、a..z、0..9、U+E1、U+E9和U+FA组成。 (我已经验证过了)
测试: 为了测试,我在 Ubuntu 上使用 C++ 应用程序通过 MySQL 连接器
与 Sphinx 通信应该没问题,它不会破坏您的索引,也不应该使守护进程崩溃。
进行了一些测试的相关答案 -
我已经验证了这个问题,请注意!并行更新索引是不可能的!我的索引自身损坏 部分 (索引和守护进程都没有崩溃)。你不会第一眼看到这个问题。我已经通过插入和检查插入的值(通过在插入后直接 select 对其进行验证)验证了这一点,并且返回的值并不总是与插入的值匹配,如下所述。
举例说明。我插入了 test
但我从 select 返回了 t^463t
(在执行插入后立即)。
对于此测试,我插入了分布在 two-threaded
应用程序中的 1.000.000
个文档,其中 43.372
个文档存在上述问题。这当然取决于并行插入文档的确切速率,但是 Sphinx 似乎不是线程安全的。 (假设使用更多线程并行插入文档时会损坏更多文档)
有时我还注意到来自多个文档的单词被连接起来(那些文档是在同一时刻插入的)。