Переполнение стека параллельное обновление одного индекса RT - PullRequest
0 голосов
/ 31 октября 2018

Можно ли обновить один Real-time Sphinx index в parallel?

Чтобы уточнить, у меня есть один индекс RT, например, с именем. RT1. Чтобы обновить RT1, я хочу иметь два или даже больше средств обновления.

Например, если в очереди 100 файлов, я хочу добавить 2 файла параллельно с индексом. Может ли Sphinx поддерживать многопоточность или Sphinx не безопасен для потоков?

Основной вопрос заключается в том, будет ли Sphinx повреждаться при одновременном добавлении нескольких файлов в один и тот же индекс? Я не смог найти ответ в документации.

Хорошо иметь в виду, я multithread мой script, который добавляет файлы в RT-индекс Sphinx. Поэтому несколько файлов будут добавлены одновременно (параллельно) к одному индексу.

Версия

Sphinx 2.2.9-id64-release (rel22-r5006)

Config:

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. (Я это подтвердил)

Тест: для теста я использовал приложение C ++ в Ubuntu, которое связывается со Sphinx через коннекторы MySQL

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Я подтвердил эту проблему и буду предупрежден! Параллельное обновление индекса невозможно! Мой индекс поврежден частично (и индекс, и демон не аварийно завершали работу). Вы не увидите эту проблему на первый взгляд. Я проверил это, вставив и проверив вставленное значение (путем непосредственного выбора его после вставки), и возвращаемое значение не всегда соответствует вставленному значению, как показано ниже.

В качестве примера для уточнения. Я вставил test, но вернул t^463t из выбора (сразу после выполнения вставки).

Для этого теста я вставил 1.000.000 документов, распределенных по приложению two-threaded, в котором 43.372 документах была описана эта проблема, описанная выше. Это, конечно, зависит от точной скорости параллельных вставленных документов, но Sphinx не выглядит потокобезопасным . (предполагается, что еще больше документов будет повреждено при использовании большего количества потоков для параллельной вставки документов)

Иногда я также замечал, что слова из нескольких документов были объединены (эти документы были вставлены в один и тот же момент).

0 голосов
/ 01 ноября 2018

Все должно быть хорошо, это не повредит ваш индекс и не должно вызвать сбой демона. Соответствующий ответ с некоторыми сделанными тестами - https://stackoverflow.com/a/52961820/591867

...