Получить согласованность (и кворум) в ElasticSearch



Я новичок в ElasticSearch и оцениваю его для проекта.



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



При асинхронной записи как мы можем гарантировать, что при выполнении GET данные будут возвращены, даже если они не распространились на все реплики? Потому что когда мы делаем GET в ES, запрос пересылается на одну из реплик соответствующего осколка. При условии, что мы пишем асинхронно, первичный сегмент может иметь документ, но выбранная реплика для выполнения GET может еще не получить/не записать документ. В Cassandra мы можем указать уровни согласованности (один, кворум, все) во время записи, а также чтения. Возможно ли что-то подобное для чтения в ES?

751   2  

2 ответов:

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

Всякий раз, когда вы читаете данные, вы можете указать параметрpreference для управления тем, откуда будут взяты документы. Если вы используете preference:_primary, убедитесь, что вы всегда берете документ из основного фрагмента, в противном случае, если get выполняется до того, как документ будет доступен на всех репликах, может случиться так, что вы нажмете осколок, у которого его еще нет. Учитывая, что get api работает в режиме реального времени, обычно имеет смысл синхронизировать репликацию, чтобы после операции индексирования вы всегда могли получить документ по идентификатору из любого фрагмента, который должен его содержать. Тем не менее, если вы попытаетесь вернуть документ, индексируя его в первый раз, ну, это может случиться, что вы не найдете его.

В elasticsearch также есть параметр согласованности записи, но он отличается от того, как другие хранилища данных работают, и это не связано с тем, является ли репликация синхронизацией или асинхронностью. С помощью параметраconsistence можно управлять количеством копий данных, которые должны быть доступны для допустимой операции записи. Если доступно недостаточно копий данных, операция записи завершится ошибкой (после ожидания до 1 минуты, интервал, который можно изменить с помощью параметра timeout). Это всего лишь предварительная проверка, чтобы решить, принимать операцию или нет. Оно это не означает, что в случае сбоя операции с репликой она будет откатана. Фактически, если операция записи завершается неудачей на реплике, но завершается успешно на основном узле, предполагается, что с репликой что-то не так (или на жестком диске, на котором она выполняется), таким образом, сегмент будет помечен как неудачный и воссоздан на другом узле. Значением по умолчанию для согласованности является quorum, а также может быть установлено значение one или all.

Тем не менее, когда речь заходит о get api, elasticsearch в конечном счете не является последовательным, но как только документ проиндексирован, вы можете его получить.

Тот факт, что вновь добавленные документы недоступны для поиска до следующей операции обновления, которая происходит каждую секунду автоматически по умолчанию, на самом деле не касается конечной согласованности (поскольку документы есть и могут быть получены по id), но больше о том, как работают поиск и lucene и как документы становятся видимыми через lucene.

Вот ответ, который я дал в списке рассылки:

Насколько я понимаю общую картину, когда вы индексируете документ, он записывается в журнал транзакций, а затем вы получаете успешный ответ от ES. Затем, асинхронным способом, он реплицируется на другие узлы и индексируется Lucene. Тем не менее, вы не можете немедленно искать документ, но вы можете получить его. ES прочитает tlog, если это необходимо, когда вы получите документ.

Я думаю (не уверен) что если реплика не обновлена, GET будет отправлен на основной tlog.

Поправьте меня, если я ошибаюсь.

Comments

    Ничего не найдено.