Azure Blob Storage의 변경 피드 지원

변경 피드는 스토리지 계정의 Blob 및 Blob 메타데이터에 발생하는 모든 변경 내용에 대한 트랜잭션 로그를 제공하기 위한 것입니다. 변경 피드는 이러한 변경 내용에 대해 순서가 지정되고, 보장되며, 내구성이 있고, 변경할 수 없는, 읽기 전용 로그를 제공합니다. 클라이언트 애플리케이션은 언제든지 이러한 로그를 스트리밍 또는 일괄 처리 모드에서 읽을 수 있습니다. 각 변경은 정확히 하나의 트랜잭션 로그 항목을 생성하므로 동일한 변경에 대해 여러 로그 항목을 관리할 필요가 없습니다. 변경 피드를 사용하면 Blob Storage 계정에서 발생하는 변경 이벤트를 저렴한 비용으로 처리하는 효율적이고 확장 가능한 솔루션을 빌드할 수 있습니다.

변경 피드에서 레코드를 처리하는 방법을 알아보려면 Azure Blob Storage에서 변경 피드 처리를 참조하세요.

변경 피드의 작동 방식

변경 피드 레코드는 표준 Blob 가격 책정 비용으로 스토리지 계정의 특수 컨테이너에 blobs로 저장됩니다. 요구 사항에 따라 이러한 파일의 보존 기간을 제어할 수 있습니다(현재 릴리스의 조건 참조). 변경 이벤트는 Apache Avro 형식 사양의 레코드로 변경 피드에 추가됩니다. 이 형식은 인라인 스키마를 사용하여 풍부한 데이터 구조를 제공하는 간단하고 빠른 이진 형식입니다. 이 형식은 Hadoop 에코시스템, Stream Analytics 및 Azure Data Factory에서 널리 사용됩니다.

이러한 로그는 비동기, 증분 또는 전체 방식으로 처리할 수 있습니다. 많은 클라이언트 애플리케이션에서 자체의 고유한 속도로 변경 피드를 독립적으로 병렬로 읽을 수 있습니다. Apache Drill 또는 Apache Spark와 같은 분석 애플리케이션은 로그를 Avro 파일로 직접 사용할 수 있으므로 사용자 지정 애플리케이션을 작성하지 않고도 높은 대역폭을 사용하여 저렴한 비용으로 로그를 처리할 수 있습니다.

다음 다이어그램에서는 레코드를 변경 피드에 추가하는 방법을 보여 줍니다.

Diagram showing how the change feed works to provide an ordered log of changes to blobs

변경 피드 지원은 변경된 개체를 기반으로 하여 데이터를 처리하는 시나리오에 적합합니다. 예를 들어 애플리케이션에서 다음을 수행할 수 있습니다.

  • 보조 인덱스를 업데이트하고, 캐시, 검색 엔진 또는 기타 콘텐츠 관리 시나리오와 동기화합니다.
  • 스트리밍 방식 또는 일괄 처리 모드로 개체에 발생하는 변경 내용을 기반으로 비즈니스 분석 정보와 메트릭을 추출합니다.
  • 엔터프라이즈 데이터 관리를 위한 보안, 규정 준수 또는 인텔리전스를 위해 일정 기간 동안 개체에 대한 변경 내용을 저장, 감사, 분석합니다.
  • 재해 관리 또는 규정 준수를 위해 계정에서 개체 상태를 백업, 미러링 또는 복제하는 솔루션을 빌드합니다.
  • 변경 이벤트에 대응하거나 만들어지거나 변경된 개체를 기반으로 하여 실행을 예약하는 연결된 애플리케이션 파이프라인을 빌드합니다.

변경 피드는 블록 Blob에 대한 개체 복제특정 시점 복원에 대한 필수 기능입니다.

참고 항목

변경 피드는 Blob에 발생하는 변경 내용에 대한 지속적이고 순서가 지정된 로그 모델을 제공합니다. 변경 내용은 변경 후 몇 분 내에 변경 피드 로그에 기록되고 사용할 수 있습니다. 애플리케이션에서 이보다 훨씬 더 빠르게 이벤트에 대응해야 하는 경우 Blob Storage 이벤트를 대신 사용하는 것이 좋습니다. Blob Storage 이벤트는 Azure Functions 또는 애플리케이션에서 Blob에 발생하는 변경에 빠르게 대응할 수 있도록 하는 실시간 일회성 이벤트를 제공합니다.

변경 피드를 활성화 또는 비활성화

변경 내용 캡처 및 기록을 시작하려면 스토리지 계정에서 변경 피드를 사용하도록 설정해야 합니다. 변경 내용 캡처를 중지하려면 변경 피드를 사용하지 않도록 설정합니다. 포털 또는 PowerShell에서 Azure Resource Manager 템플릿을 사용하여 변경 내용을 사용하거나 사용하지 않도록 설정할 수 있습니다.

변경 피드를 사용하도록 설정하는 경우 주의해야 할 몇 가지 사항은 다음과 같습니다.

  • 각 스토리지 계정에는 Blob 서비스에 대한 변경 피드가 하나만 있습니다. 변경 피드 레코드는 $blobchangefeed 컨테이너에 저장됩니다.

  • 변경 내용 만들기, 업데이트 및 삭제는 Blob 서비스 수준에서만 캡처됩니다.

  • 변경 피드는 계정에서 발생하는 모든 사용 가능한 이벤트에 대한 모든 변경 내용을 캡처합니다. 클라이언트 애플리케이션은 필요에 따라 이벤트 유형을 필터링할 수 있습니다. (현재 릴리스의 조건을 참조하세요.)

  • 표준 일반용 v2, 프리미엄 블록 Blob 및 Blob 스토리지 계정만 변경 피드를 활성화할 수 있습니다. 계층 구조 네임스페이스가 활성화된 계정은 현재 지원되지 않습니다. 범용 v1 스토리지 계정은 지원되지 않지만 가동 중지 시간 없이 범용 v2로 업그레이드할 수 있습니다. 자세한 내용은 GPv2 스토리지 계정으로 업그레이드를 참조하세요.

Azure Portal을 사용하여 스토리지 계정에서 변경 피드를 사용하도록 설정합니다.

  1. Azure Portal에서 스토리지 계정을 선택합니다.

  2. 데이터 관리에서 데이터 보호 옵션으로 이동합니다.

  3. 추적에서 Blob 변경 피드 사용을 선택합니다.

  4. 저장 단추를 선택하여 데이터 보호 설정을 확인합니다.

    Screenshot showing how to enable change feed in Azure portal

변경 피드 사용

변경 피드는 여러 메타데이터 및 로그 파일을 생성합니다. 이러한 파일은 스토리지 계정의 $blobchangefeed 컨테이너에 있습니다. $blobchangefeed 컨테이너는 Azure Portal 또는 Azure Storage Explorer를 통해 볼 수 있습니다.

클라이언트 애플리케이션은 변경 피드 프로세서 SDK와 함께 제공되는 Blob 변경 피드 프로세서 라이브러리를 사용하여 변경 피드를 사용할 수 있습니다. 변경 피드에서 레코드를 처리하는 방법을 알아보려면 Azure Blob Storage에서 변경 피드 로그 처리를 참조하세요.

피드 세그먼트 변경

변경 피드는 시간별세그먼트로 구성되지만, 몇 분마다 추가되고 업데이트되는 변경 내용에 대한 로그입니다. 이러한 세그먼트는 해당 시간에 발생하는 Blob 변경 이벤트가 있는 경우에만 만들어집니다. 이렇게 하면 클라이언트 애플리케이션에서 전체 로그를 검색할 필요 없이 특정 시간 범위 내에서 발생하는 변경 내용을 사용할 수 있습니다. 자세한 내용은 사양을 참조하세요.

변경 피드의 사용 가능한 시간별 세그먼트는 해당 세그먼트에 대한 변경 피드 파일의 경로를 지정하는 매니페스트 파일에 설명되어 있습니다. $blobchangefeed/idx/segments/ 가상 디렉터리의 목록에는 시간별로 정렬된 세그먼트가 표시됩니다. 세그먼트 경로는 세그먼트에서 나타내는 시간별 시간 범위의 시작을 설명합니다. 이 목록을 사용하여 관심 있는 로그 세그먼트를 필터링할 수 있습니다.

Name                                                                    Blob Type    Blob Tier      Length  Content Type    
----------------------------------------------------------------------  -----------  -----------  --------  ----------------
$blobchangefeed/idx/segments/1601/01/01/0000/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/22/1810/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/22/1910/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/23/0110/meta.json                  BlockBlob                      584  application/json

참고 항목

$blobchangefeed/idx/segments/1601/01/01/0000/meta.json은 변경 피드를 사용하도록 설정하면 자동으로 만들어집니다. 이 파일은 무시해도 됩니다. 항상 비어 있는 초기화 파일입니다.

세그먼트 매니페스트 파일(meta.json)은 chunkFilePaths 속성에서 해당 세그먼트에 대한 변경 피드 파일의 경로를 표시합니다. 세그먼트 매니페스트 파일의 예제는 다음과 같습니다.

{
    "version": 0,
    "begin": "2019-02-22T18:10:00.000Z",
    "intervalSecs": 3600,
    "status": "Finalized",
    "config": {
        "version": 0,
        "configVersionEtag": "0x8d698f0fba563db",
        "numShards": 2,
        "recordsFormat": "avro",
        "formatSchemaVersion": 1,
        "shardDistFnVersion": 1
    },
    "chunkFilePaths": [
        "$blobchangefeed/log/00/2019/02/22/1810/",
        "$blobchangefeed/log/01/2019/02/22/1810/"
    ],
    "storageDiagnostics": {
        "version": 0,
        "lastModifiedTime": "2019-02-22T18:11:01.187Z",
        "data": {
            "aid": "55e507bf-8006-0000-00d9-ca346706b70c"
        }
    }
}

참고 항목

$blobchangefeed 컨테이너는 계정에서 변경 피드 기능을 사용하도록 설정한 후에만 표시됩니다. Blob을 컨테이너에 나열하려면 먼저 변경 피드를 사용하도록 설정한 후 몇 분 정도 기다려야 합니다.

이벤트 레코드 변경

변경 피드 파일에는 일련의 변경 이벤트 레코드가 포함되어 있습니다. 각 변경 이벤트 레코드는 개별 Blob에 대한 하나의 변경 내용에 해당합니다. 레코드는 Apache Avro 형식 사양을 사용하여 직렬화되고 파일에 기록됩니다. 레코드는 Avro 파일 형식 사양을 사용하여 읽을 수 있습니다. 이러한 형식의 파일을 처리하는 데 사용할 수 있는 여러 라이브러리가 있습니다.

변경 피드 파일은 추가 Blob으로 $blobchangefeed/log/ 가상 디렉터리에 저장됩니다. 각 경로 아래의 첫 번째 변경 피드 파일에는 00000이 파일 이름에 포함됩니다(예: 00000.avro). 해당 경로에 추가되는 각 후속 로그 파일의 이름은 1씩 증가합니다(예: 00001.avro).

이벤트 레코드 스키마

각 속성에 대한 설명은 Blob Storage에 대한 Azure Event Grid 이벤트 스키마를 참조하세요. BlobPropertiesUpdated 및 BlobSnapshotCreated 이벤트는 현재 변경 피드 전용이며, Blob Storage 이벤트에는 아직 지원되지 않습니다.

참고 항목

세그먼트에 대한 변경 피드 파일은 세그먼트를 만드는 즉시 표시되지 않습니다. 지연 시간은 변경 후 몇 분 이내인 변경 피드의 게시 대기 시간에 대한 일반적인 간격 내에 있습니다.

스키마 버전 1

다음 이벤트 유형은 스키마 버전 1의 변경 피드 레코드에서 캡처될 수 있습니다.

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated

다음 예는 이벤트 스키마 버전 1을 사용하는 JSON 형식의 변경 이벤트 레코드를 보여 줍니다.

{
    "schemaVersion": 1,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T12:59:41.4003102Z",
    "id": "322343e3-8020-0000-00fe-233467066726",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "f0270546-168e-4398-8fa8-107a1ac214d2",
        "requestId": "322343e3-8020-0000-00fe-233467000000",
        "etag": "0x8D9F2155CBF7928",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "storageDiagnostics": {
            "bid": "9d725a00-8006-0000-00fe-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

스키마 버전 3

다음 이벤트 유형은 스키마 버전 3의 변경 피드 레코드에서 캡처될 수 있습니다.

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated

다음 예는 이벤트 스키마 버전 3을 사용하는 JSON 형식의 변경 이벤트 레코드를 보여 줍니다.

{
    "schemaVersion": 3,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:05:19.6798242Z",
    "id": "eefe8fc8-8020-0000-00fe-23346706daaa",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "00c0b6b7-bb67-4748-a3dc-86464863d267",
        "requestId": "eefe8fc8-8020-0000-00fe-233467000000",
        "etag": "0x8D9F216266170DC",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:08:42.4825913Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot": "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "storageDiagnostics": {
            "bid": "9d726370-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

스키마 버전 4

다음 이벤트 유형은 스키마 버전 4의 변경 피드 레코드에서 캡처될 수 있습니다.

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperationInitiated
  • RestorePointMarkerCreated

다음 예는 이벤트 스키마 버전 4를 사용하는 JSON 형식의 변경 이벤트 레코드를 보여 줍니다.

{
    "schemaVersion": 4,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:08:42.4835902Z",
    "id": "ca76bce1-8020-0000-00ff-23346706e769",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "58fbfee9-6cf5-4096-9666-c42980beee65",
        "requestId": "ca76bce1-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2169F42D701",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2022-02-17T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:08:42.4825913Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot": "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "storageDiagnostics": {
            "bid": "9d72687f-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

스키마 버전 5

다음 이벤트 유형은 스키마 버전 5의 변경 피드 레코드에서 캡처될 수 있습니다.

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperationInitiated

다음 예는 이벤트 스키마 버전 5를 사용하는 JSON 형식의 변경 이벤트 레코드를 보여 줍니다.

{
    "schemaVersion": 5,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:12:11.5746587Z",
    "id": "62616073-8020-0000-00ff-233467060cc0",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "b3f9b39a-ae5a-45ac-afad-95ac9e9f2791",
        "requestId": "62616073-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2171BE32588",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2022-02-17T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:12:11.5726507Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot" : "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "blobTagsUpdated": {
            "previous": {
                "Tag1": "Value1_3",
                "Tag2": "Value2_3"
            },
            "current": {
                "Tag1": "Value1_4",
                "Tag2": "Value2_4"
            }
        },
        "restorePointMarker": {
            "rpi": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpp": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpl": "test-restore-label",
            "rpt": "2022-02-17T13:56:09.3559772Z"
        },
        "storageDiagnostics": {
            "bid": "9d726db1-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

스키마 버전 6

다음 이벤트 유형은 스키마 버전 6의 변경 피드 레코드에서 캡처될 수 있습니다.

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperationInitiated

스키마 버전 6은 콜드 계층에 대한 지원을 추가합니다.

다음 예는 이벤트 스키마 버전 6을 사용하는 JSON 형식의 변경 이벤트 레코드를 보여 줍니다.

{
    "schemaVersion": 6,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2023-10-11T13:12:11.5746587Z",
    "id": "62616073-8020-0000-00ff-233467060cc0",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "b3f9b39a-ae5a-45ac-afad-95ac9e9f2791",
        "requestId": "62616073-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2171BE32588",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2023-10-11T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2023-10-11T13:12:11.5726507Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2023-10-11T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot" : "2023-10-11T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "blobTagsUpdated": {
            "previous": {
                "Tag1": "Value1_3",
                "Tag2": "Value2_3"
            },
            "current": {
                "Tag1": "Value1_4",
                "Tag2": "Value2_4"
            }
        },
        "restorePointMarker": {
            "rpi": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpp": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpl": "test-restore-label",
            "rpt": "2023-10-11T13:56:09.3559772Z"
        },
        "storageDiagnostics": {
            "bid": "9d726db1-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

사양

  • 변경 이벤트 레코드는 변경 피드에만 추가됩니다. 이러한 레코드가 추가되면 변경할 수 없으며 레코드 위치는 안정적입니다. 클라이언트 애플리케이션은 변경 피드의 읽기 위치에서 자체 검사점을 유지 관리할 수 있습니다.

  • 변경 이벤트 레코드는 변경 후 몇 분 이내에 추가됩니다. 클라이언트 애플리케이션은 스트리밍 액세스를 위해 추가되거나 다른 시간에 대량으로 추가된 레코드를 사용하도록 선택할 수 있습니다.

  • 변경 이벤트 레코드는 Blob별 수정 순서에 따라 정렬됩니다. Blob 간의 변경 순서는 Azure Blob Storage에서 정의되지 않습니다. 이전 세그먼트의 모든 변경은 후속 세그먼트의 변경 이전입니다.

  • 변경 이벤트 레코드는 Apache Avro 1.8.2 형식 사양을 사용하여 로그 파일에 직렬화됩니다.

  • eventTypeControl 값이 있는 변경 이벤트 레코드는 내부 시스템 레코드이며, 계정의 개체에 대한 변경 내용을 반영하지 않습니다. 이러한 레코드는 무시해도 됩니다.

  • storageDiagnostics 속성 모음의 값은 내부 전용이며, 애플리케이션에서 사용하도록 설계되지 않았습니다. 애플리케이션에는 해당 데이터에 대한 계약 종속성이 없어야 합니다. 이러한 속성은 무시해도 됩니다.

  • 세그먼트에서 나타내는 시간은 15분 범위의 근사치입니다. 따라서 모든 레코드를 지정된 시간 내에 사용하도록 보장하려면 연속된 이전 및 다음 시간 세그먼트를 사용합니다.

  • 각 세그먼트에는 게시 처리량을 관리하기 위한 로그 스트림의 내부 분할로 인해 서로 다른 수의 chunkFilePaths가 있을 수 있습니다. 각 chunkFilePath의 로그 파일은 상호 배타적인 Blob을 포함하도록 보장되며, 반복하는 동안 Blob별 수정 순서를 위반하지 않고 병렬로 사용하고 처리할 수 있습니다.

  • 세그먼트는 Publishing 상태에서 시작됩니다. 레코드를 세그먼트에 추가하는 작업이 완료되면 Finalized가 됩니다. $blobchangefeed/meta/Segments.json 파일에 있는 LastConsumable 속성의 날짜 이후의 날짜가 지정된 세그먼트의 로그 파일은 애플리케이션에서 사용하지 않아야 합니다. $blobchangefeed/meta/Segments.json 파일의 LastConsumable 속성의 예제는 다음과 같습니다.

{
    "version": 0,
    "lastConsumable": "2019-02-23T01:10:00.000Z",
    "storageDiagnostics": {
        "version": 0,
        "lastModifiedTime": "2019-02-23T02:24:00.556Z",
        "data": {
            "aid": "55e551e3-8006-0000-00da-ca346706bfe4",
            "lfz": "2019-02-22T19:10:00.000Z"
        }
    }
}

조건 및 알려진 문제

이 섹션에서는 변경 피드의 현재 릴리스에서 알려진 문제 및 조건에 대해 설명합니다.

  • 스토리지 계정에 방화벽 규칙을 사용하도록 설정하면 $blobchangefeed 컨테이너 내에서 Blob을 삭제하라는 수명 주기 관리 요청이 차단될 수 있습니다. 신뢰할 수 있는 Microsoft 서비스에 대한 예외를 제공하여 이러한 요청의 차단을 해제할 수 있습니다. 자세한 내용은 방화벽 및 가상 네트워크 구성예외 섹션을 참조하세요.
  • segments.json 파일의 LastConsumable 속성은 변경 피드에서 완료하는 첫 번째 세그먼트를 나열하지 않습니다. 이 문제는 첫 번째 세그먼트가 완료된 후에만 발생합니다. 첫 번째 시간 이후의 모든 후속 세그먼트는 LastConsumable 속성에서 정확하게 캡처됩니다.
  • 현재는 ListContainers API를 호출할 때 $blobchangefeed 컨테이너를 볼 수 없습니다. 콘텐츠는 $blobchangefeed 컨테이너에서 ListBlobs API를 직접 호출하여 볼 수 있습니다.
  • 변경 피드가 사용하도록 설정된 지역 중복 스토리지 계정의 스토리지 계정 장애 조치(failover)는 변경 피드 로그와 Blob 데이터 및/또는 메타데이터 간에 불일치를 초래할 수 있습니다. 이러한 불일치에 대한 자세한 내용은 변경 피드 및 Blob 데이터 불일치를 참조하세요.
  • $blobchangefeed$blobchangefeedsys 컨테이너에서 404(찾을 수 없음) 및 412(사전 조건 실패) 오류가 보고될 수 있습니다. 이러한 오류는 무시해도 됩니다.
  • Blob 버전 또는 스냅샷이 삭제될 때 BlobDeleted 이벤트는 생성되지 않습니다. BlobDeleted 이벤트는 기본(루트) Blob이 삭제된 경우에만 추가됩니다.
  • 이벤트 레코드는 Blob 서비스 엔드포인트(blob.core.windows.net)에 대한 요청으로 인해 발생하는 Blob의 변경 내용에 대해서만 추가됩니다. Data Lake Storage 엔드포인트(dfs.core.windows.net) 엔드포인트에 대한 요청으로 인해 발생하는 변경 내용은 기록되지 않으며 변경 피드 레코드에 표시되지 않습니다.

질문과 대답(FAQ)

변경 피드 지원 FAQ를 참조하세요.

기능 지원

이 기능에 대한 지원은 Data Lake Storage Gen2, NFS(네트워크 파일 시스템) 3.0 프로토콜 또는 SSH SFTP(파일 전송 프로토콜)를 사용하도록 설정하면 영향을 받을 수 있습니다. 이러한 기능을 사용하도록 설정한 경우 Azure Storage 계정의 Blob Storage 기능 지원을 참조하여 이 기능에 대한 지원을 평가합니다.