미스터 역마살
SQL Server 아키텍처 본문
SQL Server 아키텍처
SQL Server Engine
SQL Server는 크게 두개의 Engine으로 구분된다.
Relational Engine
Relational Engine은 쿼리를 실행하기 위한 엔진으로써 쿼리 옵티마이저와 쿼리 실행기가 포함되어 있기 때문에 포괄적으로 쿼리 프로세스라고도 불린다. 쿼리의 Syntax를 체크, 쿼리 Tree를 만들고 옵티마이저가 실행계획을 만들며, 쿼리 실행기가 그 쿼리를 실행하게 된다. Relational Engine에는 아래의 기능들이 포함되어 있다.
- Command(CMD) Parser
Command Parser는 T-SQL 구문을 받아서 그 구문이 정상적인 구문인지 검사를 하고 오류가 있으면 syntax error를 클라이언트에 반환을 하며 그 구문이 정상적이면 Buffer Pool 영역의 Plan Cache를 검색하여 기존에 사용하고 있었던 Query Plan이 있다면 Query Executor로 없다면 Query Plan을 만들기 위해 쿼리문을 Query tree 로 쪼개어 Optimizer로 전달이 된다. - Query Optimizer
Query에 대해 효율적인 실행계획 및 SQL 재작성 등의 기능을 수행 한다. - Query Excutor
Query를 실행 시키는 역할을 한다.
Storage Engine
Storage Engine은 데이터에 대한 모든 I/O를 관리하는 액세스 메소드(Access Methods)를 포함해 물리적 작업을 하는 엔진이다. Storage engine에는 SQL Server에서 사용하는 영역중 가장 많은 영역을 차지하고 있는 Buffer Pool을 관리하는 Buffer Manager와 트랜잭션 격리 수준을 유지하기 위해 데이터 잠금을 처리하고 로그를 관리하는 Transaction Manager가 포함되어 있다.
- Access Methods
논리적인 페이지의 접근 횟수에 대한 모니터링을 하는 도구이다. 이를 통해 데이터베이스에 있는 데이터, 인덱스, 여유공간의 양을 모니터링 하여 각 서버 인스턴스에 대한 데이터 볼륨 및 족가화 상태를 나타낼 수 있다. - Buffer Manager
SQL Server에서 사용하는 메모리를 관리하는 영역이다. 페이지에서 일부 행을 읽어야 할 때 버퍼 관리자는 메모리에 해당 페이지가 있는지 확인을 하고 있으면 그 페이지를 Access Methods로 전달을 하고 없으면 디스크에서 해당 페이지를 읽어와 메모리 Data Cache 영역에 그 페이지를 올린다. - Transaction Manager
변경된 데이터가 디스크에 기록되기까지 유지되어야 하며 그 역할을 담당하는 것은 Transaction Manager이다. Transaction Manager에는 크게 두가지 요소가 있는데 Lock Manager와 Log Manager이다. Lock Manager는 데이터 동시성 및 트랜잭션 격리성을 보장하기 위하여 격리 수준을 설정하며 Log Manager는 트랜잭션 원자성과 지속성을 보장하기 위하여 존재를 한다. Access Methods는 변경된 내용을 코드로 만들어서 Transaction Manager에 요청을 하고 Transaction Manager는 Log Manager를 통해 그 내용들을 Transaction Log에 쓰는 작업을 하는데 이 작업을 writer-Ahead Logging(로그 미리쓰기)라고 한다. 이는 트랜잭션 속성중 원자성과 지속성을 보장하기 위하여 일어나는 작업이며 SQL Server가 시스템 장애로 부터 데이터를 복구할 수 있는 유일한 수단이 Transaction Log이다.
파일구조
물리적 구조
SQL Server의 파일 구조는 mdf,ndf,ldf로 나뉜다.어떤 데이터베이스에 테이블이 10개가 있다. 3개의 테이블을 가장 많이 사용하고 나머지 7개의 테이블은 거의 사용을 안한다고 생각해 보자. 이때 데이터베이스를 파일 그룹으로 생성하고 많이 사용하는 3개의 테이블을 프라이머리 파일그룹에 생성해 물리적인 하나의 디스크에 구축한다. 아울러 자주 사용하지 않는 7개의 테이블을 보조 파일 그룹에 생성해 또 다른 물리적인 디스크에 구축하는 것이다. 그렇게 되면 물리적으로 다른 디스크를 사용하게 되니 하나의 디스크를 사용 할 때 보다 데이터파일 사용의 경쟁이 줄 것이다. 이렇듯 보조 데이터 파일을 생성하여 데이터 관리를 효율적으로 하게되면 데이터 베이스의 성능을 높힐 수 있을 것이다.
ldf는 트랜잭션 로그 파일 그로써 트랜잭션의 처리내용 및 데이터 추가, 변경, 삭제 내용을 담고 있다. ldf는 데이터베이스를 복구하는데 사용되는 모든 로그정보가 들어 가있다. ldf가 2개 이상 있을수 있으며, 데이터베이스마다 적어도 하나의 ldf 파일은 있어야 한다.
mdf와 ndf는 실제 데이터가 들어가 있는 파일들이다. mdf는 주 데이터 파일(Primary Data File)으로써 실제 데이터가 저장되는 공간이다. 그리고 추가적으로 ndf 파일을 가질 수 있으며 ndf 파일은 mdf 이외에 추가적으로 데이터가 저장되는 공간이다. ndf를 사용하는 이점은 무엇일까?
논리적 구조
- page : 논리적인 데이터 읽기의 최소 단위로서 크기는 8kb
- Extent : page 공간이 부족할 경우 증분 되는 단위
- Heap/Index : ....
Write Ahead Logging(WAL)
무결성을 보장하는 방법이다. 데이터 수정을 하기 전 ldf 파일(Transaction Log File)에 먼저 기록을 하고 이것을 통해 장애 발생시 데이터를 복구 할 수있게 된다. 데이터 변경시 Log에 기록하고 Checkpoint 발생시 disk에 저장하게 된다. 일단 Log에 적히게 되면 누가 조회를 해도 같은 데이터를 보여주는 일관성(Consistency)를 보장하게 되고 서버가 다운되도 이미 Log에 기록 되어 있어 원자성(Atomicity)도 보장할 수가 있다.
Check Point
Dirty page(데이터가 변경되었지만 로그에만 기록되고 디스크에는 기록되지 않은 page)가 Buffer Pool 에서 디스크로 쓰여질 때는 CheckPoint가 발생하거나 LazyWriter가 발생했을 때다. CheckPoint는 퍼지알고리즘으로 발동이 되며 트랜잭션이 완료가 된 Dirty page를 물리적 디스크에 쓰게 된다. Checkpoint를 주기적으로 발생시키고 싶다면 SQL Server 구성옵션에서 Recovery Interval 옵션을 이용하면 된다. Checkpoint가 발생되는 주기를 보고 싶으면 시작 플래그에 3502를 주면 에러로그에 Checkpoint가 발생 시점 끝나는 시점을 기록하게 된다.
- Checkpoint와 복구 시점
- Roll Backup(undo) - Checkpoint가 발생하기 전에 시작된 트랜잭션이 있으면 취소
- Roll Forward(redo) - Checkpoint가 발생하기 전에 완료된 트랜잭션이 있으면 다시 실행
Lazy Writer
Lazywriter은 Buffer가 부족할 때 발생하는 Thread이며 LazyWriter은 Checkpoint와는 다르게 데이터 캐시에 존재하고 있는 Dirty page을 디스크에 기록하면서 완전 삭제를 한다. Checkpoint는 디스크에 기록하면 페이지를 Dirty page에서 더 이상 Dirty page가 아니라고 변경만 한다.
'Database > SQL SERVER' 카테고리의 다른 글
SQL Server 백업 및 복구 (0) | 2022.07.31 |
---|---|
SQL Server 고가용성 (0) | 2022.07.27 |