Контроль одновременного доступа (optimistic concurrency control)
Elasticsearch распределённая система. Когда документы создаются, обновляются или удаляются, новая версия документа должна быть реплицирована на другие узлы кластера. Elasticsearch также асинхронный и многопоточный, то есть эти запросы репликации отправляются параллельно и могут прибыть в пункт назначения не в последовательном порядке. Elasticsearch нужен способ обеспечения того, чтобы более старая версия документа никогда не перезаписывала более новую версию.
Чтобы гарантировать, что более старая версия документа не перезаписывает более новую, каждой операции, выполняемой над документом, первичный фрагмент, который координирует это изменение, присваивает порядковый номер. Порядковый номер увеличивается с каждой операцией, и, таким образом, более новым операциям гарантируется больший порядковый номер, чем более старым. Elasticsearch может использовать порядковый номер операций, чтобы убедиться, что более новая версия документа никогда не будет перезаписана изменением, которому присвоен меньший порядковый номер.
Например, следующая команда индексирования создаст документ и присвоит ему начальный порядковый номер и первичный термин:
resp = client.index(
index="products",
id="1567",
document={
"product": "r2d2",
"details": "A resourceful astromech droid"
},
)
print(resp) response = client.index(
index: 'products',
id: 1567,
body: {
product: 'r2d2',
details: 'A resourceful astromech droid'
}
)
puts response const response = await client.index({
index: "products",
id: 1567,
document: {
product: "r2d2",
details: "A resourceful astromech droid",
},
});
console.log(response); PUT products/_doc/1567
{
"product" : "r2d2",
"details" : "A resourceful astromech droid"
} Присвоенный порядковый номер и первичный термин можно увидеть в полях _seq_no и _primary_term ответа:
{
"_shards": {
"total": 2,
"failed": 0,
"successful": 1
},
"_index": "products",
"_id": "1567",
"_version": 1,
"_seq_no": 362,
"_primary_term": 2,
"result": "created"
} Elasticsearch отслеживает порядковый номер и первичный термин последней операции, изменившей каждый хранимый документ. Порядковый номер и первичный термин возвращаются в полях _seq_no и _primary_term в ответе API GET API:
resp = client.get(
index="products",
id="1567",
)
print(resp) response = client.get( index: 'products', id: 1567 ) puts response
const response = await client.get({
index: "products",
id: 1567,
});
console.log(response); GET products/_doc/1567
возвращает:
{
"_index": "products",
"_id": "1567",
"_version": 1,
"_seq_no": 362,
"_primary_term": 2,
"found": true,
"_source": {
"product": "r2d2",
"details": "A resourceful astromech droid"
}
} Примечание: API Search API может возвращать значения _seq_no и _primary_term для каждого результата поиска, установив параметр seq_no_primary_term.
Порядковый номер и первичный термин однозначно идентифицируют изменение. Записав возвращённый порядковый номер и первичный термин, можно убедиться, что документ изменяется только в том случае, если с момента его получения не было других изменений. Это делается путём установки параметров if_seq_no и if_primary_term в API index API, update API или delete API.
Например, следующий вызов индексирования добавит тег к документу, не потеряв возможные изменения в описании или добавления другого тега другим API:
resp = client.index(
index="products",
id="1567",
if_seq_no="362",
if_primary_term="2",
document={
"product": "r2d2",
"details": "A resourceful astromech droid",
"tags": [
"droid"
]
},
)
print(resp) const response = await client.index({
index: "products",
id: 1567,
if_seq_no: 362,
if_primary_term: 2,
document: {
product: "r2d2",
details: "A resourceful astromech droid",
tags: ["droid"],
},
});
console.log(response); 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/8.17/optimistic-concurrency-control.html