elasticsearch 버전 제어
8459 단어 elasticsearch
1. 기반_버전 낙관적 자물쇠 병렬 제어
일단 데이터를 만들어볼게요.
PUT /test_index/test_type/1
{
"test_field": "test test"
}
두 클라이언트를 시뮬레이션하여 모두 같은 데이터를 얻었다
GET test_index/test_type/1
그 중의 한 클라이언트는 먼저 이 데이터를 업데이트하고 데이터의 버전 번호를 가지고 있어es의 데이터의 버전 번호가 클라이언트의 데이터의 버전 번호와 같아야 수정할 수 있다.
PUT /test_index/test_type/1?version=1
{
"test_field": "test client 1"
}
또 다른 클라이언트는version=1의 데이터를 바탕으로 수정을 시도하고version 버전 번호를 가지고 낙관적인 자물쇠의 병행 제어를 한다.
PUT /test_index/test_type/1?version=1
{
"test_field": "test client 2"
}
오류 메시지가 반환됩니다.
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[test_type][1]: version conflict, current version [2] is different than the one provided [1]",
"index_uuid": "ys-Y1QWrRmWTK2JSGuXgww",
"shard": "3",
"index": "test_index"
}
],
"type": "version_conflict_engine_exception",
"reason": "[test_type][1]: version conflict, current version [2] is different than the one provided [1]",
"index_uuid": "ys-Y1QWrRmWTK2JSGuXgww",
"shard": "3",
"index": "test_index"
},
"status": 409
}
최신 데이터와 버전 번호를 바탕으로 수정을 하고 수정한 후에 최신 버전 번호를 가져가면 이 절차는 여러 번 반복해서 실행해야 성공할 수 있다. 특히 다중 스레드가 같은 데이터를 동시에 업데이트하는 것이 빈번한 상황에서.
version=2로 가져오면 됩니다.
PUT /test_index/test_type/1?version=1
{
"test_field": "test client 2"
}
둘째, externalversion을 바탕으로 낙관적인 자물쇠 병렬 제어를 한다
es는 피처링을 제공합니다. 즉, 내부
_version
버전 번호를 사용하지 않고 병렬 제어를 할 수 있으며, 자신이 관리하는 버전 번호를 바탕으로 병렬 제어를 할 수 있습니다.열을 들어 당신의 데이터를 mysql에 추가한 다음에 당신의 응용 시스템 자체가 버전 번호를 유지합니다. 어떤 것이든 프로그램이 제어합니다.이럴 때, 당신이 낙관적인 자물쇠를 잠그고 제어를 할 때, 아마도 es 내부의_version으로 제어하는 것이 아니라, 당신이 관리하는 그 version으로 제어합니다.?version=1
?version=1&version_type=external
version_type=external,
의 유일한 차이점은 _version
, 당신이 제공한 버전이 es의 _version
와 똑같을 때만 수정할 수 있고 다르면 오류를 보고할 수 있다는 것이다.version_type=external
일 때, 당신이 제공한 버전이 es의 _version
보다 클 때만 수정을 완성할 수 있습니다먼저 데이터를 하나 구성하다
PUT /test_index/test_type/2
{
"test_field": "test"
}
두 클라이언트가 동시에 이 데이터를 조회하는 것을 시뮬레이션하다
GET /test_index/test_type/2
첫 번째 클라이언트가 먼저 수정을 진행합니다. 이때 클라이언트 프로그램은 자신의 데이터베이스에서 이 데이터의 최신 버전 번호를 얻었습니다. 예를 들어 2입니다.
PUT /test_index/test_type/2?version=2&version_type=external
{
"test_field": "test client 1"
}
두 번째 클라이언트를 시뮬레이션하여 자신의 데이터베이스에서 유지보수하는 버전 번호도 2를 얻었고version=2를 바탕으로 수정을 하면 실패한다
PUT /test_index/test_type/2?version=2&version_type=external
{
"test_field": "test client 2"
}
오류 정보:
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[test_type][2]: version conflict, current version [2] is higher or equal to the one provided [2]",
"index_uuid": "ys-Y1QWrRmWTK2JSGuXgww",
"shard": "2",
"index": "test_index"
}
],
"type": "version_conflict_engine_exception",
"reason": "[test_type][2]: version conflict, current version [2] is higher or equal to the one provided [2]",
"index_uuid": "ys-Y1QWrRmWTK2JSGuXgww",
"shard": "2",
"index": "test_index"
},
"status": 409
}
동시 제어에 성공한 후, 최신 버전 번호를 기반으로 다시 업데이트를 시작해야 성공할 수 있다
PUT /test_index/test_type/2?version=3&version_type=external
{
"test_field": "test client 2"
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.