Aurora PostgreSQL Limitless Database의 분산 교착 - Amazon Aurora

Aurora PostgreSQL Limitless Database의 분산 교착

DB 샤드 그룹에서는 서로 다른 라우터와 샤드에 분산된 트랜잭션 간에 교착이 발생할 수 있습니다. 예를 들어 다음 그림과 같이 샤드 두 개에 걸쳐 있는 동시 분산 트랜잭션 두 개가 실행됩니다.

두 개의 분산 트랜잭션의 분산 교착.

트랜잭션은 테이블을 잠그고 다음과 같이 두 샤드에서 대기 이벤트를 만듭니다.

  1. 분산 트랜잭션 1:

    UPDATE table SET value = 1 WHERE key = 'shard1_key';

    샤드 1에 잠금을 보유합니다.

  2. 분산 트랜잭션 2:

    UPDATE table SET value = 2 WHERE key = 'shard2_key';

    샤드 2에 잠금을 보유합니다.

  3. 분산 트랜잭션 1:

    UPDATE table SET value = 3 WHERE key = 'shard2_key';

    분산 트랜잭션 1이 샤드 2를 기다리고 있습니다.

  4. 분산 트랜잭션 2:

    UPDATE table SET value = 4 WHERE key = 'shard1_key';

    분산 트랜잭션 2가 샤드 1을 기다리고 있습니다.

이 시나리오에서는 샤드 1과 샤드 2 모두 문제를 확인하지 못합니다. 트랜잭션 1은 샤드 2에서 트랜잭션 2를 기다리고 있고 트랜잭션 2는 샤드 1에서 트랜잭션 1을 기다리고 있습니다. 전역 뷰에서 트랜잭션 1은 트랜잭션 2를 기다리고 있고 트랜잭션 2는 트랜잭션 1을 기다리고 있습니다. 두 개의 서로 다른 샤드에 있는 두 트랜잭션이 서로를 기다리고 있는 이 상황을 분산 교착이라고 합니다.

Aurora PostgreSQL Limitless Database는 분산 교착을 자동으로 감지하고 해결할 수 있습니다. DB 샤드 그룹의 라우터는 트랜잭션이 리소스를 획득하기 위해 너무 오래 대기하면 알림을 받습니다. 알림을 수신하는 라우터는 DB 샤드 그룹 내의 모든 라우터 및 샤드에서 필요한 정보를 수집하기 시작합니다. 그런 다음 DB 샤드 그룹의 나머지 트랜잭션이 서로 차단되지 않고 진행될 수 있을 때까지 라우터는 분산 교착에 참여하는 트랜잭션을 종료합니다.

트랜잭션이 분산 교착의 일부이고 라우터에 의해 종료되면 다음 오류가 발생합니다.

ERROR: aborting transaction participating in a distributed deadlock

rds_aurora.limitless_distributed_deadlock_timeout DB 클러스터 파라미터는 라우터에 분산 교착을 확인하도록 알리기 전에 각 트랜잭션이 리소스를 기다리는 시간을 설정합니다. 워크로드에서 교착이 덜 일어나면 파라미터 값을 늘릴 수 있습니다. 기본값은 1000밀리초(1초)입니다.

교차 노드 교착이 발견되고 해결되면 분산 교착 주기가 PostgreSQL 로그에 게시됩니다. 교착의 일부인 각 프로세스에 대한 정보는 다음과 같습니다.

  • 트랜잭션을 시작한 코디네이터 노드

  • 코디네이터 노드에 있는 트랜잭션의 backend_id/backend_local_xid 형식 가상 트랜잭션 ID(xid)

  • 트랜잭션의 분산 세션 ID