내용으로 건너뛰기

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

3분 분량
0

Amazon Aurora MySQL 호환 버전 DB 클러스터가 장애 조치될 때 읽기 전용 오류가 발생하는 이유를 알고 싶습니다.

간략한 설명

Aurora MySQL 호환 DB 클러스터에서 다중 AZ 장애 조치가 발생하면 클러스터 엔드포인트가 자동으로 업데이트됩니다. 이전 라이터가 재부팅되고 읽기 전용 모드로 설정된 다음, Aurora가 기존 복제본을 라이터로 승격합니다. 엔드포인트는 이러한 변경 사항을 반영하고 새로운 라이터 및 리더 역할을 가리킵니다.

리더 역할을 사용하여 기존 노드를 통해 다음 작업 중 하나를 수행하면 읽기 전용 오류 메시지가 표시될 수 있습니다.

  • 데이터 정의 언어(DDL) 작업
  • 데이터 조작 언어(DML) 작업
  • 데이터 제어 언어(DCL) 작업

해결 방법

역할이 읽기 전용인지 확인

역할이 읽기 전용인지 확인하려면 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 MySQL 클러스터에서 DB 인스턴스의 역할이 변경될 수 있습니다. 클러스터 라이터 엔드포인트를 사용하여 항상 최신 라이터를 가리키도록 하는 것이 좋습니다. DB 인스턴스 엔드포인트 또는 직접 IP 주소를 사용하는 경우에는 장애 조치가 발생하는지 모를 수 있습니다. 동일한 호스트에 다시 연결하면 읽기 전용 오류가 발생하고 DDL 또는 DML 변경을 수행할 수 없습니다.

DNS를 과도하게 캐싱하지 말 것

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

Java 가상 머신(JVM)은 DNS를 과도하게 캐싱할 수 있습니다. JVM은 호스트 이름을 IP 주소로 해석할 때 지정된 기간 동안 IP 주소를 캐싱합니다. 일부 구성에서 JVM 기본 TTL은 JVM이 다시 시작될 때만 DNS 항목을 새로 고치며 장애 조치 후 읽기 전용 오류를 일으킬 수 있습니다. 이 문제를 해결하려면 DNS 항목이 주기적으로 새로 고쳐지도록 작은 TTL을 수동으로 설정하십시오.

AWS Advanced JDBC 드라이버 사용

Aurora MySQL DB 클러스터 엔드포인트는 DNS 레코드 업데이트를 자동으로 전파합니다. 데이터베이스에서 이벤트가 발생하면 DNS 레코드 업데이트가 지연될 수 있습니다. 이런 경우 애플리케이션이 이벤트를 처리합니다.

AWS Advanced JDBC(Java 데이터베이스 연결) 래퍼 드라이버INFORMATION_SCHEMA.REPLICA_HOST_STATUS 메타데이터 테이블을 통해 DB 클러스터 토포그래피를 사용합니다. 테이블이 거의 실시간으로 표시되기 때문에 AWS Advanced JDBC 래퍼 드라이버는 연결을 적절한 역할로 라우팅합니다. 또한 기존 복제본 전체에서 로드 밸런싱을 수행합니다. Java의 프록시 패턴을 사용하여 AWS Advanced JDBC 래퍼를 구현하십시오. 기본 Aurora MySQL 드라이버를 종속 항목으로 추가해야 합니다. 자세한 내용은 Baeldung 웹 사이트에서 Java의 프록시 패턴을 참조하십시오. GitHub 웹 사이트에서 AWS Advanced JDBC 래퍼를 다운로드할 수 있습니다.

자세한 내용은 Amazon RDS 다중 AZ DB 클러스터를 업그레이드할 때 Advanced JDBC 래퍼 드라이버를 사용하여 1초 이하의 가동 중지 시간 달성을 참조하십시오.

참고: 과도한 DNS 캐싱은 AWS Advanced JDBC 래퍼 드라이버에 영향을 미칠 수 있습니다. 자세한 내용은 Amazon Aurora의 애플리케이션 가용성 개선을 참조하십시오.

연결된 인스턴스 테스트

스마트 드라이버를 사용하지 않는 경우 새 연결을 설정한 후 인스턴스를 테스트합니다. 라이터 인스턴스에 연결되었는지 테스트하려면 @@innodb_read_only 변수를 사용하십시오. 0 값이 수신되면 라이터에 연결된 것입니다.

출력 예시:


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

관련 정보

Amazon Aurora MySQL 데이터베이스 관리자 핸드북

Amazon Aurora 엔드포인트 연결

AWS 공식업데이트됨 9달 전