아마존의 저널 콘텐츠 QLDB - 아마존 퀀텀 레저 데이터베이스 (아마존QLDB)

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

아마존의 저널 콘텐츠 QLDB

중요

지원 종료 알림: 기존 고객은 2025년 7월 31일 지원이 종료될 QLDB 때까지 Amazon을 사용할 수 있습니다. 자세한 내용은 아마존 QLDB 원장을 Amazon Aurora SQL Postgre로 마이그레이션을 참조하십시오.

QLDBAmazon에서 저널은 데이터의 모든 변경 사항에 대한 완전하고 검증 가능한 기록을 저장하는 변경 불가능한 트랜잭션 로그입니다. 저널은 추가만 가능하며, 커밋된 데이터 및 기타 시스템 메타데이터를 포함하는 순서화된 해시 체인 블록 세트로 구성됩니다. QLDB트랜잭션에서 체인 블록 하나를 저널에 기록합니다.

이 섹션에서는 샘플 데이터가 포함된 저널 블록의 예를 제공하고 블록의 내용을 설명합니다.

블록 예제

저널 블록에는 트랜잭션에서 커밋된 문서 개정 및 이를 커밋한 PartiQL 문을 나타내는 항목과 함께 트랜잭션 메타데이터가 들어 있습니다.

다음은 샘플 데이터가 있는 블록의 예제입니다.

참고

이 블록 예제는 정보 제공 목적으로만 제공됩니다. 표시된 해시는 실제 계산된 해시 값이 아닙니다.

{
  blockAddress:{
    strandId:"4o5UuzWSW5PIoOGm5jPA6J",
    sequenceNo:25
  },
  transactionId:"3gtB8Q8dfIMA8lQ5pzHAMo",
  blockTimestamp:2022-06-08T18:46:46.512Z,
  blockHash:{{QS5lJt8vRxT30L9OGL5oU1pxFTe+UlEwakYBCrvGQ4A=}},
  entriesHash:{{buYYc5kV4rrRtJAsrIQnfnhgkzfQ8BKjI0C2vFnYQEw=}},
  previousBlockHash:{{I1UKRIWUgkM1X6042kcoZ/eN1rn0uxhDTc08zw9kZ5I=}},
  entriesHashList:[
    {{BUCXP6oYgmug2AfPZcAZup2lKolJNTbTuV5RA1VaFpo=}},
    {{cTIRkjuULzp/4KaUEsb/S7+TG8FvpFiZHT4tEJGcANc=}},
    {{3aktJSMyJ3C5StZv4WIJLu/w3D8mGtduZvP0ldKUaUM=}},
    {{GPKIJ1+o8mMZmPj/35ZQXoca2z64MVYMCwqs/g080IM=}}
  ],
  transactionInfo:{
    statements:[
      {
        statement:"INSERT INTO VehicleRegistration VALUE ?",
        startTime:2022-06-08T18:46:46.063Z,
        statementDigest:{{KY2nL6UGUPs5lXCLVXcUaBxcEIop0Jvk4MEjcFVBfwI=}}
      },
      {
        statement:"SELECT p_id FROM Person p BY p_id WHERE p.FirstName = ? and p.LastName = ?",
        startTime:2022-06-08T18:46:46.173Z,
        statementDigest:{{QS2nfB8XBf2ozlDx0nvtsliOYDSmNHMYC3IRH4Uh690=}}
      },
      {
        statement:"UPDATE VehicleRegistration r SET r.Owners.PrimaryOwner.PersonId = ? WHERE r.VIN = ?",
        startTime:2022-06-08T18:46:46.278Z,
        statementDigest:{{nGtIA9Qh0/dwIplOR8J5CTeqyUVtNUQgXfltDUo2Aq4=}}
      },
      {
        statement:"DELETE FROM DriversLicense l WHERE l.LicenseNumber = ?",
        startTime:2022-06-08T18:46:46.385Z,
        statementDigest:{{ka783dcEP58Q9AVQ1m9NOJd3JAmEvXLjzl0OjN1BojQ=}}
      }
    ],
    documents:{
      HwVFkn8IMRa0xjze5xcgga:{
        tableName:"VehicleRegistration",
        tableId:"HQZ6cgIMUi204Lq1tT4oaJ",
        statements:[0,2]
      },
      IiPTRxLGJZa342zHFCFT15:{
        tableName:"DriversLicense",
        tableId:"BvtXEB1JxZg0lJlBAtbtSV",
        statements:[3]
      }
    }
  },
  revisions:[
    {
      hash:{{FR1IWcWew0yw1TnRklo2YMF/qtwb7ohsu5FD8A4DSVg=}}
    },
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}},
      data:{
        VIN:"1N4AL11D75C109151",
        LicensePlateNumber:"LEWISR261LL",
        State:"WA",
        City:"Seattle",
        PendingPenaltyTicketAmount:90.25,
        ValidFromDate:2017-08-21,
        ValidToDate:2020-05-11,
        Owners:{
          PrimaryOwner:{
            PersonId:"3Ax20JIix5J2ulu2rCMvo2"
          },
          SecondaryOwners:[]
        }
      },
      metadata:{
        id:"HwVFkn8IMRa0xjze5xcgga",
        version:0,
        txTime:2022-06-08T18:46:46.492Z,
        txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
      }
    },
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      hash:{{ZVF/f1uSqd5DIMqzI04CCHaCGFK/J0Jf5AFzSEk0l90=}},
      metadata:{
        id:"IiPTRxLGJZa342zHFCFT15",
        version:1,
        txTime:2022-06-08T18:46:46.492Z,
        txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
      }
    }
  ]
}

revisions 필드에서 일부 개정 객체에는 hash 값만 포함되고 기타 속성은 포함되지 않을 수 있습니다. 이는 사용자 데이터를 포함하지 않는 내부 전용 시스템 수정본입니다. 이러한 개정판의 해시는 저널의 전체 해시 체인의 일부이며, 이는 암호화 검증에 필요합니다.

블록 콘텐츠

저널 블록에는 다음과 같은 필드가 있습니다.

blockAddress

저널에서의 블록 위치입니다. 주소는 strandIdsequenceNo라는 두 개의 필드로 구성된 Amazon Ion 구조입니다.

예: {strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}

transactionId

블록을 커밋한 트랜잭션의 고유 ID입니다.

blockTimestamp

블록이 저널에 커밋된 시점의 타임스탬프입니다.

blockHash

블록을 고유하게 나타내는 256비트 해시 값입니다. 이것은 entriesHashpreviousBlockHash를 연결한 해시입니다.

entriesHash

내부 전용 시스템 항목을 포함하여 블록 내의 모든 항목을 나타내는 해시입니다. 이는 리프 노드가 entriesHashList의 모든 해시로 구성된 Merkle 트리의 루트 해시입니다.

previousBlockHash

저널에 있는 이전 체인 블록의 해시입니다.

entriesHashList

블록 내 각 항목을 나타내는 해시 목록입니다. 이 목록에는 다음 항목 해시가 포함될 수 있습니다.

  • transactionInfo를 나타내는 Ion 해시입니다. 이 값은 전체 transactionInfo 구조의 Ion 해시를 가져와 계산됩니다.

  • 리프 노드가 revisions의 모든 해시로 구성된 Merkle 트리의 루트 해시입니다.

  • redactionInfo를 나타내는 Ion 해시입니다. 이 해시는 수정 트랜잭션으로 커밋된 블록에만 존재합니다. 이 값은 전체 redactionInfo 구조의 Ion 해시를 가져와 계산됩니다.

  • 내부 전용 시스템 메타데이터를 나타내는 해시입니다. 이러한 해시는 모든 블록에 존재하지 않을 수 있습니다.

transactionInfo

블록을 커밋한 트랜잭션의 문에 대한 정보가 포함된 Amazon Ion 구조입니다. 이 구조에는 다음 필드가 있습니다.

  • statements - PartiQL 문 목록 및 실행 시작 시점의 startTime입니다. 각 명령문에는 transactionInfo 구조의 해시를 계산하는 데 필요한 statementDigest 해시가 있습니다.

  • documents— 명세서에 의해 IDs 업데이트된 문서. 각 문서에는 해당 문서가 속한 tableNametableId와 이를 업데이트한 각 문의 인덱스가 포함됩니다.

revisions

블록에서 커밋된 문서 개정 목록입니다. 각 개정 구조에는 개정의 커밋된 보기에 있는 모든 필드가 포함됩니다.

여기에는 저널의 전체 해시 체인의 일부인 내부 전용 시스템 개정을 나타내는 해시도 포함될 수 있습니다.

수정된 개정

QLDBAmazon에서 DELETE 명령문은 문서를 삭제된 것으로 표시하는 새 수정 버전을 생성하여 논리적으로만 문서를 삭제합니다. QLDB또한 테이블 기록에서 사용하지 않는 문서 수정 내용을 영구적으로 삭제할 수 있는 데이터 수정 작업도 지원합니다.

수정 작업은 지정된 수정 버전의 사용자 데이터만 삭제하고 저널 시퀀스와 문서 메타데이터는 변경되지 않습니다. 이렇게 하면 원장의 전체 데이터 무결성이 유지됩니다. 수정 작업에 대한 자세한 내용과 예제는 문서 개정본 수정하기을 참조하세요.

수정된 개정 예제

이전 블록 예제를 생각해 보세요. 이 블록에서 문서 ID가 HwVFkn8IMRa0xjze5xcgga이고 버전 번호가 0인 개정을 수정한다고 가정해 보겠습니다.

수정이 완료되면 개정의 사용자 데이터(data 구조로 표시됨)가 새 dataHash 필드로 교체됩니다. 이 필드의 값은 제거된 data 구조의 Ion 해시입니다. 따라서 원장은 전반적인 데이터 무결성을 유지하고 기존 검증 작업을 통해 암호학적으로 검증 가능한 상태를 유지합니다. API

다음 수정 예제는 새 필드가 강조 표시된 이 수정 결과를 보여줍니다. dataHash red italics.

참고

이 개정 예제는 정보 제공 목적으로만 제공됩니다. 표시된 해시는 실제 계산된 해시 값이 아닙니다.

...
{
  blockAddress:{
    strandId:"4o5UuzWSW5PIoOGm5jPA6J",
    sequenceNo:25
  },
  hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}},
  dataHash:{{s83jd7sfhsdfhksj7hskjdfjfpIPP/DP2hvionas2d4=}},
  metadata:{
    id:"HwVFkn8IMRa0xjze5xcgga",
    version:0,
    txTime:2022-06-08T18:46:46.492Z,
    txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
  }
}
...

QLDB또한 완료된 수정 요청을 위해 저널에 새 블록을 추가합니다. 이 블록에는 다음 예제와 같이 트랜잭션에서 수정된 개정 목록이 포함된 추가 redactionInfo 항목이 포함되어 있습니다.

...
redactionInfo:{
  revisions:[
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      tableId:"HQZ6cgIMUi204Lq1tT4oaJ",
      documentId:"HwVFkn8IMRa0xjze5xcgga",
      version:0
    }
  ]
}
...

샘플 애플리케이션

내보낸 데이터를 사용하여 저널의 해시 체인을 검증하는 Java 코드 예제는 aws-samples/ -java 저장소를 참조하십시오. GitHub amazon-qldb-dmv-sample 이 샘플 애플리케이션에는 다음과 같은 클래스 파일이 포함되어 있습니다.

  • ValidateQldbHashChain.java — 원장에서 저널 블록을 내보내고 내보낸 데이터를 사용하여 블록 간 해시 체인을 검증하는 튜토리얼 코드를 포함합니다.

  • JournalBlock.java — 블록 내의 각 개별 해시 구성 요소를 계산하는 방법을 보여 verifyBlockHash() 주는 메서드가 들어 있습니다. 이 메서드는 ValidateQldbHashChain.java의 자습서 코드에서 호출됩니다.

이 전체 샘플 애플리케이션을 다운로드하고 설치하는 방법에 대한 지침은 Amazon QLDB Java 샘플 애플리케이션 설치을 참조하세요. 자습서 코드를 실행하기 전에 Java 자습서의 1~3단계에 따라 샘플 원장을 설정하고 샘플 데이터를 로드해야 합니다.

다음 사항도 참조하세요.

의 저널에 QLDB 대한 자세한 내용은 다음 항목을 참조하십시오.