고성능의 DB 애플리케이션(Application)을 구축하려면 DBMS와 내부 아키텍처와 SQL 옵티마이저의 원리를 이해해야하기 때문에
오늘부터 DBMS(DataBase Management System) 중 대표적인 오라클(Oracle)에 대해 알아보겠습니다
사용자가 오라클에 접속하면 각 클라이언트(Client)를 위한 전용 서버 프로세스가
사용자에게 필요한 서비스(SQL을 파싱, 최적화 등)를 제공하고
스스로 처리하지 못하는 일들(데이터파일로부터 DB버퍼 캐시로 블록을 적재, Dirty 블록을 캐시에서 밀어내 Free블록을 확보, Redo 로그 버퍼를 비우는 일 등)은 OS, I/O 서브시스템, 백그라운드 프로세스 등에 신호를 보내 대신 일을 처리하도록 요청합니다
참고로 사용자가 리스너(Listener)에 연결 요청을 하는 순간 하나의 프로세스를 띄우고 PGA(Process Global Area) 메모리를 할당합니다
위의 그림에서 Memory Cache 영역에 SGA(Shared Global Area)는 빠른 데이터 입출력을 위한 것인데
그 중 DB Buffer Caches는 사용자가 입력한 데이터를 데이터 파일에 저장하고
이를 다시 읽는 과정에 거쳐 가는 영역은 DB Buffer Cache입니다
오라클에서 I/O는 블록(Block) 단위로 이루어지고 가장 많이 사용되는 자료구조(Data Structure)는 해시 테이블입니다
해시 테이블에 대해서는 알고리즘 카테고리에 C언어로 작성하는 시간을 따로 마련하겠습니다만 간단히 그려보면 아래와 같습니다
DB 캐시가 공유 메모리 영역인 SGA 내에 존재하므로 같은 리소스에 대한 엑세스를 반드시 직렬화(Serialization)해야합니다
이를 위해 구현된 일종의 Lock 메커니즘을 래치(Latch)라 하고 각 해시 체인은 래치(Latch)에 의해 보호됩니다
위의 그림에서 Buffer Header는 사용 빈도가 높은 데이터 블록들 위주로 구성될 수 있도록
LRU(Least Recently Used) 알고리즘을 사용해 관리됩니다
※ 버퍼(Buffer) 상태
- Free : 인스턴스 기동 후 아직 데이터가 읽히지 않아 비어 있는 상태(Clean Buffer)이거나, 데이터가 담겼지만 데이터파일과 서로 동기화 되어 있는 상태여서 언제든지 덮어 써도 무방한 버퍼 블록
- Dirty : 버퍼에 캐시된 이후 변경이 발생했지만, 아직 디스크에 기록되지 않아 데이터 파일 블록과 동기화가 필요한 버퍼 블록
- Pinned : 읽기 또는 쓰기 작업을 위해 현재 엑세스되고 있는 버퍼 블록
래치(Latch) 만으로 데이터 정합성(Intergrity)에 대한 고민은 해결되지 않는데
이를 해결하기 위해 버퍼 헤더로부터 버퍼 Lock을 획득하는 방식을 이용합니다
버퍼 Lock은 읽기만 할 때는 Share 모드, 변경할 때는 Exclusive 모드로 Lock을 설정하고
Exclusive 모드는 한 시점에 한 프로세스만이 획득할 수 있습니다
만약 다른 프로세스가 버퍼 Lock을 Exclusive 모드로 점유한 채 있다면
일단 버퍼 Lock 대기자 목록(Waiter List)에 등록하고 래치는 해제합니다(buffer busy waits 대기 이벤트 발생)
버퍼 Lock이 해제되어 획득 가능하면 획득하고 래치까지 다시 획득합니다
버퍼 Lock을 획득했다고 하는 것은 해당 버퍼에 Pin을 걸었다고도 표현합니다
버퍼 헤더에 Pin을 설정하려고 사용하는 오브젝트를 버퍼 핸들(Buffer Handle)이라고 부르고
버퍼 핸들을 얻어 버퍼 헤더에 있는 소유자 목록(Holder List)에 연결시키는 방식으로 Pin을 설정합니다
(참고로 사용자를 변경할 때는 DML Lock을 통해 보호하도록 되어 있는데
블록에 또 다른 Lock을 설정하는 이유는 오라클이 하나의 레코드를 갱신하더라도 블록 단위로 I/O를 수행하기 때문입니다)
추가로 버퍼를 읽고 나서 버퍼 Pin을 즉각 해제하지 않고 데이터베이스 Call이 진행되는 동안 유지하는
버퍼 Pinning 기능이 있는데 이는 래치 획득 과정을 생략하는 것을 말합니다
주말이 얼마 남지 않았네요-_- 한잔하러 가야하기에
오늘의 학습은 여기서 이만하고 다음 시간에 이어가도록 하겠습니다-_-
'DBMS' 카테고리의 다른 글
[DBMS] Oracle(오라클)_3 (0) | 2020.02.02 |
---|---|
[DBMS] Oracle(오라클)_2 (0) | 2020.02.01 |