Контроль одновременности изменений
Elasticsearch распределённая система. Когда документы создаются, обновляются или удаляются, новая версия документа должна быть реплицирована на другие узлы кластера. Elasticsearch также асинхронный и многопоточный, что означает, что эти запросы репликации отправляются параллельно и могут прибыть в пункт назначения в произвольном порядке. Elasticsearch нуждается в механизме, гарантирующем, что более старая версия документа никогда не перезапишет более новую версию.
Для предотвращения перезаписи более старой версии более новой, каждой операции с документом первичный фрагмент, координирующий изменение, присваивает порядковый номер. Порядковый номер увеличивается с каждой операцией, и поэтому новые операции гарантированно имеют больший порядковый номер, чем старые. Elasticsearch может использовать порядковый номер операций, чтобы убедиться, что более новая версия документа никогда не перезаписывается изменением, которому присвоен меньший порядковый номер.
Например, следующая команда индексирования создаст документ и присвоит ему начальный порядковый номер и первичный термин:
PUT products/_doc/1567
{
"product" : "r2d2",
"details" : "A resourceful astromech droid"
} Присвоенный порядковый номер и первичный термин можно увидеть в полях _seq_no и _primary_term ответа:
{
"_shards": {
"total": 2,
"failed": 0,
"successful": 1
},
"_index": "products",
"_type": "_doc",
"_id": "1567",
"_version": 1,
"_seq_no": 362,
"_primary_term": 2,
"result": "created"
} Elasticsearch отслеживает порядковый номер и первичный термин последней операции, изменившей каждый хранимый документ. Порядковый номер и первичный термин возвращаются в полях _seq_no и _primary_term ответа API GET:
GET products/_doc/1567
возвращает:
{
"_index": "products",
"_type": "_doc",
"_id": "1567",
"_version": 1,
"_seq_no": 362,
"_primary_term": 2,
"found": true,
"_source": {
"product": "r2d2",
"details": "A resourceful astromech droid"
}
} Примечание: API поиска может вернуть _seq_no и _primary_term для каждого результата поиска, установив параметр seq_no_primary_term.
Порядковый номер и первичный термин уникально идентифицируют изменение. Записав возвращённый порядковый номер и первичный термин, вы можете убедиться, что изменяете документ только в случае, если с момента получения данных не было других изменений. Это делается путём установки параметров if_seq_no и if_primary_term API индексирования, обновления или удаления.
Например, следующий вызов индексирования добавит тег в документ, не потеряв потенциальных изменений в описании или добавления другого тега другим API:
PUT products/_doc/1567?if_seq_no=362&if_primary_term=2
{
"product": "r2d2",
"details": "A resourceful astromech droid",
"tags": [ "droid" ]
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/optimistic-concurrency-control.html