페일오버 중 데이터 손실 - 제로가 아닌 RPO: 위 그림에서 볼 수 있듯이 고객은 일반적으로 가용성 도메인 간에 데이터베이스 인스턴스를 복제합니다. 이 복제는 AD1에 있는 주 데이터베이스에서 AD2의 “복제본”으로 비동기적으로 수행됩니다. 복제 데이터베이스는 주 데이터베이스보다 뒤처질 수 있습니다. 주 데이터베이스가 실패하고 복제본이 새 주 데이터베이스로 승격되면 지연으로 인해 일부 데이터 손실이 발생할 가능성이 있습니다. 승격된 복제본이 이전 주 데이터베이스보다 얼마나 뒤처져 있는지에 따라 데이터 손실량이 결정됩니다. 바닐라 PostgreSQL에서는 성능 오버헤드가 크기 때문에 덜 인기 있는 동기식 복제 기능이 이 문제에 대한 해결책입니다.
수동 승격 및 관리 복잡성: 고가용성을 달성하기 위해 다른 가용성 도메인에 복제본을 설정할 수 있지만 대기 복제본을 주 데이터베이스로 승격하는 것은 수동적이고 복잡한 과정입니다. 데이터 손실을 최소화하기 위해 신중하게 새 후보를 선택해야 하며, 마찬가지로 이전 주 데이터베이스를 클러스터에 다시 추가하려면 더 많은 수동 단계가 필요합니다. 예를 들어, 이전 주 데이터베이스는 클러스터에 다시 참여하기 전에 pg_rewind와 같은 도구를 사용하여 먼저 로컬에서 커밋된 초과 트랜잭션을 제거해야 할 수 있습니다.
읽기 복제본 생성 비용이 많이 들고 느림: 바닐라 PostgreSQL에서는 새 복제본을 생성하려면 주 데이터베이스의 데이터를 스냅샷하고 주 데이터베이스를 따라가야 합니다. 테라바이트에 있을 수 있는 대용량 데이터베이스의 경우 이 작업은 비용이 많이 들고 느립니다. 애플리케이션의 읽기 수요 급증에 대처할 수 있도록 고객은 데이터베이스 리소스를 과잉 공급해야 합니다. 각 복제본은 데이터베이스의 전체 복사본을 가져야 하므로 여러 복제본을 실행하는 데 드는 스토리지 비용이 비싸질 수 있습니다.
OCI Database with PostgreSQL 서비스에서는 기존 고객관리형 PostgreSQL(Vanilla)을 사용하는 고객들이 주로 겪는 문제점을 보완하기 위한 향상된 아키텍처로 서비스를 제공합니다.
이제 OCI Database with PostgreSQL의 업그레이드된 아키텍처가 위에서 언급한 이러한 문제를 어떻게 해결하고 OCI에서 PostgreSQL을 실행하고 관리하는 것을 매우 간단하게 만들어 주는지 살펴보겠습니다. PostgreSQL이 있는 OCI 데이터베이스에서는 확장성, 고가용성, 고성능 데이터베이스 서비스를 가능하게 하기 위해 특별히 설계된 새로운 데이터베이스 최적화 스토리지(DbOS) 계층으로 복제 및 내구성 문제를 밀어냅니다. DbOS는 3개의 가용성 도메인 지역의 여러 가용성 도메인에 데이터 블록을 복제하는 고내구성 네트워크 연결 스토리지를 제공합니다. 단일 AD 지역에서는 데이터가 여러 장애 도메인에 복제됩니다. 클러스터의 모든 PostgreSQL 노드는 동일한 네트워크 연결 스토리지에 액세스합니다. 각 대기 복제본은 더 이상 데이터베이스의 자체 복사본을 유지할 필요가 없습니다. 주 인스턴스는 공유 스토리지에 쓰고 대기 복제 인스턴스는 동일한 공유 스토리지에서 읽고 사용자 쿼리를 처리합니다.
OCI Database with PostgreSQL에서 사용되는 새로운 공유 스토리지 아키텍처는 안전성, 유연성, 효율성 및 성능 측면에서 여러 가지 이점을 제공합니다. PostgreSQL이 있는 OCI 데이터베이스는 완전히 다른 스토리지 아키텍처를 기반으로 하지만 여전히 바닐라 PostgreSQL과 완전히 호환됩니다. 따라서 기존 PostgreSQL 워크로드를 PostgreSQL이 있는 OCI 데이터베이스로 손쉽게 이전하거나 다시 쉽게 되돌릴 수 있습니다. DbOS는 내장된 복제와 같은 고성능 OCI 블록 스토리지 기능을 활용하는 공유 파일 시스템입니다.
내구성 (제로 RPO): DbOS는 다중 가용성 도메인 지역의 여러 가용성 도메인에 데이터를 복제하며, 전체 가용성 도메인의 손실을 견딜 수 있습니다. DbOS는 쿼럼 기반 복제를 사용하여 백그라운드에서 데이터 블록을 복제합니다. 주 노드가 실패하면 DB는 복제된 DbOS를 사용하는 다른 DB 노드에 페일오버 할 수 있으며, 새로 승격된 주 PostgreSQL 인스턴스는 데이터 손실 없이 인수 할 수 있습니다. 이전 주에 커밋된 모든 트랜잭션은 새 주에 존재합니다. DbOS 계층에서 복제를 수행하기 때문에 내구성을 위해 여러 복제 인스턴스를 실행할 필요가 없습니다. 예를 들어, 복제본 없이 단일 노드 OCI 데이터베이스의 PostgreSQL 인스턴스를 실행할 수 있지만 내구성을 희생하지는 않습니다. 이 단일 노드 설정에서도 제로 RPO를 보장받을 수 있습니다.
고가용성 (99.99%): OCI 데이터베이스의 PostgreSQL을 사용하면 몇 분 안에 클러스터의 다른 복제본으로 주를 자동으로 페일오버 할 수 있습니다. 복구 시간 목표가 몇 분 밖에 걸리지 않기 때문에 주 페일오버는 빠르고 애플리케이션에 거의 투명합니다. 페일오버를 투명하게 활성화하기 위해 주 엔드포인트는 새 주에 자동으로 이동되는 플로팅 IP 주소로 설정됩니다. 애플리케이션은 페일오버 후 애플리케이션에 대한 구성 변경 없이 자동으로 새 주에 데이터베이스 연결을 재설정합니다. 바닐라 PostgreSQL과 달리 주 페일오버를 시작하는 동안 복제 지연 및 데이터 손실을 걱정할 필요가 없습니다. 데이터 손실을 최소화하기 위해 특정 복제본을 수동으로 선택할 필요가 없습니다. 클러스터의 모든 인스턴스는 동일한 스토리지를 공유하므로 페일오버 시 새 주는 제로 데이터 손실을 보장합니다.
탄력성: 데이터베이스 스토리지는 모든 노드에서 공유되기 때문에 사용자 쿼리 워크로드 요구 사항을 충족하기 위해 빠르게 복제본을 생성하거나 삭제할 수 있습니다. 바닐라 PostgreSQL과 달리 주에서 데이터를 스냅샷하고 새 대기 PostgreSQL 인스턴스를 시작하기 위해 복제 노드에 복사할 필요가 없습니다. 따라서 PostgreSQL이 있는 OCI 데이터베이스에서 컴퓨트 인스턴스를 시작하는 것만큼 빠르게 대기 복제본을 만들 수 있습니다.
읽기 복제본의 수평 확장: OCI 데이터베이스의 PostgreSQL에서는 복제 노드가 데이터베이스 클러스터의 복제본 수에 관계없이 데이터베이스의 한 복사본만 유지하면 됩니다. 그 결과, OCI 데이터베이스의 PostgreSQL은 클라우드에서 바닐라 PostgreSQL을 실행하는 것에 비해 상당한 스토리지 비용 절감 효과를 제공합니다. 또한 OCI의 PostgreSQL 서비스는 비용을 최소화하기 위해 자동 스케일링과 함께 데이터에 대한 사용량 기반 가격 모델을 제공합니다.
낮은 복제 지연: 바닐라 PostgreSQL 읽기 복제본 설정에서 복제 지연은 주요한 과제입니다. 복제본은 주에서 수행된 모든 변경 사항을 재생하고 영구적으로 저장해야 하므로 특히 네트워크 파티션이 있는 경우 뒤처질 가능성이 높습니다. 공유 스토리지를 사용하면 복제본이 훨씬 적은 작업을 수행합니다. 캐시에 있는 페이지에 대한 변경 사항만 적용하면 되며, 이러한 변경 사항을 영구적으로 저장할 필요는 없습니다. 이 아키텍처를 사용하면 복제 지연은 일반적으로 몇 밀리초이므로 읽기 쿼리가 거의 실시간으로 실행되거나 완료될 수 있습니다.
효율적인 복제: OCI 데이터베이스의 PostgreSQL은 스토리지 계층에서 복제를 수행합니다. 따라서 주 인스턴스는 모든 복제본에 Write Ahead Log(WAL) 레코드를 물리적으로 전송할 필요가 없습니다. 대신, 새 변경 사항을 복제본에 알리고 각 복제본은 공유 스토리지에서 최신 WAL 레코드를 직접 읽습니다. 이를 통해 주에 걸리는 부하가 최소화
공유 스토리지 최적화 외에도 PostgreSQL이 있는 OCI 데이터베이스는 성능을 더욱 향상시키기 위해 다음과 같은 최적화를 구현했습니다.
원자적 쓰기(Atomic writes): DbOS는 “잘린 쓰기(torn writes)” 제거와 같은 알려진 데이터베이스 성능 위험에 대한 최적화를 구현합니다. 일반적으로 대부분의 데이터베이스는 데이터베이스가 사용하는 페이지 크기(PostgreSQL은 8KB 사용)가 기반 스토리지의 “원자적 쓰기 단위(atomic write unit)” 크기(일반적으로 512B 또는 4KB)와 일치하지 않을 때 발생하는 “잘린 쓰기(torn writes)”에 대한 일종의 보호가 필요합니다. 예를 들어, PostgreSQL은 마지막 체크포인트 이후 해당 페이지에 대한 첫 번째 수정인 경우 전체 8KB 페이지를 WAL에 먼저 쓴 다음 페이지를 디스크에 플러시합니다. 페이지 쓰기가 잘리면 PostgreSQL은 이전에 WAL에 쓴 전체 페이지를 사용하는 것으로 돌아가고 아무런 해가 없습니다. 그러나 이러한 보호 기능에는 대가가 따릅니다. WAL의 풍선 효과를 유발하며, 계획되지 않은 페일오버 시 복구 시간을 최소화하기 위해 필요한 빈번한 체크포인트로 인해 문제가 더욱 악화됩니다. DbOS에서 PostgreSQL 페이지에 대한 원자적 쓰기를 지원합니다. 스토리지 계층은 기존 페이지를 절대 덮어쓰지 않습니다. 대신, 항상 디스크의 새 위치에 페이지를 쓰고 논리적 파일 오프셋에서 디스크 위치로의 매핑 레이어를 유지하는 로그 구조 기법을 사용합니다. 오래된 페이지 버전은 주기적으로 가비지 컬렉션됩니다. 이로 인해 이중 쓰기가 방지됩니다.
최적화된 페이지 캐시: PostgreSQL은 일반적인 Linux 커널 페이지 캐시에 의존하는 고객관리형 PostgreSQL(Vanilla)과 달리 전용 캐시 계층을 사용합니다. OCI의 페이지 캐시 구현에는 다음과 같은 최적화가 포함되어 있습니다:
스토리지 수준 백업: 고객관리형 PostgreSQL(Vanilla)에서는 데이터베이스 백업을 유지하기 위해 WAL을 객체 스토리지에 복사하고 파일 시스템의 주기적인 스냅샷을 찍습니다. 이 과정은 주 노드의 네트워크와 CPU를 모두 사용합니다. PostgreSQL이 있는 OCI 데이터베이스는 백업을 스토리지 계층에 위임하여 백업에 대한 네트워크 및 CPU 오버헤드를 제거합니다.
가격 정책은 PostgreSQL 서비스 비용으로 시간당 CPU 사용량, 월별 Storage 사용량으로 책정되며, 추가로 생성되는 Compute의 CPU, Memory, Storage 성능옵션 사용량으로 책정됩니다.
앞서 자세히 논의한 바와 같이 PostgreSQL이 있는 OCI 데이터베이스 서비스는 비용, 성능, 확장성, 가용성, 내구성 측면에서 상당한 이점을 제공합니다. 이러한 이점의 대부분을 달성하는 핵심은 PostgreSQL이 클라우드 규모에서 보다 효과적으로 작동하도록 최적화하기 위해 특별히 설계된 DbOS와 DbFS에 기반합니다.
이 글은 개인적으로 얻은 지식과 경험을 작성한 글로 내용에 오류가 있을 수 있습니다. 또한 글 속의 의견은 개인적인 의견으로 특정 회사를 대변하지 않습니다.
Younghwan Cho DATAPLATFORM
oci postgresql open source database