Elasticsearch Reindexing состояние гонки - PullRequest
0 голосов
/ 22 ноября 2018

Здравствуйте, пользователи / экспертыasticasticsearch,

У меня возникли некоторые проблемы с пониманием проблемы состояния гонки с API-интерфейсом Reindex Elasticsearch, и я хотел бы узнать, нашел ли кто-нибудь решение по этому поводу.

Я искал много мест и не смог найти какое-либо ясное решение (большинство решений датируются до переиндексации API).

Как вы, возможно, знаете, (сейчас) стандартный способ переиндексации документа (например, после изменения сопоставления) заключается в использовании псевдонима.Предположим, псевдоним указывает на «old_index».Затем мы создаем новый индекс под названием «new_index» с новым отображением, вызываем api reindex для переиндексации документов из «old_index» в «new_index», а затем переключаем псевдоним на новый_index (и удаляем указатель псевдонима на old_index).Кажется, это стандартный способ переиндексации, и это то, что я видел почти на всех недавних веб-сайтах, которые я посетил.

У меня следующие вопросы по поводу использования этого метода, хотя я бы не хотел простоев (так чтопользователь все еще должен иметь возможность поиска документов), и я все еще хотел бы иметь возможность внедрять документы в ElasticSearch, когда происходит процесс переиндексации:

  1. Если документы все еще будут поступать, пока выполняется процесс переиндексацииработает (что, вероятно, займет много времени), как процесс переиндексации гарантирует, что документ будет загружен в старый индекс (чтобы иметь возможность искать его во время работы процесса переиндексации), но все равно будет правильно переиндексирован вновый индекс?
  2. Если документ изменяется в старом индексе, после того, как он был переиндексирован (сопоставлен с новым индексом), в то время как процесс переиндексации работает, как ElasticSearch гарантирует, что это изменение также будет выполненоаккаунт в новом индексе?
  3. (аналогично 2.) Если запись удаляется в старом индексе, после того, как она была переиндексирована (сопоставлена ​​с новым индексом), пока работает процесс переиндексации, как ElasticSearch обеспечит, чтобы это удаление также учитывалось вновый индекс?

По существу, в случае, когда невозможно допустить ошибку индексации для документа, как можно было бы сделать так, чтобы повторная индексация прошла без каких-либо из перечисленных проблем??

Кто-нибудь есть идеи?И если нет решения без простоев, как бы мы поступили с наименьшим количеством простоев в этом случае?

Заранее спасибо!

1 Ответ

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

Извиняюсь, если это слишком многословно, но мои два цента:

Если документы все еще будут поступать, пока работает процесс переиндексации (что, вероятно, займет много времени), как будет переиндексацияли процесс гарантировать, что документ будет загружен в старый индекс (чтобы иметь возможность искать его во время работы процесса переиндексации), но все равно будет правильно переиндексирован в новый индекс?

Когда переиндексацияпроисходит от источника к месту назначения, псевдоним будет (и должен быть) по-прежнему указывать на source_index.Все изменения / изменения в этом индексе происходят независимо, и эти обновления / удаления должны влиять немедленно.

Допустим, состояние source_index изменяется с t на t+1

Если вы запустили задание переиндексации с t до dest_index, оно все равно будет потреблятьданные снимка source_index при t.Вам нужно снова запустить задание переиндексации, чтобы в вашем dest_index были последние данные source_index, то есть данные t+1.

Поглощения на source_index и прогоны от source_index до destination_index являются независимыми транзакциями / процессами.

Задания переиндексации никогда не будут всегда гарантировать согласованность между source_index и dest_index.

Если документ изменяется в старом индексе, после того, как он был переиндексирован (сопоставлен с новым индексом), в то время как процесс переиндексации работает, как ElasticSearch будет гарантировать, что это изменение также будет учтенов новом индексе?

Он не будет учитываться в новом индексе, поскольку при переиндексации будет использоваться моментальный снимок source_index во время t.

Вам нужно будет снова выполнить переиндексацию.Для этого общего подхода было бы иметь планировщик, который продолжает выполнять процесс переиндексации каждые несколько часов.

Обновления / удаления могут происходить в source_index каждые несколько минут (если вы используете планировщик) или в режиме реального времени (если вы используете какой-либо подход, основанный на событиях).

Однако для полной индексации (от source_index до dest_index) запланируйте ее один раз в день или два раза, поскольку это дорогостоящий процесс.

(аналогично 2.) Если запись удаляется в старом индексе, после того, как она была переиндексирована (сопоставлена ​​с новым индексом), пока работает процесс переиндексации, как ElasticSearch обеспечит, чтобыэто удаление также учитывается в новом индексе?

Опять же, вам нужно запустить новый процесс задания / переиндексации.

Version_type: External

В качестве примечания, одно интересное, что вы можете сделать во время переиндексации, - это использовать version_type:external который будет гарантировать, что только обновленные / отсутствующие документы из source_index будут переиндексированы в dest_index

. Вы можете обратиться к этой ССЫЛКЕ для получения дополнительной информации об этом

POST _reindex
{
  "source": {
    "index": "source_index"
  },
  "dest": {
    "index": "dest_index",
    "version_type": "external"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...