Amazon Keyspaces에서 배치 문 사용 - Amazon Keyspaces(Apache Cassandra용)

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

Amazon Keyspaces에서 배치 문 사용

여러 INSERT, UPDATEDELETE 작업을 BATCH 문으로 결합할 수 있습니다. LOGGED 배치가 기본값입니다.

batch_statement ::= BEGIN [ UNLOGGED ] BATCH [ USING update_parameter( AND update_parameter)* ] modification_statement ( ';' modification_statement )* APPLY BATCH modification_statement ::= insert_statement | update_statement | delete_statement

배치 문을 실행하면 드라이버는 배치의 모든 문을 단일 배치 작업으로 결합합니다.

사용할 배치 작업 유형을 결정하려면 다음 지침을 고려할 수 있습니다.

다음과 같은 경우 로깅된 배치를 사용합니다.
  • 원자성 트랜잭션 보장이 필요합니다.

  • 약간 더 긴 지연 시간은 허용 가능한 절충입니다.

다음과 같은 경우 로깅되지 않은 배치를 사용합니다.
  • 단일 파티션 작업을 최적화해야 합니다.

  • 네트워크 오버헤드를 줄이려고 합니다.

  • 처리량이 많은 요구 사항이 있습니다.

배치 문 할당량에 대한 자세한 내용은 섹션을 참조하세요Amazon Keyspaces(Apache Cassandra용)에 대한 할당량.

로깅되지 않은 배치

로깅되지 않은 배치를 사용하면 Amazon Keyspaces는 배치 로그를 유지 관리하지 않고 여러 작업을 단일 요청으로 처리합니다. 로깅되지 않은 배치 작업의 경우 일부 작업은 성공하고 다른 작업은 실패할 수 있습니다. 로깅되지 않은 배치는 다음과 같은 경우에 유용합니다.

  • 단일 파티션 내에서 작업을 최적화합니다.

  • 관련 요청을 그룹화하여 네트워크 트래픽을 줄입니다.

로깅되지 않은 배치의 구문은 UNLOGGED 키워드를 추가하여 로깅된 배치의 구문과 유사합니다.

BEGIN UNLOGGED BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith'); APPLY BATCH;

로깅된 배치

로깅된 배치는 여러 쓰기 작업을 단일 원자성 작업으로 결합합니다. 로깅된 배치를 실행하는 경우:

  • 모든 작업은 함께 성공하거나 함께 실패합니다.

  • 작업은 동기식이며 멱등성입니다.

  • 동일한 AWS 계정 및에 있는 한 여러 Amazon Keyspaces 테이블에 쓸 수 있습니다 AWS 리전.

로깅된 배치는 지연 시간이 약간 더 길 수 있습니다. 처리량이 많은 애플리케이션의 경우 로깅되지 않은 배치를 사용하는 것이 좋습니다.

Amazon Keyspaces에서 로깅된 배치를 사용하는 데 드는 추가 비용은 없습니다. 배치 작업의 일부인 쓰기에 대해서만 비용을 지불합니다. Amazon Keyspaces는 배치의 모든 행에 대해 두 가지 기본 쓰기를 수행합니다. 하나는 배치에 대한 행을 준비하고 다른 하나는 배치를 커밋합니다. 로깅된 배치를 사용하는 테이블의 용량을 계획할 때 배치의 각 행에는 표준 쓰기 작업의 두 배 용량이 필요합니다. 예를 들어 애플리케이션이 3개의 1KB 행으로 초당 1개의 로깅된 배치를 실행하는 경우 개별 쓰기 또는 로깅되지 않은 배치에 대해 3개의 WCUs만 프로비저닝하는 것에 비해 6개의 쓰기 용량 단위(WCU)를 프로비저닝해야 합니다. WCUs

요금에 대한 자세한 내용은 Amazon Keyspaces(Apache Cassandra용) 요금을 참조하세요.

배치 작업 모범 사례

Amazon Keyspaces 배치 작업을 사용할 때는 다음 권장 사례를 고려하세요.

  • 자동 조정을 활성화하여 테이블이 배치 작업을 처리할 수 있는 충분한 처리량 용량과 로깅된 배치의 추가 처리량 요구 사항을 확보할 수 있습니다.

  • 애플리케이션 정확성에 영향을 주지 않고 작업을 독립적으로 실행할 수 있는 경우 개별 작업 또는 로깅되지 않은 배치를 사용합니다.

  • 동시 배치 작업이 충돌하고 실패할 수 있으므로 동일한 행에 대한 동시 업데이트를 최소화하도록 애플리케이션을 설계합니다.

  • 원자성 요구 사항 없이 처리량이 많은 대량 데이터를 수집하려면 개별 쓰기 작업 또는 로깅되지 않은 배치를 사용합니다.

일관성 및 동시성

Amazon Keyspaces는 로깅된 배치에 대해 다음과 같은 일관성 및 동시성 규칙을 적용합니다.

  • 모든 배치 작업은 LOCAL_QUORUM 일관성 수준을 사용합니다.

  • 여러 행에 영향을 미치는 동시 배치를 동시에 실행할 수 있습니다.

  • 진행 중인 배치와 관련된 행에 대한 동시 INSERTUPDATE, 또는 DELETE 작업은 충돌로 인해 실패합니다.

지원되는 연산자 및 조건

지원되는 WHERE 절 연산자:
  • 같음(=)

지원되지 않는 연산자:
  • 범위 연산자(>, <, >=, <=)

  • IN 연산자

  • LIKE 연산자

  • BETWEEN 연산자

로그된 배치에서는 지원되지 않음:
  • 동일한 행에 영향을 미치는 여러 문

  • 카운터 작업

  • 범위 삭제

기록된 배치 문의 실패 조건

다음과 같은 경우 로깅된 배치 작업이 실패할 수 있습니다.

  • 조건 표현식(예: IF NOT EXISTS 또는 IF)은 false로 평가됩니다.

  • 하나 이상의 작업에 잘못된 파라미터가 포함되어 있습니다.

  • 요청이 동일한 행에서 실행되는 다른 배치 작업과 충돌합니다.

  • 테이블에 충분한 프로비저닝 용량이 없습니다.

  • 행이 최대 크기 제한을 초과합니다.

  • 입력 데이터 형식이 잘못되었습니다.

배치 문 및 다중 리전 복제

다중 리전 배포의 경우:

  • 소스 리전 작업은 동기식이며 원자식입니다.

  • 대상 리전 작업은 비동기식입니다.

  • 모든 배치 작업은 복제가 보장되지만 애플리케이션 중에 격리가 유지되지 않을 수 있습니다.

배치 작업 모니터링

Amazon CloudWatch 지표를 사용하여 배치 작업을 모니터링하여 성능, 오류 및 사용 패턴을 추적할 수 있습니다. Amazon Keyspaces는 테이블당 배치 작업을 모니터링하기 위한 다음과 같은 CloudWatch 지표를 제공합니다.

  • SuccessfulRequestCount - 성공적인 배치 작업을 추적합니다.

  • Latency - 배치 작업 성능을 측정합니다.

  • ConsumedWriteCapacityUnits - 배치 작업의 용량 소비를 모니터링합니다.

자세한 내용은 Amazon Keyspaces 지표 단원을 참조하십시오.

CloudWatch 지표 외에도 AWS CloudTrail 를 사용하여 모든 Amazon Keyspaces API 작업을 로깅할 수 있습니다. 배치의 각 API 작업은 CloudTrail에 로깅되므로 Amazon Keyspaces 테이블에서 배치 작업을 더 쉽게 추적하고 감사할 수 있습니다.

배치 작업 예제

다음은 로깅된 기본 배치 명령문의 예입니다.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith'); APPLY BATCH;

다음은 INSERT, UPDATEDELETE 문을 포함하는 배치의 예입니다.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); UPDATE users SET firstname = 'Johnny' WHERE id = 2; DELETE FROM users WHERE id = 3; APPLY BATCH;

다음은 클라이언트 측 타임스탬프를 사용하는 배치의 예입니다.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Stiles') USING TIMESTAMP 1669069624; INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Doe') USING TIMESTAMP 1669069624; APPLY BATCH; BEGIN BATCH UPDATE users USING TIMESTAMP 1669069624 SET firstname = 'Carlos' WHERE id = 1; UPDATE users USING TIMESTAMP 1669069624 SET firstname = 'Diego' WHERE id = 2; APPLY BATCH;

다음은 조건부 배치의 예입니다.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'Jane', 'Doe') IF NOT EXISTS; INSERT INTO users (id, firstname, lastname) VALUES (2, 'John', 'Doe') IF NOT EXISTS; APPLY BATCH; BEGIN BATCH UPDATE users SET lastname = 'Stiles' WHERE id = 1 IF lastname = 'Doe'; UPDATE users SET lastname = 'Stiles' WHERE id = 2 IF lastname = 'Doe'; APPLY BATCH;

다음은 TTL(Time to Live)을 사용하는 배치의 예입니다.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe') USING TTL 3600; INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith') USING TTL 7200; APPLY BATCH;

다음은 여러 테이블을 업데이트하는 배치 명령문의 예입니다.

BEGIN BATCH INSERT INTO users (id, firstname) VALUES (1, 'John'); INSERT INTO user_emails (user_id, email) VALUES (1, 'john@example.com'); APPLY BATCH;

다음은 사용자 정의 유형(UDTs. 이 예제에서는 UDT가 address 존재한다고 가정합니다.

BEGIN BATCH INSERT INTO users (id, firstname, address) VALUES (1, 'John', {street: '123 Main St', city: 'NYC', zip: '10001'}); INSERT INTO users (id, firstname, address) VALUES (2, 'Jane', {street: '456 Oak Ave', city: 'LA', zip: '90210'}); APPLY BATCH; BEGIN BATCH UPDATE users SET address.zip = '10002' WHERE id = 1; UPDATE users SET address.city = 'Boston' WHERE id = 2; APPLY BATCH;