복합 객체 및 동시 업로드

동시 업로드와 제한된 추가/편집 기능을 지원하기 위해 Cloud Storage는 객체 데이터를 추가로 전송하지 않고도 기존 객체를 최대 32개까지 하나의 새 객체로 작성하는 기능을 제공합니다.

작성 작업

작성 작업에서는 최대 32개의 소스 객체를 지정된 순서로 연결하여 새 객체를 만듭니다. 모든 소스 객체는 저장소 등급이 동일해야 하고 같은 버킷에 저장되어 있어야 합니다. 소스 객체 자체가 복합 객체일 수도 있습니다.

소스 객체는 작성 프로세스의 영향을 받지 않으며, 소스 객체가 교체되거나 삭제되어도 결과 복합 객체는 변경되지 않습니다.

구성요소 수 속성

각 객체는 객체를 만드는 데 사용된, 원래 업로드된 객체 수를 지정하는 구성요소 수 속성을 유지합니다. 일련의 객체를 사용하여 작성되는 객체의 구성요소 수 속성은 시퀀스에 포함된 각 복합 객체의 구성요소 수 합계에 시퀀스에 포함된 비복합 객체마다 1을 더한 것과 같습니다. 예를 들어, 작성 작업을 수행할 때 처음 2개의 구성요소는 비복합 객체이고 3번째 구성요소는 구성요소 수가 12인 복합 객체라면 작성 작업의 총 구성요소 수는 14입니다.

복합 객체 하나가 포함할 수 있는 구성요소 수에는 제한이 없지만, 객체의 componentCount 메타데이터 속성은 2,147,483,647에 이르면 포화 상태가 됩니다. 예를 들어 객체에 포함된 구성요소가 3,000,000,000개인 경우 객체의 componentCount 값은 2,147,483,647입니다.

복합 객체 무결성 검사

Cloud Storage는 업로드 시 각 구성요소 객체의 무결성을 검사하고 다운로드 시 호출자가 결과로 만들어지는 복합 객체의 무결성 검사를 수행할 수 있도록 CRC32C를 사용합니다. CRC32C는 해당 구성요소의 CRC32C 값에서 효율적으로 계산할 수 있는 오류 감지 코드입니다. 애플리케이션에서 다음과 같이 CRC32C를 사용해야 합니다.

  • 구성요소 객체를 업로드할 때 아래 나열된 것과 같은 CRC32C 라이브러리를 사용하여 각 객체의 CRC32C를 계산하고 요청에 해당 값을 포함해야 합니다.
  • 작성 작업의 경우 요청에 CRC32C를 포함해야 합니다. Cloud Storage는 복합 객체의 CRC32C로 응답합니다. Cloud Storage는 복합 객체의 MD5 값을 계산하지 않습니다.
  • 다운로드할 때는 다운로드한 객체의 CRC32C를 계산하여 응답에 포함된 값과 비교해야 합니다.
  • 업로드 시점과 작성 시점 사이에 애플리케이션에서 구성요소 객체를 변경할 가능성이 있는 경우 경합 상태가 발생하지 않도록 소스 객체에 세대별 이름을 지정해야 합니다.

CRC32C 값을 계산하는 라이브러리에는 C++용 Boost, 자바용 GoogleCloudPlatform crc32c, Python용 crcmod, Ruby용 digest-crc가 포함되어 있습니다. 또한 CRC32C는 최신 Intel CPU의 하드웨어에서 지원됩니다.

과거에는 MD5를 사용하여 ETag 값을 생성했습니다. 복합 객체의 경우에는 그렇지 않습니다. HTTP/1.1의 IETF 사양에 따라 기본 객체가 변경될 때마다 복합 객체 ETag가 변경된다는 점을 제외하고는 클라이언트 코드에서 복합 객체 ETag에 대해 가정하지 않아야 합니다.

동시 업로드

객체 작성을 사용하여 객체를 동시에 업로드할 수 있습니다. 데이터를 여러 청크로 나누고, 각 청크를 개별 객체에 동시에 업로드하고, 최종 객체를 작성하고, 임시 객체를 삭제하면 됩니다.

업로드 요청과 작성 요청 사이에 구성요소 객체가 변경되지 않게 하려면 사용자가 각 구성요소에 대해 예상되는 세대 번호를 제공해야 합니다. 객체 세대에 대한 자세한 내용은 세대 및 사전 조건을 참조하세요.

제한된 추가 및 편집

작성 작업을 사용하여 제한된 객체 추가 및 편집을 수행할 수도 있습니다.

추가는 새 임시 객체에 데이터를 업로드하고, 이 새 데이터와 함께 추가하려는 객체를 작성하고, 선택적으로 작성 작업 출력의 이름을 원본 객체와 동일하게 지정하고, 임시 객체를 삭제하는 방식으로 수행됩니다.

작성을 사용하여 기본적인 객체 편집을 지원할 수도 있습니다. 예를 들어 {Y1, Y2, Y3} 시퀀스로 객체 X를 작성하는 경우 Y2의 콘텐츠를 바꾼 후 동일한 구성요소로 X를 다시 작성할 수 있습니다. 이를 위해서는 Y1, Y2, Y3이 삭제되지 않은 상태로 유지되어야 하므로 복합물뿐만 아니라 해당 구성요소에 대해서도 요금이 청구됩니다.

gsutil로 객체 작성 수행

gsutil은 compose 명령어를 사용한 객체 작성을 지원합니다. 자세한 내용을 보려면 다음을 실행하여 기본 제공 설명서를 참조하세요.

gsutil help compose

예를 들어 객체 3개(component-obj-1, component-obj-2, component-obj-3)를 하나의 객체(composite-object)로 작성하려면 다음 명령어를 사용합니다.

gsutil compose gs://example-bucket/component-obj-1 gs://example-bucket/component-obj-2 gs://example-bucket/component-obj-3 gs://example-bucket/composite-object

또는 작성 대상 객체에만 component-obj- 프리픽스가 있는 경우 다음 예와 같이 compose 명령어에 와일드 카드를 사용할 수도 있습니다.

gsutil compose gs://example-bucket/component-obj-* gs://example-bucket/composite-object

작성 작업 후 다음 명령어로 구성요소 수를 확인할 수 있습니다.

gsutil stat gs://example-bucket/composite-object

이 예에서 구성요소 수는 3개입니다.

다음 두 명령어는 composite-objectnew-object에 복사했다가 원래 이름을 사용하도록 new-object로 다시 이동합니다. 두 명령어 모두 cp 명령어의 -p 옵션을 사용하므로 gsutil이 객체 ACL을 보존합니다.

gsutil cp -D -p gs://example-bucket/composite-object gs://example-bucket/new-object
gsutil mv -p gs://example-bucket/new-object gs://example-bucket/composite-object

XML API로 객체 작성 수행

XML API를 사용할 경우 compose 쿼리 매개변수와 함께 PUT 객체 요청을 실행하고 아래 예와 같이 구성요소 객체 이름이 순서대로 나열된 XML 본문을 포함하여 객체를 작성합니다.

PUT /example-bucket/composite-object?compose HTTP/1.1
Host: storage.googleapis.com
Content-Length: 153
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

<ComposeRequest>
  <Component>
    <Name>component-obj-1</Name>
  </Component>
  <Component>
    <Name>component-obj-2</Name>
    <Generation>1361471441094000</Generation>
  </Component>
  <Component>
    <Name>component-obj-3</Name>
    <IfGenerationMatch>1361471441094000</IfGenerationMatch>
  </Component>
</ComposeRequest>

앞에서 설명한 바와 같이 소스 및 대상 객체는 모두 동일한 버킷에 속해야 하므로 구성요소 객체에 버킷이 지정되지 않습니다.

위의 예제 요청에서도 component-obj-2의 세대 번호를 지정하므로 해당 세대가 더 이상 최신이 아니더라도 객체의 1361471441094000세대가 작성됩니다.

세 번째 구성요소에는 IfGenerationMatch 요청 요소를 사용하여 조건부 세대가 제공되었습니다. 지정된 세대 번호가 구성요소의 현재 세대를 나타내지 않으면 요청이 실패합니다.

위의 객체 작성 요청에 대한 응답은 다음과 같습니다.

Server: HTTP Upload Server Built on Mar 6 2013 16:24:27 (1362615867)
ETag: "-CKicn4fknbUCEAE="
x-goog-generation: 1362768951202000
x-goog-metageneration: 1
x-goog-hash: crc32c=fbWtZQ==
x-goog-component-count: 3
Vary: Origin
Date: Fri, 08 Mar 2013 18:55:51 GMT
Pragma: no-cache
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 0
Content-Type: text/html; charset=UTF-8

x-goog-hash 헤더는 객체의 CRC32C 값을 보고합니다. 이 값은 객체가 작성된 CRC32C 값에서 CRC32C 값을 생성하여 유효성을 검사할 수 있습니다.

새 복합 객체의 구성요소 수는 x-goog-component-count 응답 헤더의 값입니다.

JSON API로 객체 작성 수행하기

JSON API를 사용할 경우 아래 예와 같이 구성요소 객체 이름이 순서대로 나열된 JSON 본문과 함께 compose 요청을 실행하여 객체를 작성합니다.

POST /storage/v1/b/example-bucket/o/composite-object/compose
Host: www.googleapis.com
Content-Length: 216
Content-Type: application/json
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

{
  "sourceObjects": [
    {
      "name": "component-obj-1"
    },
    { "name": "component-obj-2"
    },
    { "name": "component-obj-3"
    }
  ],
  "destination": {
   "contentType": "application/octet-stream"
 }
}

위의 객체 작성 요청 응답에는 구성요소 수를 포함한 객체 리소스가 포함됩니다.

{
 "kind": "storage#object",
 "id": "bucket/composite-object/1388778813188000",
 "selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/o/composite-object",
 "name": "composite-object",
 "bucket": "bucket",
 "generation": "1388778813188000",
 "metageneration": "1",
 "contentType": "application/octet-stream",
 "updated": "2014-01-03T19:53:33.188Z",
 "size": "524052",
 "mediaLink": "https://www.googleapis.com/download/storage/v1/b/example-bucket/o/composite-object?generation=1388778813188000&alt=media",
 "crc32c": "V9kcXg==",
 "componentCount": 3,
 "etag": "CKDP057k4rsCEAE="
}

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.