용어 정리
Database: 실제 데이터가 저장되는 물리적인 영역
Instance: 물리적 database 내의 데이터를 입출력 할 수 있도록 해주는 소프트웨어. SGA(공유 메모리)와 여러 프로세스가 결합한 것
HA(High Availability)
- 똑같은 장비 2개를 구축해서 active-standby 2개의 서버 구성
- active 서버에 문제가 발생했을 때 standby 서버가 active 상태로 바뀌어서 무중단 서비스 운영이 가능
단점
- 고비용: 추가적인 서버 비용 발생
- 데이터 동기화 문제
- active 노드에서 작업을 하다가 장애로 서버가 죽으면 standby 상태로 전환되어 작업을 계속할 수는 있지만 데이터는 날라간 상태
- 이 때 미러링 방식에 따라 성능이 달라짐
OPS(Oracle Parallel Server)
- 하나의 storage에 2개의 instance가 연결되어 있는 구성
- 이 때 storage는 디스크와 같은 저장장치, instance를 db 서버라고 보면 된다.
- RAC Ping: instance1에서 변경하고 커밋된 데이터는 storage에 저장된 뒤 instance2로 복사해오기 때문에 이 과정에서 딜레이가 생긴다.
HA vs OPS
HA
- 실제 서비스 운영에는 active 노드 하나만 사용되기 때문에 비효율적
- active에 장애가 날 경우 active 서버에서 하던 작업들은 모두 취소됨
- 서버 별로 storage를 별도로 가지고 있기 때문에 데이터 불일치 현상이 발생할 수 있음
- 2개의 서버로만 구성이 가능
OPS
- 2개 노드가 모두 active로 동작
- CTF나 TAF 설정이 되어있을 경우 기존 서버에 장애가 났을 때 기존 작업을 다른 서버로 이전 가능
- 1개의 storage를 공유하므로 한 서버에서 변경된 작업이 다른 서버에도 반영됨
- OPS나 RAC는 이론적으로 서버수의 제한이 없음
CTF, TAF, SCAN
RAC 구성시 CTF와 SCAN은 기본적으로 세팅되어 있음.
CTF(Connection Time Failover)
- 클라이언트에서 RAC DB로 접속을 시도했으나 해당 서버에 장애가 발생하여 접속이 안 되는 경우, 일단 에러를 받고 다음 접속 때 다른 DB 서버로 자동 접속 시켜주는 기능
TAF(Transparent Applicaiton Failover)
- 에러를 받지않고(애플리케이션은 장애가 발생했는지 모르게) 다른 살아있는 서버로 failover 시켜줌
- Client Side TAF, Server Side TAF 2개의 세팅 방법이 있는데 Client Side를 주로 사용
SCAN(Single Client Access Name)
- 여러 RAC 노드를 하나의 서버처럼 느끼도록 공통 IP(Name)를 사용하게 해주는 기능
- CTF는 클라이언트쪽에 모든 RAC DB 노드의 IP를 적어야 하는 반면에 SCAN은 Scan IP 하나만 적으면 됨
RAC(Real Application Cluster)
- 9i버전부터 적용
- OPS의 RAC Ping 문제를 개선
- Cache Fusion 기능: 서로 다른 instance에서 변경된 데이터를 디스크를 거치지 않고 바로 instance로 복사할 수 있는 기능
- N개의 instance와 1개의 database
Cache Fusion
- instance1에서 데이터를 변경하고 커밋한 후, 다른 사용자가 해당 데이터를 조회할 때 변경된 데이터가 디스크를 거치지 않고 interconnect를 통해 바로 instance2로 전달
- DB Buffer Cache
- SQL문을 수행할 때 필요한 데이터 블록을 디스크로부터 메모리로 올리는 영역
- 캐시 퓨전은 서로 다른 instance의 DB buffer cache에서 블록을 이동시키는 부분에서 발생
동작 방식
1. instance1이 GCS에 블록 읽기 요청을 요청한다. 이 때 GCS는 해당 블록이 instance2에 이미 있다는 것을 알고 있다.
2. GCS는 요청을 instance2로 보낸다.
3. instance2는 해당 블록을 instance1에 전송한다.
4. instance1이 블록을 받으면 GCS에 받았다는 사실을 알린다.
위 과정은 디스크 I/O없이 cache-to-cache interconnect로 전송된다.
Cache Fusion Access
Local Access
- 요청한 블록의 최신 블록이 local instance에 존재할 경우 instance간 동기화없이 액세스
Remote Access
- 요청한 블록이 다른 instance에 의해 수정되어 외부 instance에 존재할 경우 interconnect를 통해 블록을 복제하여 가져온 후 데이터에 액세스
- 로컬에 요청 블록이 없는 경우 마스터 노드에 요청을 보내고, 마스터 노드는 GRD를 확인하여 해당 블록이 어느 instance에 있는지 확인 후 요청을 전달한다. 이 때 블록이 존재하는 위치와 마스터 노드가 동일하면 2-way acess, 다르면 3-way access라고 한다.
Disk Access
- 마스터 노드가 확인했을 때 요청된 블록이 어느 instance에도 존재하지 않을 때
- 해당 블록을 Disk에서 불러와 자신의 DB buffer cache에 캐싱 후 액세스