Categories
Database Backup

> Discover why standard VM snapshots cause data corruption in transactional databases like PostgreSQL and SQL Server. Learn DBA best practices for application-consistent backups, avoiding VM stun, and ensuring data integrity with CloudSave.

DevOps 엔지니어와 시스템 관리자에게 가상 머신(VM) 스냅샷은 기본적인 도구입니다. 스냅샷은 위험한 패치, 주요 구성 변경 또는 애플리케이션 배포 전에 서버 상태를 빠르고 편리하게 캡처할 수 있는 방법을 제공합니다. 문제가 발생하더라도 몇 초 만에 롤백할 수 있습니다.

그러나 PostgreSQL, MySQL, Oracle 또는 Microsoft SQL Server와 같은 트랜잭션 데이터베이스에 동일한 방법론을 적용하면 VM 스냅샷은 안전망에서 시한폭탄으로 돌변합니다.

데이터베이스 백업을 위해 표준 하이퍼바이저 스냅샷에 의존하는 것은 데이터 손상, 찢어진 페이지(torn pages), 복구 불가능한 프로덕션 중단의 가장 흔한 원인 중 하나입니다. 이 기사에서는 하이퍼바이저와 데이터베이스 엔진 간의 아키텍처 충돌, 스냅샷 중 데이터 손상 메커니즘, 그리고 가상화된 데이터베이스를 안전하게 백업하기 위해 필요한 엔지니어링 모범 사례를 살펴봅니다.

아키텍처 충돌: 하이퍼바이저 vs 데이터베이스 엔진

VM 스냅샷이 왜 데이터베이스를 위험에 빠뜨리는지 이해하려면, 먼저 두 시스템이 상태와 I/O 작업을 관리하는 방식을 살펴봐야 합니다.

하이퍼바이저가 스냅샷을 실행하는 방식

하이퍼바이저(VMware ESXi, Microsoft Hyper-V, KVM 등)가 스냅샷을 생성할 때 디스크를 복사하지 않습니다. 대신 현재 가상 디스크 파일(예: .vmdk 또는 .vhdx)을 읽기 전용 상태로 고정하고 새로운 델타 디스크(차분 디스크)를 생성합니다. 이후의 모든 쓰기 작업은 이 델타 디스크로 전달됩니다.

스냅샷이 삭제되면 하이퍼바이저는 델타 디스크의 데이터를 기본 디스크로 커밋(병합)해야 합니다. 표준 스냅샷은 게스트 운영 체제 내에서 실행되는 애플리케이션을 전혀 인식하지 못합니다. 스냅샷은 그 마이크로초에 존재하는 그대로의 디스크 상태를 캡처할 뿐입니다.

트랜잭션 데이터베이스가 상태를 관리하는 방식

트랜잭션 데이터베이스는 ACID 속성(원자성, 일관성, 격리성, 지속성)을 중심으로 설계되었습니다. ACID 준수를 유지하면서 고성능을 달성하기 위해 데이터베이스는 모든 트랜잭션을 즉시 디스크의 기본 데이터 파일에 직접 쓰지 않습니다. 대신 복잡한 다중 계층 아키텍처를 사용합니다.

  1. 버퍼 풀 / 공유 버퍼: 데이터는 시스템 메모리 내에서 읽히고 수정됩니다.
  2. Write-Ahead Log (WAL) / 리두 로그: 변경 사항은 지속성을 보장하기 위해 디스크의 고도로 최적화된 로그 파일에 순차적으로 기록됩니다.
  3. 체크포인트 / Lazy Writer: 주기적으로 데이터베이스는 메모리에서 수정된(dirty) 페이지를 디스크의 실제 데이터 파일로 플러시합니다.

이러한 아키텍처 때문에 디스크의 물리적 데이터 파일은 거의 항상 데이터베이스의 실제 상태와 동기화되지 않습니다. 데이터베이스의 진정한 상태는 디스크의 데이터 파일, WAL/리두 로그, 그리고 현재 메모리에 있는 데이터의 조합으로만 존재합니다.

위험 구역: VM 스냅샷 중에 발생하는 일

데이터베이스 서버의 표준 VM 스냅샷을 생성할 때, 당신은 크래시 일관성(crash-consistent) 상태를 캡처하는 것입니다.

크래시 일관성 vs 애플리케이션 일관성

크래시 일관성 스냅샷은 물리적 서버에서 전원 코드를 뽑는 것과 같습니다. 디스크 상태는 캡처되지만 메모리에 있던 내용은 손실되며, 스토리지 컨트롤러로 전송 중이던 데이터는 갑자기 차단됩니다.

최신 데이터베이스는 Write-Ahead Log를 재생하여 예기치 않은 전원 손실로부터 복구하도록 설계되었지만, 크래시 복구를 기본 백업 전략으로 의존하는 것은 매우 위험합니다. 데이터베이스가 여러 가상 디스크(예: D: 드라이브의 데이터 파일과 E: 드라이브의 WAL)에 걸쳐 있는 경우, 하이퍼바이저가 두 디스크를 정확히 같은 마이크로초에 스냅샷하지 않을 수 있습니다. WAL 디스크 스냅샷이 데이터 디스크 스냅샷보다 아주 짧은 시간이라도 늦게 캡처되면, 복원 시 데이터베이스가 시퀀스 번호를 조정할 수 없어 치명적인 손상이 발생합니다.

고트랜잭션 시스템에 미치는 “VM 스턴(VM Stun)” 효과

스냅샷 생성 과정, 그리고 더 중요하게는 스냅샷 병합 과정은 “VM 스턴”이라고 알려진 현상을 유발합니다.

I/O를 기본 디스크에서 델타 디스크로 안전하게 전환하기 위해 하이퍼바이저는 가상 머신을 잠시 일시 중지(스턴)해야 합니다. 부하가 적은 웹 서버의 경우 이 스턴은 10~50밀리초 정도 지속되어 눈에 띄지 않을 수 있습니다. 그러나 대규모 I/O가 발생하는 고처리량 데이터베이스의 경우, 큰 델타 디스크를 병합하면 VM이 몇 초 동안 멈출 수 있습니다.

VM 스턴 중에는:
* 네트워크 연결이 끊겨 애플리케이션 타임아웃이 발생합니다.
* 고가용성 클러스터(SQL Server Always On, PostgreSQL Patroni, MySQL Galera 등)가 하트비트 체크를 놓칩니다.
* 클러스터가 멈춘 노드를 죽은 것으로 간주하여 불필요하고 파괴적인 장애 조치(스플릿 브레인 시나리오)를 트리거할 수 있습니다.

찢어진 페이지(Torn Pages) 및 I/O 불일치

데이터베이스 엔진은 일반적으로 특정 페이지 크기(예: PostgreSQL 및 SQL Server의 경우 8KB, InnoDB의 경우 16KB)로 데이터를 씁니다. 그러나 기본 운영 체제와 스토리지 어레이는 더 작은 블록(예: 4KB 또는 512바이트)으로 I/O를 처리합니다.

하이퍼바이저가 데이터베이스가 8KB 페이지를 쓰는 도중에 스냅샷을 찍으면, 스냅샷은 새 데이터의 처음 4KB와 이전 데이터의 마지막 4KB를 캡처할 수 있습니다. 이것이 찢어진 페이지(torn page)를 만듭니다. 스냅샷을 복원하려고 하면 데이터베이스가 해당 페이지를 읽을 때 체크섬 검증에 실패하고 데이터베이스를 손상된 것으로 표시합니다.

특정 데이터베이스 엔진에 대한 실제 결과

데이터베이스 엔진마다 크래시 일관성 스냅샷에 반응하는 방식은 다르지만, 프로덕션 환경에서 이를 원활하게 처리하는 엔진은 없습니다.

  • PostgreSQL: PostgreSQL은 pg_wal 디렉토리에 크게 의존합니다. 스냅샷이 데이터 디렉토리($PGDATA)와 WAL을 동기화되지 않은 상태로 캡처하면, PostgreSQL은 시작에 실패하며 PANIC: could not locate a valid checkpoint record 오류를 발생시킵니다.
  • MySQL/InnoDB: InnoDB는 찢어진 페이지를 방지하기 위해 이중 쓰기 버퍼(doublewrite buffer)를 사용하며, 이는 크래시 일관성 상태에 대해 어느 정도 보호 기능을 제공합니다. 그러나 ibdata1 파일과 ib_logfile이 동기화되지 않은 상태로 캡처되면 InnoDB 엔진은 복구 시 충돌합니다.
  • Microsoft SQL Server: SQL Server는 I/O 고정에 매우 민감합니다. 적절한 VSS(Volume Shadow Copy Service) 통합 없이는 표준 VM 스냅샷에서 SQL Server를 복원할 때 종종 의심스러운 데이터베이스(suspect database)가 되거나 로그 체인이 끊겨 시점 복구(PITR) 기능이 파괴됩니다.

가상화된 데이터베이스를 안전하게 백업하기 위한 모범 사례

트랜잭션 데이터베이스를 보호하려면 크래시 일관성 백업에서 애플리케이션 일관성(application-consistent) 백업으로 전환해야 합니다. 이를 위해서는 백업 메커니즘이 데이터베이스 엔진과 통신하여 스냅샷이 찍히는 동안 메모리를 디스크로 플러시하고 I/O 작업을 일시적으로 중지하도록 강제해야 합니다.

1. 애플리케이션 인식 퀴에싱(VSS 및 fsfreeze) 활용

Windows (SQL Server)의 경우:
백업 솔루션이 Microsoft VSS(Volume Shadow Copy Service)를 활용하는지 항상 확인하십시오. VSS 인식 백업이 트리거되면 SQL Server VSS Writer가 데이터베이스 I/O를 고정하고, 보류 중인 트랜잭션을 디스크로 플러시하며, 스냅샷이 완벽하게 애플리케이션 일관성을 유지하도록 보장합니다.

Linux (PostgreSQL / MySQL)의 경우:
Linux에는 VSS와 동일한 기본 기능이 없습니다. 애플리케이션 일관성을 달성하려면 하이퍼바이저의 게스트 도구(예: VMware Tools)와 함께 사전 고정(pre-freeze) 및 사후 해제(post-thaw) 스크립트를 사용해야 합니다.

다음은 PostgreSQL 15+를 위해 데이터베이스를 안전하게 준비하는 VMware pre-freeze-script 예시입니다:

#!/bin/bash
# /usr/sbin/pre-freeze-script
# 이 스크립트가 실행 가능한지 확인하십시오 (chmod +x)

# 1. PostgreSQL에 백업 준비를 알림
su - postgres -c "psql -c "SELECT pg_backup_start('vm_snapshot', true);""

# 2. 파일 시스템 버퍼를 디스크로 플러시
sync

# 3. 파일 시스템 고정 (데이터가 /var/lib/pgsql에 있다고 가정)
fsfreeze -f /var/lib/pgsql

그리고 작업을 재개하기 위한 대응하는 post-thaw-script입니다:

#!/bin/bash
# /usr/sbin/post-thaw-script

# 1. 파일 시스템 고정 해제
fsfreeze -u /var/lib/pgsql

# 2. PostgreSQL에 백업 완료를 알림
su - postgres -c "psql -c "SELECT pg_backup_stop();""

2. 기본 데이터베이스 백업 유틸리티 사용

애플리케이션 일관성 스냅샷이 표준 스냅샷보다 낫지만, 여전히 VM 스턴의 위험이 있습니다. 데이터베이스 백업을 위한 가장 안전한 접근 방식은 하이퍼바이저와 독립적으로 작동하는 기본 스트리밍 백업 유틸리티를 사용하는 것입니다.

PostgreSQL (pg_basebackup):

pg_basebackup -h localhost -U replication_user -D /mnt/backups/pg_backup -Ft -z -P

MySQL/MariaDB (Percona XtraBackup / Mariabackup):
이 도구들은 데이터 파일을 복사하고 동시에 리두 로그의 변경 사항을 추적하여 차단 없는 핫 백업을 수행합니다.

mariabackup --backup --target-dir=/mnt/backups/mysql_backup --user=root --password=SecurePass

SQL Server (T-SQL):

BACKUP DATABASE [ProductionDB] 
TO DISK = N'Z:BackupsProductionDB.bak' 
WITH NOFORMAT, NOINIT, NAME = N'ProductionDB-Full Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
GO

3. 로그 아카이빙을 통한 시점 복구(PITR) 구현

일일 스냅샷이나 전체 백업은 백업이 수행된 시점까지만 보호합니다. 오후 4시에 데이터베이스가 충돌했는데 마지막 스냅샷이 오전 2시였다면, 14시간 분량의 트랜잭션 데이터를 잃게 됩니다.

진정한 엔터프라이즈 복원력을 달성하려면 전체 애플리케이션 일관성 백업과 지속적인 로그 아카이빙(몇 분마다 WAL, 리두 로그 또는 트랜잭션 로그 백업)을 결합해야 합니다. 이를 통해 DBA는 재해 발생 전 특정 분 또는 특정 트랜잭션 ID로 데이터베이스를 복원할 수 있습니다.

CloudSave를 활용한 엔터프라이즈 백업 전략

수십 개의 데이터베이스 서버에 걸쳐 사용자 지정 사전 고정 스크립트, 기본 덤프를 위한 크론 작업, 로그 전달을 관리하는 것은 DevOps 팀에게 운영상의 악몽입니다. 바로 이 지점에서 CloudSave와 같은 엔터프라이즈급 플랫폼이 중요해집니다.

CloudSave는 가상화와 데이터베이스 아키텍처 사이의 간극을 메워줍니다. 맹목적인 하이퍼바이저 스냅샷에 의존하는 대신, CloudSave는 SQL Server, PostgreSQL, MySQL 및 Oracle과 기본적으로 통합되는 애플리케이션 인식 에이전트를 활용합니다.

CloudSave가 백업을 시작하면:
1. 기본 API(Windows의 경우 VSS, Linux의 경우 기본 WAL 스트리밍)를 통해 데이터베이스 엔진과 직접 통신합니다.
2. 파괴적인 VM 스턴을 유발하지 않고 메모리 버퍼를 디스크로 플러시하도록 조정합니다.
3. 데이터 파일을 안전하게 캡처하고 트랜잭션 로그 절단을 자동으로 관리합니다.
4. 트랜잭션 로그를 지속적으로 백업하여 몇 번의 클릭만으로 세분화된 시점 복구(PITR)를 가능하게 합니다.

애플리케이션 일관성의 복잡성을 CloudSave로 넘김으로써, DBA와 시스템 관리자는 프로덕션 클러스터의 성능이나 가용성을 희생하지 않고도 데이터 무결성을 보장할 수 있습니다.

결론

가상 머신 스냅샷은 인프라 관리를 위한 놀라운 도구이지만, 트랜잭션 데이터베이스의 ACID 요구 사항과는 근본적으로 호환되지 않습니다. 크래시 일관성 하이퍼바이저 스냅샷에 의존하는 것은 조직을 찢어진 페이지, 끊어진 복제 체인 및 치명적인 데이터 손실 위험에 노출시키는 것입니다.

미션 크리티컬 데이터를 보호하려면 애플리케이션 인식 퀴에싱을 구현하고, 기본 데이터베이스 백업 방법론을 활용하며, 지속적인 트랜잭션 로그 아카이브를 유지해야 합니다. 목적에 맞게 구축된 엔터프라이즈 백업 솔루션을 채택함으로써 데이터베이스의 고가용성, 완전한 복구 가능성 및 완벽한 보안을 보장할 수 있습니다.