DB 이중화
데이터베이스 이중화는 두 개 이상의 데이터베이스 시스템을 동일한 데이터로 유지하는 프로세스를 의미한다. 따라서 데이터의 신뢰성과 가용성을 보장할 수 있다. 일반적으로 DB 이중화 기술로는 HA(High Availability)가 있다.
HA 구성은 기본적으로 하나 이상의 백업 시스템을 도입하여 주 서버가 다운되더라도 데이터베이스 서비스를 지속적으로 유지하는 방법이다. 즉, 한 대의 Active 서버와 한 대 이상의 Standby 서버를 두는 방식으로, 주 서버가 장애로 동작하지 않을 경우, 대기 서버가 주 서버의 역할을 수행한다. 대기 서버는 주 서버의 데이터를 지속적으로 복사하여 최신 상태를 유지하도록 한다.
고가용성을 제공하는 또 다른 방식으로는 여러 서버가 하나의 데이터베이스를 공유하게 하는 클러스터링 방식이 존재하는데, 오라클에서는 RAC (Real Application Clusters) 방식을 제공한다.
RAC (Real Application Clusters)
Oracle RAC 방식은 여러 개의 인스턴스가 하나의 데이터베이스를 공유하게하는 클러스터링 방식을 사용한다. 이는 각 노드 간에 데이터베이스가 공유되므로, 하나의 서버가 실패하더라도 다른 서버에서 데이터베이스 작업을 계속 수행할 수 있게 보장해준다. (TAF (Transparent Application Failover))
Oracle RAC는 동일한 데이터베이스를 공유하는 구조이기 때문에, 분산 환경에서 데이터의 일관성 유지가 중요하다. 여기서 데이터 일관성은 두 가지 측면에서 고려해야 한다.
1. 데이터 무결성 : 여러 노드에서 동일한 데이터를 동시에 수정하는 것을 막아야 한다. 이를 위해 RAC는 한 노드에서 수정중인 레코드는 다른 인스턴스에서 수정할 수 없도록 해 데이터의 일관된 수정을 보장하며, 모든 노드가 동일한 데이터 뷰를 가질 수 있게 된다.
2. 트랜잭션 일관성 : 동일한 트랜잭션 내에서 모든 변경 사항이 원자적으로 적용되어야 한다. 이를 위해 Oracle RAC는 각 인스턴스가 고유한 undo tablespace를 가짐으로써 트랜잭션을 독립적으로 수행할 수 있게 해줌으로 트랜잭셔을 일관성을 유지시킨다.
또한, RAC의 또 다른 특징으로 확장성이 있다. 필요에 따라 더 많은 노드를 추가함으로써 처리 사용량을 증가시킬 수 있는데, 각 노드는 자체 redo thread를 가지기 때문에, 새로운 노드를 추가하면 즉시 데이터베이스 변경 작업에 참여할 수 있다.
그런데 RAC 환경에서 여러 노드가 동일한 데이터에 동시에 접근하게 되면, 각 노드의 로컬 캐시에 있는 데이터 버전 간에 차이가 생길 수 있는데, 오라클은 Cache Fusion을 사용해 데이터 일관성 유지와 성능 향상 및 장애 복구 지원을 보장한다. Cache Fusion을 알아보기 전에 먼저 RAC Background Process 구성에 대해 알아보자.
RAC Background Processes
1. GCS (Globacl Cache Service) : 클러스터에서 공유되는 데이터 블록의 상태를 추적하고 관리한다. 각 노드에서 요청되는 데이터 블록에 대한 현재 위치와 상태 정보를 제공하여 클러스터 간 데이터 일관성을 보장한다.
2. GES (Global Resource Directory) : 클러스터 전체에서 공유되는 자원, 잠금과 트랜잭션에 대한 정보를 관리한다. 즉, 서로 다른 노드에서 동일한 자원에 대한 동시 요청을 조정하고 관리하여 데이터 일관성을 보장한다.
3. GRD (Global Resource Directory) : GCS, GES를 저장하는 논리적인 저장소로, GCS, GES가 추적하고 관리하는 모든 자원의 상태 정보를 가지고 있다. 클러스터의 모든 노드가 이 정보를 공유한다.
GCS, GES, GRD 프로세스들은 모든 노드가 백그라운드에서 실행되고 있으며, 이들은 Interconnect라는 고속의 네트워크 연결을 통해서 각 노드에서 서로 통신하고 데이터를 공유하게 되고, Cache Fusion 기술의 중요한 구성 요소로서 동작한다.
Cache Fusion
Cache Fusion은 다음과 같이 동작하는데, 한 노드에서 데이터 블록이 그 노드의 SGA에 없을 때, GCS(Global Cache Service)를 통해 해당 블록을 요청한다. GCS는 블록의 최신 버전이 어느 노드의 SGA에 있는지 알고 있으므로, 해당 노드에게 블록을 전송하도록 요청하는 방식이다. 이 과정은 Oracle RAC 내부 프로토콜에 의해 관리되며, 블록의 소유권과 일관성을 관리하기 위해 복잡한 Lock 매커니즘을 사용한다.
Cache Fusion을 사용한 간단한 예시를 들어보자.
A, B 인스턴스가 동일한 데이터 블록을 가지고 있고, B 인스턴스에서 데이터 변경이 일어날 경우
1. 인스턴스 B에서 데이터 블록을 변경하려고 할 때, 먼저 GCS에게 해당 데이터 블록의 베타 락을 요청한다.
2. GCS는 모든 노드가 해당 데이터 블록에 대한 참조를 가지고 있는지 확인한 뒤, 인스턴스 A가 해당 데이터 블록을
가지고 있으므로 A에 대한 데이터 블록의 참조를 폐기하고 해당 블록의 최신 사본을 인스턴스 B에게 보내도록 요청
3. 인스턴스 B는 데이터 블록의 최신 사본을 받아들이고, 해당 블록을 변경한다.
4. 데이터 블록의 변경이 완료되면, 인스턴스 B는 GCS에게 변경이 완료되었음을 알리고, 데이터 블록에 대한 베타 락을 해제
참고
Real Application Clusters Administration and Deployment Guide
Provides an overview of Oracle Real Application Clusters (Oracle RAC) installation and administration, and various components and functions.
docs.oracle.com
[오라클] RAC(Real Application Cluster)이란?
일반적인 Oracle Server 구성방식* Process: A는 작업장1로 복사해와서 작업을 하고, B는 작업장2로 복사를 해와서 작업을 하며, 저장을 database에 합니다. 이렇게 instance와 database 사이를 왔다갔다 하면서
12bme.tistory.com
'DB' 카테고리의 다른 글
DB 테이블 파티셔닝 (0) | 2023.06.07 |
---|---|
DBCP (Database Connection Pool) (0) | 2023.05.17 |
Database Lock, Isolation Level (0) | 2023.04.27 |
인덱스 스캔 종류 (0) | 2023.04.12 |
Oracle 무작위 학습 (0) | 2022.12.06 |