RAC 캐시 퓨전

  • 데이터베이스의 부하를 분산할 목적으로 시스템마다 다양한 분산전략을 사용하는데, 최근에는 데이터베이스를 물리적으로 분할하여 분산하는 방식이 아니라, 데이터베이스를 하나로 두되 이를 엑세스하는 인스턴스를 여러 개 두는 공유 디스크(Shared Disk)방식의 데이터베이스 클러스터링 기법이 도입되기 시작했다.
  • 오라클 RAC모델은 공유디스크 방식에 기반을 두면서 인스턴스 간에 버퍼캐시까지 공유하는 캐시퓨전(Cache Fusion)기술로 발전하였다.
  • 많은 장점이 있는데도 불구하고, 튜닝이 잘 되지 않아 많은 블록I/O를 일으키는 애플리케이션에서 RAC를 도입하면, 단일 인스턴스 환경에서보다 더욱 심각한 성능저하현상이 나타나며, RAC 모델특성 상 발생하는 성능문제를 해결하기 위해서는 캐시퓨전 프로세싱 원리를 이해할 필요가 있다.
  • 글로벌 캐시
    • 클러스터링 되어있는 모든 인스턴스 노드의 버퍼캐시를 하나의 버퍼캐시로 간주한다.
    • 모든 데이터 블록에 대해서 마스터 노드가 각각 정해져 있고, 그 노드를 통해서 글로벌 캐시에 캐싱되어 있는 블록의 상태와 Lock정보를 관리한다.
  • Current 블록
    • Shared 모드 Current(SCur)와 Exclusive 모드 Current(XCur)로 나뉨
    • SCur상태의 블록은 동시에 여러 노드에 캐싱될 수 있지만, XCur상태의 블록은 단 하나의 노드에만 존재할 수 있다.
  • RAC 노드간 버퍼캐시를 공유하면서 블록을 서로 주고받는 전송 매커니즘은 5가지로 나누어 설명할 수 있다.

전송 매커니즘

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

노드A는 K블록을 읽고 싶다규~\!

  1. 노드A : 마스터\! 나 K블록을 읽고 싶어요\!
  2. 마스터(노드B) : 잠깐\~ 다른 노드에서 사용하고 있는지 보구.. 사용(캐싱)하고 있지 않네..읽어랏(권한부여)\!
  3. 노드A : OK\~ (디스크에서 K블록을 읽어 로컬 캐시에 저장)
(2) 읽기/읽기 전송: Read to Read Transfer

노드C도 K블록을 읽고 싶다규~\!

  1. 노드C : 마스터\! 나 K블록을 읽고 싶어요\!
  2. 마스터(노드B) : 잠깐\~ 다른 노드에서 사용하고 있는지 보구.. A노드가 사용(캐싱)하고 있네. A노드야. K블럭 C노드가 필요하다니까 좀 복사해줘라\~
  3. 노드A : OK\~ (C노드에게 K블록 전송)
  4. 노드C : 마스터\! A노드가 블록 잘 줬어요\~
(3) 읽기/쓰기 전송: Read to Write Transfer

노드C가 K블록을 업그레이드하고 싶다~\!

  1. 노드C : 마스터\! 나 K블록을 업그레이드하고 싶어요.
  2. 마스터(노드B) : (어랏\! 노드A도 해당 블록을 캐싱하고 있네..) A노드야\~ C노드가 니가 가지고 있는 K블럭 업그레이드 하겠단다. Null모드로 다운그레이드해라\!
  3. 노드A : (Null모드로 다운그레이드 후에) 노드C야\~ 나 다운그레이드 했다.
  4. 노드C : (K블록을 XCur모드로 업그레이드 한 후에), 마스터\! 나 K블록 XCur모드로 업그레이드 했고요~\! 노드A도 Null모드로 다운그레이드했데요.
(4) 쓰기/쓰기 전송: Write to Write Transfer

노드A도 K블록을 업그레이드하고 싶다~\!

  1. 노드A : 마스터\! 나 K블록을 업그레이드하고 싶어요.
  2. 마스터(노드B) : (어랏\! 노드C가 해당 블록을 캐싱하고 있네..) C노드야\~ A노드가 니가 가지고 있는 K블럭 업그레이드 하겠단다. 니가 가지고 있는 K블록 A노드에게 보내줘라.
  3. 노드C : (블록 A노드에게 보내주고, 자신이 가지고 있던 블록은 Null모드로 다운그레이드한다. ) => 자신이 XCur모드로 가지고 있던 블록이 아직 커밋하지 않아 로우Lock이 걸린 상태일수 있다.
  4. 노드A : 마스터\! 나 K블록 XCur모드로 받았어요.

다른 인스턴스가 갱신 중인 블록을 읽고자 할 때 로우 Lock이 해제될 때까지 기다리지 않고 로우Lock이 설정된 채, 블록을 주고 받는다.

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

노드C는 K블록을 읽고 싶다~\!

  1. 노드C : 마스터\! 나 K블록을 읽고 싶어요.
  2. 마스터(노드B) : (어랏\! 노드A가 해당 블록을 캐싱하고 있네..) A노드야\~ C노드가 니가 가지고 있는 K블럭 읽고 싶단다. 니가 가지고 있는 K블록 A노드에게 보내줘라.
  3. 노드A : 블록을 C노드에게 보내주고, 자신이 가지고 있던 블록은 SCur모드로 다운그레이드한다.
  4. 노드C : 마스터\! 나 K블록 SCur모드로 받았어요. 노드A도 SCur모드로 다운그래이드했데요.

=> XCur모드 블록을 가지고 있는경우, 이 블록의 커밋여부에 따라 처리가 다르다.
커밋하지 않았으면 Current블록을 보내지 않고 CR Copy를 만들어 전송한다.
커밋되었다면 일정 횟수까지는 CR Copy를 전송하고, 일정 횟수가 넘어가면 Current 블록을 보내준다.
CR Copy를 보내는 횟수는 \_fairness_threshold 파라미터에 의해 결정됨

dynamic remastering

리소스 친화도에 따라 마스터 노드가 동적으로 변할 수 있다. 리소스의 OwnerShip은 A가 가지고 있으나, B가 반복적으로 요청한다면, 해당 리소스의 마스터 노드가 B로 변경될 수 있다는 것이다. 자주 사용하는 리소스를 자신이 직접 관리하므로 RAC 성능 향상에 도움을 준다.

문서에 대하여

  • 최초작성자 : 오정희
  • 최초작성일 : 2010년 1월 18일
  • 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
  • {*}이 문서의 내용은 (주)비투엔컬설팅에서 출간한 '오라클 성능 고도화 원리와 해법I'를 참고하였습니다.*