WAL (Write-Ahead Logging)
Write-Ahead Logging 즉, 로그 먼저 쓰기 라고 할 수있는 WAL은 데이터베이스의 쓰기를 빠르게 완료하며, 데이터의 무결성과 일관성 유지에 매우 큰 역할을 한다.
WAL은 어떻게 데이터 쓰기를 빨리 할 수 있으며, 어떤 부분에서 무결성과 일관성 유지에 도움을 주는지 간략하게 설명해보도록 하겠다.
Data Write 란?
데이터베이스에 데이터를 변경하면, 저장되어있는 해당 디스크의 값을 바꿔주어야한다. 삽입과 삭제도 마찬가지다.
데이터베이스 성능에 가장 큰 영향을 주는 것이 물리적인 디스크 I/O 인데,
과연 데이터 하나 조그마한 것이 바뀔 때마다 디스크 I/O가 발생하면 빠를 수 있겠는가.
원초적인 이야기로 돌아가서 전반적인 데이터베이스의 구조와 엔진은 물리 디스크의 값을 읽어 메모리 버퍼에 저장 실제 읽기든 쓰기든 사용한다.
이 과정의 데이터를 쓰는 것을 간략하게 상상해서 적어보자면 아래와 같을 것 이다.
1. 물리적 디스크에서 변경 될 데이터 블럭을 찾아서 해당 블럭을 읽어와 메모리 버퍼에 캐싱한다.
2. 캐싱 된 데이터 블럭에 데이터를 변경한다.
3. 메모리 버퍼에 저장되어있는 변경 된 데이터 블럭과 같은 디스크 블럭을 다시 찾아가서 해당 디스크 블럭을 수정한다.
크게 이렇게 작업이 진행된다고 생각하면 되는데, 과연 똑같이 디스크 I/O가 발생하는데 어느점에서 빨라질까 싶다.
실제 Write 과정
실제로 데이터베이스 엔진에서 WAL을 활용하여 디스크에 데이터를 쓰는 과정은 전반적으로 아래와 같다.
1. 물리적 디스크에서 변경 될 데이터 블럭을 찾아서 해당 블럭을 읽어와 메모리 버퍼에 캐싱한다.
2. 캐싱 된 데이터 블럭에 데이터를 변경한다.
3. 캐싱 된 데이터 블럭의 데이터를 더티 블럭이라 표시하고, 해당 변경 사항을 WAL에 트랜잭션 순으로 저장한다.
4. 특정 시점에 체크포인트가 발생하면, WAL에 쓴 변경사항을 디스크에 쓴다.
대략적으로 이 과정 데이터 쓰기가 진행되며 WAL에 기록이 완료된 시점부터는 데이터 유실이 방지되며, 이 상태부터 COMMIT 상태이다.
데이터를 쓰는데 있어서 메모리 버퍼에서 수정을 완료하며, 그 내용을 WAL에 순차적으로 기록하는데, WAL 또한 물리적인 파일이기에 디스크 I/O가 발생한다.
똑같은 디스크 I/O가 발생하지만 WAL에 기록하는 것이 데이터 블럭에 쓰는 것보다 빠른 이유는 아래와 같다.
1. 데이터 블럭에는 하나하나 찾아가며 기록해야하지만, WAL에는 순차적으로 기록한다.
- 데이터 블럭을 쓰는데 있어서 랜덤 I/O이냐, 순차 I/O이냐의 차이이다.
2. WAL에 기록되는 내용은 특정 시점에 발생하는 체크포인트에 의해 일괄적으로 데이터 블럭에 쓰인다.
- 발생된 내용을 모아 일괄적으로 반영하기에 랜덤 I/O를 최소화 할 수 있다.
이렇게 보니 어떻게하면 디스크에 랜덤 I/O 발생을 최소화 시키냐의 문제인 것 같다.
WAL을 쓰는 이유
WAL을 사용하는 가장큰 이유는 역시나 데이터를 빠르게 저장 할 수 있다는 점이다.
메모리상에서 데이터가 변경되었지만, 혹시나 발생할 수 있는 장애상황에 서버가 꺼진다면, 휘발성인 메모리에 변경사항은 다시 찾을 수 없을 것이다.
그렇다면 결국에 디스크에 기록을 해야 안전하게 보관이 가능한데, 데이터 쓰기에 설명했듯 WAL을 활용하여 최대한 빠르게 쓰기를 완료하여 데이터의 일관성과 무결성을 보장 할 수 있게 될 것이다.
여러 장점을 복합적으로 생각해야하지만, 하나하나 바라보면 아래와 같을 것이다.
디스크 I/O 성능 최적화
WAL을 쓰는 가장 큰 이유는 디스크 I/O의 최적화 일 것이다.
위에 데이터 쓰기에서도 말했지만, 결국엔 랜덤 I/O를 최소화 하고 순차 I/O를 통해 최대한 빠르게 쓰게 된다.
데이터를 먼저 최대한 빨리 쓰게됨에 따라 아래의 장점이 또 생긴다.
트랜잭션의 일관성 보장
최종 저장인 데이터 페이지에 쓰기전 휘발성으로 날라가는 메모리가 아닌 WAL 파일에 쓰기를 완료함에 따라
혹시나 모를 장애상태에도 쓰기가 완료된 WAL을 통해 트랜잭션이 진행된 데이터에 대해 잃어버리지 않고 일관성을 보장할 수 있게 된다.
복구와 장애상황 대응 용이
먼저 디스크에 쓴 WAL 파일에 문제가 생기지 않는한 잃어버리지 않는 데이터가 되며, WAL에 기록되는 데이터는
undo, redo 정보가 모두 포함되어있다.
해딩 WAL을 읽어 데이터베이스를 복구하는데 사용함에 따라 장애가 발생해도 WAL에 기록된 트랜잭션까지 복구를 할 수 있게 된다.
'DATABASE > Databse' 카테고리의 다른 글
[DBA] 여러 DBMS 마다의 DBA의 중점 역할 차이 (0) | 2024.11.25 |
---|---|
[Database] MVCC (Multi-Version Concurrency Control) - 다중 버전 동시성 제어 (1) | 2024.11.18 |
[DATABASE] OLTP / OLAP 란 무엇인가? (3) | 2024.10.28 |
[Database] ODBC 란? - DBMS 이기종 간의 접속에 대하여 (2) | 2023.08.07 |
[Database] 트랜잭션(Transaction)과 격리 수준(Isolation Level) (0) | 2023.07.16 |
DBA - 데이터베이스 관리자(DataBase Administrator) (0) | 2023.06.20 |