ElasticSearch - 충돌 처리
10974 단어 elasticsearch
index
API를 사용하여 문서를 업데이트할 때 원본 문서를 한 번에 읽고 전체 문서를 다시 인덱스할 수 있습니다. 최근의 인덱스 요청이 승리합니다. 마지막 문서가 인덱스되더라도 ElasticSearch에 유일하게 저장됩니다.만약 다른 사람이 이 문서를 동시에 변경한다면, 그들의 변경은 잃어버릴 것이다.이것은 문제가 없을 때가 많다. 아마도 우리의 주 데이터 저장은 관계형 데이터베이스일 것이다. 우리는 그것을 Elastic Search에 복사해서 검색할 수 있게 할 뿐이다. 아마도 두 사람이 같은 문서를 동시에 변경할 확률이 매우 적거나 우리의 업무에 있어서 간혹 변경을 잃어버리는 것도 큰 문제가 아니지만 때로는 변경을 잃어버리는 것이 매우 심각하다.
데이터베이스 영역에서 일반적으로 두 가지 방법은 동시 업데이트를 할 때 업데이트가 손실되지 않도록 하는 데 사용된다.
낙관적 병발 제어
ElasticSearch는 분산되어 있습니다.문서를 만들거나 업데이트하거나 삭제할 때, 새 버전의 문서는 그룹의 다른 노드로 복사해야 합니다.ElasticSearch도 비동기적이고 병발적이다. 이것은 이러한 복제 요청이 병렬적으로 발송되고 목적을 달성할 때 순서가 혼란스러울 수도 있다는 것을 의미한다.ElasticSearch는 문서의 이전 버전이 새 버전을 덮어쓰지 않도록 하는 방법이 필요합니다.
우리가 이전에 소개한
GET
, DELETE
요청을 할 때, 우리가 출력한 모든 문서에는 _version
버전 번호가 있고, 문서가 수정될 때 버전 번호가 점차 증가한다.ElasticSearch는 이 _version
를 사용하여 변경이 정확한 순서로 실행될 수 있도록 합니다.이전 버전의 문서가 새 버전 이후에 도착하면 간단하게 무시할 수 있습니다.우리는 응용 프로그램에서 서로 충돌하는 변경이 데이터의 분실을 초래하지 않도록
_version
를 사용할 수 있다.우리는 문서를 수정할 _version
을 지정함으로써 이 목적을 달성한다.이 버전이 현재 버전 번호가 아니라면 요청이 실패합니다다음은 한 걸음 한 걸음 간단한 조작을 통해 설명할 것이다.
curl -XPUT "http://localhost:9200/csdn/blog/1" -d '
{
"title":"test"
"desc":" "
}
'
이 때 응답체가 우리에게 알려준다
_version
는 1curl -XPUT "http://localhost:9200/csdn/blog/1?version=1"
이 때 응답체가 우리에게
_version
가 이미 2로 점차적으로 증가했다는 것을 알려줄 것이다_version
는 이미 2{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[blog][1]: version conflict, current version [2] is different than the one provided [1]",
"index_uuid": "3t42ZzdSRoO8RPkL0jDYbg",
"shard": "3",
"index": "csdn"
}
],
"type": "version_conflict_engine_exception",
"reason": "[blog][1]: version conflict, current version [2] is different than the one provided [1]",
"index_uuid": "3t42ZzdSRoO8RPkL0jDYbg",
"shard": "3",
"index": "csdn"
},
"status": 409
}
모든 문서의 업데이트나 API 삭제는
version
파라미터를 받아들일 수 있습니다. 이것은 코드에서 낙관적인 병행 제어를 사용할 수 있도록 하는 현명한 방법입니다.외부 시스템에서 버전 제어 사용
흔히 볼 수 있는 설정은 다른 데이터베이스를 주요 데이터로 저장하고 ElasticSearch를 사용하여 데이터 검색을 하는 것이다. 이것은 주 데이터베이스의 모든 변경 사항이 ElasticSearch로 업데이트되어야 한다는 것을 의미한다. 만약에 여러 프로세스가 같은 데이터를 동시에 변경한다면 이전에 설명한 것과 유사한 병행 문제를 만날 수 있다.
ElasticSearch에서 검색 문자열을 추가하는 방식으로 같은 버전 번호를 다시 사용할 수 있습니다. 버전 번호는 0보다 큰 정수이고
version_type=external
자바에서 long 형식의 정수보다 작아야 합니다.외부 버전 번호 처리 방식은 우리가 이전에 논의한 내부 버전 번호와 약간 다르다. ElasticSearch는 현재
9.2E+18
와 요청에서 지정한 버전 번호가 같은지 확인하는 것이 아니라 현재 _version
가 지정한 버전 번호보다 작은지 검사하는 것이다.요청이 성공하면 외부 버전 번호가 문서의 새 _version
로 저장됩니다.다음은 한 걸음 한 걸음 간단한 조작을 통해 설명할 것이다.
curl -XPUT "http://localhost:9200/csdn/blog/1?version=1&version_type=external" -d '
{
"title":"test"
"desc":" "
}
'
다음과 같은 데이터가 제공됩니다.
{
"_index" : "csdn",
"_type" : "blog",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : true
}
curl -XPUT "http://localhost:9200/csdn/blog/1?version=2&version_type=external" -d '
{
"title":"test1"
"desc":" 1"
}
'
다음과 같은 데이터가 제공됩니다.
{
"_index" : "csdn",
"_type" : "blog",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : false
}
_version
{
"error" : {
"root_cause" : [
{
"type" : "version_conflict_engine_exception",
"reason" : "[blog][1]: version conflict, current version [2] is higher or equal to the one provided [2]",
"index_uuid" : "3t42ZzdSRoO8RPkL0jDYbg",
"shard" : "3",
"index" : "csdn"
}
],
"type" : "version_conflict_engine_exception",
"reason" : "[blog][1]: version conflict, current version [2] is higher or equal to the one provided [2]",
"index_uuid" : "3t42ZzdSRoO8RPkL0jDYbg",
"shard" : "3",
"index" : "csdn"
},
"status" : 409
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kafka connect e elasticsearch를 관찰할 수 있습니다.No menu lateral do dashboard tem a opção de connectors onde ele mostra todos os clusters do kafka connect conectados atu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.