Это отличный вопрос распределенной системы. Позвольте мне разбить проблему на части для удобства чтения и еще до того, как объяснить, что такое _seq_no
и _primary_term
, поскольку на сайте ES нет особых объяснений.
_seq_no
- это инкрементный счетчик, который присваивается документу ES для каждой операции (обновление, удаление, индекс), например: - при первом индексировании операции do c он будет иметь значение 1, у следующего обновления будет 2, затем Операция удаления будет иметь три и так далее. Операция чтения не обновляет его. _primary_term
также является инкрементным счетчиком, но изменяется только в том случае, если осколок реплики выдвигается в качестве основного, из-за сети или любого другого сбоя, поэтому, если все отлично в в вашем кластере он не будет изменен, но в случае какого-либо сбоя и другой реплики, переведенной в первичную, она будет увеличена.
Переходя к первому вопросу,
Q: - Что происходит с документом в случае по умолчанию, когда я не отправляю значения _seq_no и _primary_term?
Ответ: - вы можете потерять проблему с обновлением, предположим, у вас есть счетчик, который вы обновляются, одновременно 2 запроса считывают значение счетчика до 1 и пытаются увеличить его на 1. Теперь, когда вы не указываете вышеприведенные термины явно, это вычисляется ES. Теперь оба запроса достигают одновременно ES, тогда ES (основной шард) будет обрабатывать их один за другим, увеличивая порядковый номер, поэтому в конце ваш счетчик будет иметь значение 2, а не 3., чтобы убедиться, что это не так. случается, вы передаете эти значения терминов явно, и когда ES попытается обновить их, они увидят другой порядковый номер и отклонят ваш запрос. Чтобы предотвратить такие потерянные обновления, в случаях использования рекомендуется всегда указывать явный номер версии.
В: - Я пытаюсь выяснить, нужно ли мне отправлять эти значения, чтобы получить возможную согласованность или если Я получаю это бесплатно без отправки этих значений. .
Ответ: - Они связаны с контролем параллелизма и не имеют ничего общего с возможной последовательностью. В ES запись всегда происходит с первичными осколками, но чтение может происходить с любыми репликами (могут содержать устаревшие данные), что делает ES в конечном итоге непротиворечивым.
Важное чтение
https://www.elastic.co/blog/elasticsearch-sequence-ids-6-0