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보다 클 때만 수정을 완성할 수 있습니다
  • es,_version=1,?version=1, 업데이트 성공
  • es,_version=1,?version>1&version_type=external, 성공, 예를 들면?version=2&version_type=external

  • 먼저 데이터를 하나 구성하다
    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"
    }

    좋은 웹페이지 즐겨찾기