ROC 캐시 퓨전

데이터베이스 분산 전략
  • 데이터베이스 서버간 복제
    • 여러대의 데이터베이스 서버를 두고 각 서버에서 발생한 트랜잭션 데이터를 상호 복제
    • 실시간 동기화가 펼요할 때는 복제 과정에서 부하 발생
  • 업무별수직분할
    • 업무영역별 데이터베이스를 따로 두고 각각 다른 테이블을 관리
    • 다른 영역의 데이터는 분산(Remote) 쿼리를 이용해 조회
    • 분산 쿼리로 자주 액세스되는 공통 영역의 범위 문제 발생
  • 데이터 구분에 따른수평 분할
    • 스키마는 같지만 데이터 구분에 따라 데이터베이스를 따로 가져가는 방식
캐시 퓨전 원리
  • RAC는 글로벌 캐시 (Global Cache)라는 개념을 사용한다. 즉 클러스터링 돼 있는 모든 인스턴스 노드의 버퍼 캐시를 하나의 버퍼 캐시로 간주
    로컬 캐시 (Local Cache)에 없더라도 다른노드에 캐싱돼 있다면 디스크 1/0를 일으키지 않고그것을가져와읽거나쓸수있다.
  • 모든 데이터 블록에 대해 마스터 노드가 각각 정해져 있고 그 노드를 통해 글로벌 캐시에 캐싱돼 있는 블록의 상태와 Lock 정보를 관리한다.
    (마스터 노드는 각 블록 주소의 해시 값에 의해 인스턴스가 기동되는 시점에 동적으로 정해진다)
    {note:title=Current 블록}
    Current 블록은 디스크로부터 읽혀진 후 사용자의 갱신사항이 반영된 최종 상태의 원본 블록을 말하며,
    CR 블록은 Current 블록에 대한 복사본이다. CR 블록은 여러 버전이 존재할수 있지만 Current 블록은 오직 한 개뿐이다.
    {note}
RAC 환경에서의 Current 블록 ( SCur )
  • Shared 모드 Current
    • 동시에 여러 노드에 캐싱
    • 자주 읽히는 데이터 블록을 각 노드가 SCur 모드로 캐싱하고 있을 때 가장 효율적인 상태
    • XCur 모드로 업그레이드를 요청하는 순간 다른 노드에 캐싱돼 있던 SCur 블록들은 모두 Null 모드로 다운그레이드 된다.
  • Exclusive 모드Current
    • 단 하나의 노드에만 존재할 수 있다.( XCur)
전송 메커니즘

(1) 전송 없는 읽기 : Read with No Transfer

  • A 노드에서 K 블록을 읽으려고 하는데 현재 어떤 노드에도 캐싱돼 있지 않은 상태
  1. K 블록을 읽으려고 하는 A 노드는 그 블록의 리소스 마스터인 B 노드에게 전송 요청# K 블록을 읽으려고 하는 A 노드는 그 블록의 리소스 마스터인 B 노드에게 전송 요청
  2. K 블록을 캐싱하고 있지 않음을 확인하고, A 노드에게 SCur 모드로 읽도록 권한부여
  3. A 노드는 디스크에서 블록을 읽어 로컬 캐시에 캐싱

(2) 읽기/읽기 전송 : Read to Read Transfer

  • A 노드만 K 블록을 SCur 모드로 캐싱한 상태에서 C 노드가 같은 K 블록을 SCur 모드로읽으려고한다.
  1. C 노드는 리소스 마스터인 B 노드에게 K 블록에 대한 전송요청 (gccr request 이벤트 발생)
  2. B 노드는 현재 K 블록을 A 노드가 캐싱하고 있음을 확인하고, C 노드에 블록을 전송을 A 노드에게 지시
  3. A 노드는 C 노드에게 블록을 전송
  4. C 노드는 블록을 성공적으로 전송받아 SCur 모드로 캐싱하게 되었음을 노드인 B에게 메시지를 보낸다.

(3) 읽기/쓰기 전송 : Read to Write Transfer

  • A와 C 노드 모두 K 블록을 SCur 모드로 캐싱하고 있다. 이제 C 노드가 K 블록을 XCur 모드로 업그레이드 하려고 한다. 물론 해당 블록을 갱신하려는 것이다.
  1. 마스터 노드인 B 에게 K 블록을 XCur 모드로 업그레이드 하겠다고 요청
  2. B 노드는 현재 K 블록을 A 노드도 캐싱하고 있음을 확인하고 Null 모드로 다운드레이드 하도록 지시
  3. A 노드는 C 노드에게 Null 모드로 다운그레이드 했음을 알려준다.
  4. C 노드는 K 블록을 XCur 모드로 업그레이드하고 그 결과를 마스터 노드인 B에게 알려준다

(4) 쓰기/쓰기 전송 : Write to Write Transfer

  • 현재 A 노드는 K 블록을 Null 모드로 갖고 있고 C 노드는 XCur 모드로 갖고 있다. C 노드가 갖고 있는 Current 벼전의 SCN은 154로 증가되었고,
    데이터파일에 있는 블록 SCN( System Commit Number)은 아직 123이므로 Dirty 버퍼 상태다. 이때, A 노드가 K 블록을 XCur 모드로 읽으려고 한다.
    물론 해당 블록을 갱신하려는 것이다.
  1. 마스터 노드인 B에게 K 블록을 XCur 모드로 요청.
  2. B 노드는 현재 K 블록을 C 노드가 Xαlr 모드로 캐싱하고 있음을 확인, A노드에게 보낼줄것을 지시
  3. C 노드는 A 노드에게 블록을 전송하고 자신이 갖고 있던 블록은 Null 모드로 다운그레이드한다
  4. A 노드는 K 블록을 XCur 모드로 캐성하게 됐음을 B 노드에게 알려준다

(5) 쓰기/읽기 전송 : Write to Read Transfer

  • 현재 A 노드는 K 블록을 XCur 모드로 갖고 있고 C 노드는 Null 모드로 갖고 있다. A 노드가 갖고 있는 Current 버전의 SCN은 168로 증가되었고
    데이터파일에 있는 블록 SCN은 여전히 123이므로 Dirty 버퍼 상태다. 이때, C 노드가 K 블록을 SCur 모드로 읽으려고한다.
  1. 마스터 노드인 B에게 K 블록을 SCur 모드로 요청한다
  2. B 노드는 현재 K 블록을 A 노드가 XCur 모드로 캐싱하고 있음을 확인하고, C 노드에게 보내 주도록 지시
  3. A 노드는 C 노드에게 블록을 전송하고 자신이 갖고 있던 블록은 SCur 모드로 다운그레이드 한다.
  4. C 노드는 K 블록을 SCur 모드로 캐싱하게 됐음을 B 노드에게 알려준다.