堆栈溢出并行更新一个 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 似乎不是线程安全的。 (假设使用更多线程并行插入文档时会损坏更多文档)

有时我还注意到来自多个文档的单词被连接起来(那些文档是在同一时刻插入的)。