DBA의 길

DBA 의 컴퓨터 공부 - write throuth , write back 그리고 Postgres

모모토 2024. 10. 20. 22:18
반응형

기존의 MCU가 아닌 리눅스 기준으로 write throuth , write back 을 정리해보자 차이라면 아마도 디스크냐 메모리에 기입이냐 차이가 아닐지싶다. 

 

write-through 방식은 캐시 데이터가 변경될 때 즉시 디스크에도 기록하는 방식이다. 성능은 낮지만, 데이터 일관성과 안정성을 보장하는 데 유리하다. 예를 들어, 매우 중요한 데이터를 다루는 시스템에서 write-through가 사용될 수 있다.

 

리눅스에서는 데이터를 캐시나 버퍼에 먼저 저장한 후, 일정 시점에 디스크로 기록하는 write-back 방식을 많이 사용한다. 이는 성능을 극대화하기 위한 것이며, 시스템 충돌이나 전원 장애 시 데이터 손실의 위험이 있을 수 있다. 그러나 데이터베이스나 파일 시스템에서 로그WAL을 사용해 데이터 복구를 보장하는 추가적인 안전 장치를 마련해 둔다.

 

PostgreSQL에서 write-back과 write-through 방식은 데이터 저장 및 처리에 있어 중요한 역할을 한다. 이 두 개념은 PostgreSQL의 데이터베이스 성능과 안전성 간의 균형을 유지하는 데 사용된다. 각각의 개념과 PostgreSQL에서의 활용 방식을 설명해보겠다.

 1. Write-back

PostgreSQL에서 write-back은 데이터를 먼저 메모리(Buffer Pool)에 기록한 후, 나중에 디스크에 기록하는 방식이다. 즉, 데이터가 즉시 디스크에 쓰이지 않고 메모리에 일시적으로 저장되며, 적절한 시점에 디스크로 플러시된다. 이 시점은 시스템에 따라 다르며, checkpoint나 background writer와 같은 메커니즘을 통해 이루어진다.

PostgreSQL은 성능을 높이기 위해 먼저 데이터를 메모리에서 처리하고, 디스크 I/O 작업을 지연시킨다. 데이터가 메모리에 저장된 상태로 남아 있지만, 실제 디스크에 쓰이는 시점은 나중에 발생한다. 이 방식은 디스크 I/O 병목을 줄이고 성능을 극대화하는 데 큰 도움을 준다. 특히, 대량의 트랜잭션을 처리할 때 디스크에 자주 기록하지 않음으로써 효율적으로 시스템 자원을 관리할 수 있다.

이 방식을 보완하기 위해 PostgreSQL은 WAL(Write-Ahead Logging) 시스템을 사용하여 데이터가 실제로 디스크에 기록되기 전에 로그 파일에 트랜잭션 내역을 기록한다. 시스템이 충돌하거나 장애가 발생했을 때, WAL 로그를 통해 복구 작업을 진행할 수 있기 때문에, 데이터 손실을 방지할 수 있다. 

그러나 write-back 방식은 데이터가 메모리에만 존재하는 동안 장애가 발생하면 데이터 유실 가능성이 있다. 이런 위험을 줄이기 위해 PostgreSQL은 일정한 주기로 checkpoint를 수행하여 메모리에 있는 데이터를 안전하게 디스크로 기록한다.

 2. Write-through

Write-through 방식은 데이터를 메모리에 기록하는 동시에 디스크에도 즉시 기록하는 방식이다. 이 방법은 PostgreSQL에서 기본적인 데이터 쓰기 방식은 아니지만, WAL 로그를 처리할 때 유사한 방식으로 동작한다. 트랜잭션이 커밋될 때, WAL 로그는 디스크에 즉시 기록되므로 장애가 발생해도 트랜잭션 로그를 복구할 수 있다.

PostgreSQL에서 `fsync_writethrough` 옵션을 사용하면, WAL 로그는 디스크의 캐시를 사용하지 않고 디스크에 직접 기록된다. 이 방식은 데이터의 안전성을 극대화하지만, 성능 저하의 단점이 있다. 디스크 캐시를 우회하기 때문에 디스크 I/O 작업이 자주 발생하고, 이로 인해 성능이 떨어질 수 있다.

Write-through 방식은 데이터 일관성을 보장하며, 트랜잭션이 커밋될 때마다 즉시 디스크에 반영되기 때문에, 데이터 유실 가능성을 최소화한다. 그러나 성능이 저하될 가능성이 있어 성능보다 데이터 안전성을 우선시하는 환경에서 주로 사용된다.

 PostgreSQL에서의 활용

PostgreSQL은 기본적으로 write-back 방식을 사용하여 성능을 최적화한다. 데이터가 메모리에 먼저 기록되고, 나중에 디스크로 기록되기 때문에 디스크 I/O 부담이 적어지고, 데이터 처리 속도가 매우 빠르다. 하지만 데이터의 안전성도 중요하기 때문에, 트랜잭션 로그는 write-through 방식으로 WAL에 즉시 기록되며, 이를 통해 장애가 발생해도 데이터를 안전하게 복구할 수 있다.

결론적으로, PostgreSQL은 write-back 방식을 통해 성능을 높이고, write-through 방식을 WAL 로그에 적용하여 데이터의 안전성을 확보하는 전략을 사용한다.