Подтвердить что ты не робот

Согласованность чтения и записи Elasticsearch

У Elasticsearch нет параметра "согласованность чтения" (например, Cassandra). Но у него есть " согласование записи" и " читать предпочтение".

В документации говорится о Write Consistency

Консистенция записи
Чтобы предотвратить запись записей на "неправильной" стороне сетевого раздела, по умолчанию операции индекса работают только при наличии доступных кворумов ( > replicas/2 + 1) активных осколков. Это значение по умолчанию можно переопределить на основе node -by- node, используя параметр action.write_consistency. Чтобы изменить это поведение для каждой операции, можно использовать параметр запроса согласования.

Допустимые значения последовательности записи: одно, кворум и все.

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

Операция индекса возвращается только после того, как все активные осколки в группе репликации проиндексировали документ (синхронизация).

Мой вопрос касается последнего абзаца:

Операция индекса возвращается только после того, как все активные осколки в группе репликации проиндексировали документ (синхронизация).

Если write_consistency=quorum (по умолчанию), и все осколки живут (нет node сбоев, нет сетевого раздела), то:
1) Возвращает ли операция индекса как только кворум осколки закончили индексирование? (хотя все осколки активны/активны)
2) Или возвращается операция индекса, когда все живые/активные осколки закончили индексирование? (т.е. кворум рассматривается только в случае сбоев/тайм-аутов)

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

Кто-нибудь знает, как это работает?

Еще одна вещь, о которой мне интересно - почему значение по умолчанию для параметра preference '(в запросе get/search) есть randomized но не _local (что, должно быть, было более эффективным, я полагаю)

4b9b3361

Ответ 1

Думаю, теперь я могу ответить на свой вопрос:)

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

Операция индекса возвращается, когда все живые/активные осколки завершают индексирование, независимо от параметра последовательности. Параметр согласованности может только предотвратить запуск операции, если недостаточно доступных осколков (узлов).

Так, например, если есть 3 осколка (одна первичная и две реплики), и все осколки доступны - операция будет ждать всех 3 (учитывая, что все 3 доступны в реальном времени/доступны), независимо от параметра последовательности (даже если consistency=one)
Это делает систему согласованной (по крайней мере, частью document-api); если нет сетевого раздела. Но у меня еще не было возможности проверить это.

UPDATE: по согласованности здесь я не имею в виду ACID-согласованность, это просто гарантия того, что все реплики будут обновлены в тот момент, когда будет возвращен запрос.

Относительно второго вопроса: Очевидным ответом является randomized распространение нагрузки; с другой стороны, клиент может выбрать случайный node, чтобы разговаривать, но, вероятно, он не на 100% эффективен, так как для одного запроса может потребоваться несколько осколков.

Ответ 2

Запись: Я не уверен, что выше для IE 6.1 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-wait-for-active-shards говорит, что индексная операция возвращает, если основной осколок активен и может быть изменен на другие значения.

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

Читать: Предпочтение можно использовать, но оно отмечено как устаревшее.