MySQL 쿼리 프로파일
쿼리 프로파일 수집 방법 간단 정리 MyS...
오로라 페일오버 후에도 Read-Only 오류 발생: 최근에 회사 시스템에 갑작스럽게 고객이 몰리는 상황이 발생하였습니다. 현재 DB 사양으로 버틸 수 없다고 판단이 되어, 더 사양이 높은 리더 인스턴스를 추가하고, 인스턴스 추가가 완료된 뒤에 failover를 진행하여 신규 인스턴스로 Write 인스턴스를 변경했습니다. 헌데 Amazon Aurora 클러스터의 페일오버를 수행한 후 예상치 못한 --read-only
오류 메시지를 접하게 되었습니다. 이는 시스템의 안정성과 가용성을 높이기 위해 페일오버를 설정한 상황에서 발생한 것이어서 당황스러웠습니다. 이번 글에서는 이 현상의 원인과 해결 방법에 대해 상세히 알아보겠습니다.
애플리케이션에서 데이터베이스의 가용성을 높이기 위해 Aurora 클러스터의 Writer 인스턴스에 페일오버를 수행하였습니다. 페일오버 과정은 원활하게 진행되었지만, 그 후 애플리케이션에서 다음과 같은 오류 메시지가 발생하기 시작했습니다:
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
쓰기 작업을 시도할 때마다 이 오류가 발생하여 서비스 운영에 지장이 생겼습니다. 왜 페일오버 후에도 이런 오류가 발생하는 것일까요?
Aurora 클러스터에서는 데이터베이스 인스턴스에 연결하기 위해 엔드포인트(Endpoint)를 사용합니다. 주요 엔드포인트는 다음과 같습니다:
엔드포인트는 DNS 이름으로 제공되며, 클라이언트는 이 DNS 이름을 통해 데이터베이스 인스턴스의 IP 주소를 해석하고 연결합니다.
페일오버를 수행하면 새로운 Writer 인스턴스가 지정되고, 기존의 Writer는 Reader로 전환됩니다. 이때 클러스터 엔드포인트의 DNS 레코드가 업데이트되어 새로운 Writer의 IP 주소를 가리키게 됩니다.
하지만 클라이언트 측에서 DNS 캐싱이 발생하면 문제가 생깁니다:
--read-only
오류가 발생합니다.TTL(Time To Live) 설정 확인:
클라이언트 측 DNS 캐시 플러시:
sudo systemd-resolve --flush-caches
ipconfig /flushdns
애플리케이션에서 재시도 로직 추가:
--read-only
오류가 발생할 경우, 일정 시간 대기 후에 DNS를 다시 조회하고 연결을 재시도합니다.예시 코드 스니펫 (Java):
int retryCount = 0;
while (retryCount < MAX_RETRIES) {
try {
// 데이터베이스 연결 및 쓰기 작업 수행
break; // 성공 시 루프 탈출
} catch (SQLException e) {
if (e.getErrorCode() == 1290) { // Read-only 오류 코드
retryCount++;
Thread.sleep(RETRY_DELAY);
// DNS 캐시 무효화 (Java에서 가능하다면)
} else {
throw e; // 다른 오류는 재전달
}
}
}
연결 유효성 검사 설정:
예시 (HikariCP):
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://your-cluster-endpoint");
config.setUsername("username");
config.setPassword("password");
config.setMaximumPoolSize(10);
// 연결 테스트 쿼리 설정
config.setConnectionTestQuery("SELECT 1");
config.setConnectionTimeout(30000); // 30초
config.setMaxLifetime(1800000); // 30분
config.setValidationTimeout(5000); // 5초
AWS JDBC Driver for MySQL:
<!-- Maven 의존성 추가: -->
<dependency>
<groupId>software.aws.rds</groupId>
<artifactId>aws-mysql-jdbc</artifactId>
<version>1.1.5</version> <!-- 버전은 최신으로 업데이트 -->
</dependency>
// JDBC URL에 failoverStrategy 파라미터 추가:
jdbc:mysql:aws://your-cluster-endpoint:3306/dbname?failoverStrategy=failover
오로라 전용 드라이버에 대한 설명과 다운로드 링크는 오로라 공식 홈페이지에 있습니다. 링크 타고 들어가보시면 JDBC 외에도 Python과 ODBC 드라이버도 제공되고 있습니다. 이번 포스팅 내용과 밀접한 연관이 있는 “장애 조치 지원”이라는 항목에 “예” 라고 표기 되어 있고, 더 빠른 장애 조치 시간을 지원한다는 설명이 있습니다.
Aurora 클러스터에서 페일오버 후 --read-only
오류가 발생하는 주된 원인은 DNS 캐싱으로 인한 이전 Writer 인스턴스에의 연결 때문입니다. 이를 해결하기 위해서는 DNS 캐싱 설정을 검토하고, 애플리케이션에 재시도 로직을 구현하며, 연결 풀 설정을 최적화해야 합니다. 또한, AWS에서 제공하는 Aurora 전용 JDBC 드라이버를 사용하면 페일오버 상황에서 자동으로 연결을 관리하여 애플리케이션의 가용성을 높일 수 있습니다.
이번 경험을 통해 시스템의 고가용성을 달성하기 위해서는 인프라뿐만 아니라 애플리케이션 레벨에서도 세심한 고려가 필요하다는 것을 깨달았습니다. 여러분도 유사한 문제를 겪고 계시다면 이 글이 도움이 되길 바랍니다.
참조: AWS 공식 홈페이지의 관련 내용을 참고하여 작성하였습니다.