Amazon Aurora MySQL DB 클러스터에서 로컬 쓰기 전달 사용 - Amazon Aurora

Amazon Aurora MySQL DB 클러스터에서 로컬 쓰기 전달 사용

로컬(클러스터 내) 쓰기 전달을 사용하면 애플리케이션이 Aurora 복제본에서 직접 읽기/쓰기 트랜잭션을 발행할 수 있도록 합니다. 그러면 이러한 트랜잭션이 라이터 DB 인스턴스로 전달되어 커밋됩니다. 한 트랜잭션에서 최신 쓰기를 읽는 기능인 쓰기 후 읽기 읽관성이 애플리케이션에 필요한 경우 로컬 쓰기 전달을 사용할 수 있습니다.

읽기 전용 복제본은 라이터로부터 비동기식으로 업데이트를 받습니다. 쓰기 전달을 사용하지 않으면 쓰기 후 읽기 일관성이 필요한 모든 읽기를 라이터 DB 인스턴스에서 처리해야 합니다. 또는 확장성을 목적으로 여러 읽기 전용 복제본을 활용하기 위해 복잡한 사용자 지정 애플리케이션 로직을 개발해야 합니다. 애플리케이션이 트래픽을 올바른 엔드포인트로 전송하기 위해 두 세트의 데이터베이스 연결을 유지하면서 모든 읽기 및 쓰기 트래픽을 완전히 분할해야 합니다. 쿼리가 애플리케이션 내의 단일 논리적 세션 또는 트랜잭션의 일부인 경우 이러한 개발 오버헤드로 인해 애플리케이션 설계가 복잡해집니다. 게다가 읽기 전용 복제본마다 복제 지연이 다를 수 있기 때문에 데이터베이스의 모든 인스턴스에서 전역 읽기 일관성을 유지하기가 어렵습니다.

쓰기 전달을 사용하면 이러한 트랜잭션을 분할하거나 라이터에게만 전송할 필요가 없으므로 애플리케이션 개발이 간소화됩니다. 이 새로운 기능을 사용하면 트랜잭션에서 최신 쓰기를 읽어야 하고 쓰기 지연 시간에 민감하지 않은 워크로드에 대한 읽기 규모를 쉽게 달성할 수 있습니다.

로컬 쓰기 전달은 보조 DB 클러스터의 쓰기를 Aurora 글로벌 데이터베이스의 기본 DB 클러스터로 전달하는 전역 쓰기 전달과는 다릅니다. Aurora 글로벌 데이터베이스의 일부인 DB 클러스터에서 로컬 쓰기 전달을 사용할 수 있습니다. 자세한 내용은 Amazon Aurora 글로벌 데이터베이스에서 쓰기 전달 사용 단원을 참조하십시오.

쓰기 전달에는 Aurora MySQL 버전 3.04 이상이 필요합니다.

DB 클러스터에 쓰기 전달이 활성화되어 있는지 확인

DB 클러스터에서 쓰기 전달을 사용할 수 있는지 확인하려면 클러스터에 LocalWriteForwardingStatus 속성이 enabled로 되어 있는지 확인합니다.

‎‎AWS Management Console에서 클러스터의 세부 정보 페이지 구성 탭에서 로컬 읽기 복제본 쓰기 전달이 활성화됨 상태인 것을 볼 수 있습니다.‎‎

모든 클러스터에 대한 쓰기 전달 설정의 상태를 보려면 다음 AWS CLI 명령을 실행합니다.

aws rds describe-db-clusters \ --query '*[].{DBClusterIdentifier:DBClusterIdentifier,LocalWriteForwardingStatus:LocalWriteForwardingStatus}' [ { "LocalWriteForwardingStatus": "enabled", "DBClusterIdentifier": "write-forwarding-test-cluster-1" }, { "LocalWriteForwardingStatus": "disabled", "DBClusterIdentifier": "write-forwarding-test-cluster-2" }, { "LocalWriteForwardingStatus": "requested", "DBClusterIdentifier": "test-global-cluster-2" }, { "LocalWriteForwardingStatus": "null", "DBClusterIdentifier": "aurora-mysql-v2-cluster" } ]

DB 클러스터는 LocalWriteForwardingStatus에 대해 다음과 같은 값을 가질 수 있습니다.

  • disabled - 쓰기 전달이 비활성화되었습니다.

  • disabling - 쓰기 전달을 비활성화하는 중입니다.

  • enabled - 쓰기 전달이 활성화되었습니다.

  • enabling - 쓰기 전달을 활성화하는 중입니다.

  • null - 이 DB 클러스터에서는 쓰기 전달을 사용할 수 없습니다.

  • requested - 쓰기 전달이 요청되었지만 아직 활성 상태가 아닙니다.

쓰기 전달과 애플리케이션 및 SQL 호환성

다음과 같은 종류의 SQL 문을 쓰기 전달과 함께 사용할 수 있습니다.

  • INSERT, DELETEUPDATE와 같은 데이터 조작 언어(DML) 문입니다. 다음 설명과 같이, 쓰기 전달과 함께 사용할 수 있는 이러한 명령문의 속성에는 몇 가지 제한 사항이 있습니다.

  • SELECT ... LOCK IN SHARE MODESELECT FOR UPDATE 문입니다.

  • PREPAREEXECUTE 문입니다.

특정 명령문은 쓰기 전달과 함께 DB 클러스터에서 사용할 때 허용되지 않거나 부실 결과를 생성할 수 있습니다. 따라서 DB 클러스터에 대해 기본적으로 EnableLocalWriteForwarding 설정이 비활성화됩니다. 활성화하기 전에 애플리케이션 코드가 이러한 제한 사항의 영향을 받지 않는지 확인하세요.

쓰기 전달에 사용하는 SQL 문에는 다음과 같은 제한 사항이 적용됩니다. 경우에 따라서는 쓰기 전달이 활성화된 DB 클러스터에서 명령문을 사용할 수 있습니다. 이 접근 방식은 aurora_replica_read_consistency 구성 파라미터를 통해 세션 내에서 쓰기 전달을 활성화하지 않은 경우에 작동합니다. 쓰기 전달로 인해 허용되지 않는 명령문을 사용하려고 하면 다음과 비슷한 오류 메시지가 표시됩니다.

ERROR 1235 (42000): This version of MySQL doesn't yet support 'operation with write forwarding'.
데이터 정의 언어(DDL)

라이터 DB 인스턴스에 연결하여 DDL 명령문을 실행합니다. 리더 DB 인스턴스에서 실행할 수 없습니다.

임시 테이블의 데이터를 사용하여 영구 테이블 업데이트

쓰기 전달이 활성화된 DB 클러스터에서 임시 테이블을 사용할 수 있습니다. 하지만 명령문이 임시 테이블을 참조하는 경우 DML 문을 사용하여 영구 테이블을 수정할 수 없습니다. 예를 들어 임시 테이블에서 데이터를 가져오는 INSERT ... SELECT 문을 사용할 수 없습니다.

XA 트랜잭션

세션 내에서 쓰기 전달이 활성화되어 있으면 DB 클러스터에서 다음 명령문을 사용할 수 없습니다. 쓰기 전달이 활성화되지 않은 DB 클러스터나 aurora_replica_read_consistency 설정이 비어 있는 세션 내에서 이러한 명령문을 사용할 수 있습니다. 세션 내에서 쓰기 전달을 활성화하기 전에 코드에서 이러한 명령문을 사용하는지 확인하세요.

XA {START|BEGIN} xid [JOIN|RESUME] XA END xid [SUSPEND [FOR MIGRATE]] XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER [CONVERT XID]
영구 테이블에 대한 LOAD 문

쓰기 전달이 활성화된 DB 클러스터에서는 다음 명령문을 사용할 수 없습니다.

LOAD DATA INFILE 'data.txt' INTO TABLE t1; LOAD XML LOCAL INFILE 'test.xml' INTO TABLE t1;
플러그인 문

쓰기 전달이 활성화된 DB 클러스터에서는 다음 명령문을 사용할 수 없습니다.

INSTALL PLUGIN example SONAME 'ha_example.so'; UNINSTALL PLUGIN example;
SAVEPOINT 문

세션 내에서 쓰기 전달이 활성화되어 있으면 DB 클러스터에서 다음 명령문을 사용할 수 없습니다. 쓰기 전달이 설정되어 있지 않은 DB 클러스터나 aurora_replica_read_consistency 설정이 비어 있는 세션 내에서 이러한 명령문을 사용할 수 있습니다. 세션 내에서 쓰기 전달을 활성화하기 전에 코드에서 이러한 명령문을 사용하는지 확인하세요.

SAVEPOINT t1_save; ROLLBACK TO SAVEPOINT t1_save; RELEASE SAVEPOINT t1_save;

쓰기 전달을 위한 격리 수준

쓰기 전달을 사용하는 세션에서는 REPEATABLE READ 격리 수준만 사용할 수 있습니다. Aurora 복제본에서도 READ COMMITTED 격리 수준을 사용할 수 있지만, 쓰기 전달에는 해당 격리 수준이 작동하지 않습니다. REPEATABLE READREAD COMMITTED 격리 수준에 대한 자세한 내용은 Aurora MySQL 격리 수준 단원을 참조하십시오.

쓰기 전달을 사용하여 멀티파트 문 실행

DML 명령문은 INSERT ... SELECT 명령문 또는 DELETE ... WHERE 명령문과 같이 여러 부분으로 구성될 수 있습니다. 이 경우 전체 명령문이 라이터 DB 인스턴스로 전달되어 그 위치에서 실행됩니다.

쓰기 전달을 사용한 트랜잭션

트랜잭션 액세스 모드가 읽기 전용으로 설정된 경우 쓰기 전달이 사용되지 않습니다. SET TRANSACTION 문 또는 START TRANSACTION 문을 사용하여 트랜잭션에 대한 액세스 모드를 지정할 수 있습니다. transaction_read_only 세션 변수의 값을 변경하여 트랜잭션 액세스 모드를 지정할 수도 있습니다. 쓰기 전달이 활성화된 DB 클러스터에 연결되어 있는 동안에만 이 세션 값을 변경할 수 있습니다.

장기 실행 트랜잭션이 상당한 기간 동안 명령문을 실행하지 않으면 유휴 제한 시간을 초과할 수 있습니다. 이 기간의 기본값은 1분입니다. 최대 1일로 늘리도록 aurora_fwd_writer_idle_timeout 파라미터를 설정할 수 있습니다. 유휴 시간 제한을 초과하는 트랜잭션은 라이터 인스턴스에서 취소됩니다. 다음 번 후속 명령문을 제출하면 시간 제한 오류가 수신됩니다. 그런 다음 Aurora는 트랜잭션을 롤백합니다.

이러한 유형의 오류는 쓰기 전달을 사용할 수 없는 다른 경우에 발생할 수 있습니다. 예를 들어 DB 클러스터를 다시 시작하거나 쓰기 전달을 비활성화하면 Aurora가 쓰기 전달을 사용하는 트랜잭션을 취소합니다.

로컬 쓰기 전달을 사용하는 클러스터의 라이터 인스턴스가 다시 시작되면 로컬 쓰기 전달을 사용하는 리더 인스턴스의 활성 상태이며 전달된 트랜잭션 및 쿼리가 모두 자동으로 닫힙니다. 라이터 인스턴스를 다시 사용할 수 있게 되면 이러한 트랜잭션을 다시 시도할 수 있습니다.

쓰기 전달에 대한 구성 파라미터

Aurora DB 파라미터 그룹에는 쓰기 전달 기능에 대한 설정이 포함되어 있습니다. 이러한 파라미터에 대한 자세한 내용은 다음 표에 요약되어 있으며, 표 뒤에 사용 참고 사항이 나와 있습니다.

파라미터 범위 유형 기본값 유효값
aurora_fwd_writer_idle_timeout 클러스터 부호 없는 정수 60 1–86,400
aurora_fwd_writer_max_connections_pct 클러스터 부호 없는 긴 정수 10 0–90
aurora_replica_read_consistency 클러스터 또는 인스턴스 Enum ''(Null) EVENTUAL, SESSION, GLOBAL

수신되는 쓰기 요청을 제어하려면 다음 설정을 사용하세요.

  • aurora_fwd_writer_idle_timeout - 라이터 DB 인스턴스가 연결을 닫기 전에 리더 인스턴스로에서 전달된 연결의 활동을 기다리는 시간(초)입니다. 세션이 이 기간 동안 유휴 상태로 유지되면 Aurora에서 세션이 취소됩니다.

  • aurora_fwd_writer_max_connections_pct - 리더 인스턴스에서 전달된 쿼리를 처리하기 위해 라이터 DB 인스턴스에서 사용할 수 있는 데이터베이스 연결의 상한입니다. 이 값은 라이터에 대한 max_connections 설정의 백분율로 표시됩니다. 예를 들어 max_connections가 800이고 aurora_fwd_master_max_connections_pct 또는aurora_fwd_writer_max_connections_pct가 10이면 라이터는 최대 80개의 동시 전달 세션을 허용합니다. 이러한 연결은 max_connections 설정을 통해 관리되는 동일한 연결 풀에서 발생합니다.

    이 설정은 쓰기 전달이 활성화된 경우 라이터에만 적용됩니다. 값을 줄이면 기존 연결은 영향을 받지 않습니다. Aurora는 DB 클러스터에서 새 연결을 생성하려고 할 때 설정의 새 값을 고려합니다. 기본값은 max_connections 값의 10% 를 나타내는 10입니다.

참고

aurora_fwd_writer_idle_timeout 및 aurora_fwd_writer_max_connections_pct는 DB 클러스터 파라미터이므로 각 클러스터의 모든 DB 인스턴스에서 이러한 파라미터의 값이 동일해야 합니다.

aurora_replica_read_consistency에 대한 자세한 정보는 쓰기 전달을 위한 읽기 일관성 섹션을 참조하십시오.

DB 파라미터 그룹에 대한 자세한 내용은 Amazon Aurora의 파라미터 그룹 단원을 참조하십시오.

전달된 트랜잭션 및 쿼리 식별

information_schema.aurora_forwarding_processlist 테이블을 사용하여 전달된 트랜잭션 및 쿼리를 식별할 수 있습니다. 이 테이블에 대한 자세한 내용은 information_schema.aurora_forwarding_processlist 섹션을 참조하세요.

다음 예시는 라이터 DB 인스턴스에 있는 전달된 연결을 모두 보여줍니다.

mysql> select * from information_schema.AURORA_FORWARDING_PROCESSLIST where IS_FORWARDED=1 order by REPLICA_SESSION_ID; +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | IS_FORWARDED | REPLICA_SESSION_ID | REPLICA_INSTANCE_IDENTIFIER | REPLICA_CLUSTER_NAME | REPLICA_REGION | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+---------------------------------------+ | 648 | myuser | IP_address:port1 | sysbench | Query | 0 | async commit | UPDATE sbtest58 SET k=k+1 WHERE id=4802579 | 1 | 637 | my-db-cluster-instance-2 | my-db-cluster | us-west-2 | | 650 | myuser | IP_address:port2 | sysbench | Query | 0 | async commit | UPDATE sbtest54 SET k=k+1 WHERE id=2503953 | 1 | 639 | my-db-cluster-instance-2 | my-db-cluster | us-west-2 | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+

전달하는 리더 DB 인스턴스에서 SHOW PROCESSLIST를 실행하여 이러한 라이터 DB 연결과 관련된 스레드를 볼 수 있습니다. 라이터의 REPLICA_SESSION_ID 값, 637, 639는 리더의 Id 값과 같습니다.

mysql> select @@aurora_server_id; +---------------------------------+ | @@aurora_server_id | +---------------------------------+ | my-db-cluster-instance-2 | +---------------------------------+ 1 row in set (0.00 sec) mysql> show processlist; +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ | 637 | myuser | IP_address:port1 | sysbench | Query | 0 | async commit | UPDATE sbtest12 SET k=k+1 WHERE id=4802579 | | 639 | myuser | IP_address:port2 | sysbench | Query | 0 | async commit | UPDATE sbtest61 SET k=k+1 WHERE id=2503953 | +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ 12 rows in set (0.00 sec)