Amazon Aurora DB 클러스터가 장애 조치된 후 읽기 전용 오류가 발생하는 이유는 무엇입니까?

3분 분량
0

Amazon Aurora DB 클러스터를 사용하고 있는데 장애 조치 후 다음 오류가 발생합니다. “MySQL 서버가 --read-only 옵션으로 실행 중이므로 이 문을 실행할 수 없습니다(The MySQL server is running with the --read-only option so it cannot execute this statement)” 이 오류를 해결하려면 어떻게 해야 하나요?

간략한 설명

Amazon Aurora DB 클러스터에서 다중 AZ 장애 조치가 발생하면 클러스터 엔드포인트가 자동으로 업데이트되어 라이터 및 리더의 새로 지정된 역할을 반영하고 이를 가리킵니다. 이전 라이터가 재부팅된 다음 기존 복제본이 라이터로 승격되는 동안 읽기 전용 모드로 설정됩니다.

읽기 전용 오류 메시지가 나타나면 이는 리더 역할의 기존 노드를 통해 데이터 정의 언어(DDL), 데이터 조작 언어(DML) 또는 데이터 제어 언어(DCL) 작업을 수행하려고 함을 의미합니다. Aurora MySQL에서 다음과 같이 innodb_read_only 변수를 확인하여 이를 확인할 수 있습니다.

mysql> show variables where variable_name='innodb_read_only';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | ON    |
+------------------+-------+
1 row in set (0.01 sec)

해결 방법

클러스터 라이터 엔드포인트 활용

Aurora 클러스터에서 DB 인스턴스의 역할은 변경될 수 있으므로 클러스터 라이터 엔드포인트를 사용하여 항상 최신 라이터를 가리키고 있는지 확인하는 것이 좋습니다. DB 인스턴스 엔드포인트 또는 직접 IP 주소를 사용하는 경우 장애 조치가 발생했음을 인식하지 못할 수 있으며 동일한 호스트에 다시 연결하면 읽기 전용 메시지가 표시됩니다. 이렇게 하면 의도한 대로 DDL/DML 변경을 수행할 수 없습니다.

DNS를 과도하게 캐시하지 않음

스마트 드라이버를 사용하지 않는 경우 장애 조치 이벤트가 발생한 후 DNS 레코드 업데이트 및 전파에 의존합니다. Aurora DNS 영역은 5초의 짧은 TTL(Time to Live)을 사용하므로 네트워크 및 클라이언트 구성에서 이를 더 이상 늘리지 않는 것이 중요합니다. DNS 캐싱은 운영 체제(OS), 네트워크 계층 및 애플리케이션 컨테이너와 같은 아키텍처의 여러 계층에서 발생할 수 있습니다. 이러한 각 계층이 구성되는 방식을 이해하는 것이 중요합니다. TTL이 5초가 넘는 의도하지 않은 DNS 캐싱이 있는 경우 장애 조치 후 이전 라이터에 다시 연결할 수 있습니다.

Java Virtual Machine(JVM)은 DNS를 무기한으로 과도하게 캐시할 수 있습니다. JVM이 호스트 이름을 IP 주소로 확인하면 지정된 기간(TTL) 동안 IP 주소를 캐시합니다. 일부 구성에서는 JVM이 다시 시작될 때까지 DNS 항목을 새로 고치지 않도록 JVM 기본 TTL이 설정됩니다. 이로 인해 장애 조치 후 읽기 전용 오류가 발생할 수 있습니다. 이 경우 주기적으로 새로 고쳐지도록 작은 TTL을 수동으로 설정하는 것이 중요합니다.

스마트 드라이버 사용

Amazon Aurora DB 클러스터 엔드포인트는 DNS 레코드 업데이트를 자동으로 전파하지만 프로세스가 즉시 수행되지는 않습니다. 이로 인해 데이터베이스에서 발생한 이벤트에 응답하는 데 지연이 발생할 수 있으며 애플리케이션에서 이벤트를 처리할 수 있습니다. 스마트 드라이버는 실시간에 가까운 INFORMATION_SCHEMA.REPCA_HOST_STATION 메타데이터 테이블을 통해 DB 클러스터 지형을 사용합니다. 이렇게 하면 연결을 적절한 역할로 라우팅할 수 있으며 기존 복제본에 대한 로드 밸런싱에 도움이 됩니다. MariaDB Connector/J는 Aurora MySQL에 대한 네이티브 지원이 있는 서드 파티 스마트 드라이버의 예입니다.

참고: 스마트 드라이버도 과도한 DNS 캐싱의 영향을 받을 수 있습니다.

연결된 인스턴스 테스트

Aurora 연결 관리 핸드북의 모범 사례에서 언급했듯이 스마트 드라이버를 사용하지 않을 때는 새 연결을 설정한 후 로그인한 인스턴스를 테스트하고 이해해야 합니다. 이렇게 하면 올바른 인스턴스에 연결되어 있는지 확인할 수 있습니다. @@innodb_read_only 변수를 사용하여 라이터 인스턴스 또는 Aurora 리더에 연결되어 있는지 테스트할 수 있습니다. 이 예에서는 라이터에 연결되어 있음을 의미하는 0 값을 보여줍니다.

mysql> select @@innodb_read_only; 
+--------------------+ 
| @@innodb_read_only | 
+--------------------+ 
| 0                  | 
+--------------------+ 
1 row in set (0.00 sec)

관련 정보

Amazon Aurora 연결 관리

DNS 이름 조회에 대한 JVM TTL 설정

DBA 연결 관리 핸드북

AWS 공식
AWS 공식업데이트됨 3년 전