Согласованность чтения и записи 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
(что, должно быть, было более эффективным, я полагаю)
Ответы
Ответ 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 говорит, что индексная операция возвращает, если основной осколок активен и может быть изменен на другие значения.
Искажения являются случайными, поэтому установка ожидающего активного поля осколка ко всем гарантирует, что запись будет успешной, если она будет выполняться на всех осколках.
Читать:
Предпочтение можно использовать, но оно отмечено как устаревшее.