堆栈溢出并行更新一个RT索引

时间:2018-10-31 08:43:03

标签: multithreading sphinx

是否可以在Real-time Sphinx index中更新 一个 parallel

为了澄清,我有一个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进行了通信

2 个答案:

答案 0 :(得分:0)

应该没问题,它不会破坏您的索引,也不应使守护程序崩溃。 与一些测试相关的答案-https://stackoverflow.com/a/52961820/591867

答案 1 :(得分:0)

我已经验证了此问题,并被警告!不能并行更新索引!我的索引自身部分损坏(索引和守护程序都没有崩溃)。您不会一眼看到此问题。我已经通过插入并检查插入的值(通过在插入后直接选择它)来验证了这一点,并且返回的值并不总是与插入的值匹配,如下所述。

作为说明示例。我插入了test,但从选择中又回到了t^463t(执行插入操作之后)。

对于此测试,我插入了1.000.000个文档,这些文档散布在two-threaded个应用程序中,其中43.372个文档具有上述问题。当然,这取决于并行插入文档的确切比率,但是 Sphinx似乎不是线程安全的 。 (假设使用更多线程并行插入文档时,甚至会有更多文档损坏)

有时我还注意到,来自多个文档的单词是串联在一起的(那些文档恰好在同一时刻插入)。