프로젝트가 운영단계로 접어들게 되면, 안정성과 신뢰성이 중요하게 작용한다. 장애, 재해 등 발생했을 때 데이터 복구 작업이 필요한데 준비되어 있지 않아, 데이터가 유실되거나, 초기화되는 경우 신뢰성은 추락하게 된다.


대비하려면 반드시 백업/복구에 대해 준비를 해야 한다. MariaDB 백업/복구는 mysqldump, xtrabackup 2가지 방법이 있다.


mysqldump는 설치 시 기본적으로 제공되는데, SQL 기반으로 백업되기 때문에 대응이 xtrabackup 보다는 편리하다.

운영 초기에는 별문제 없이 사용할 수 있는데, 데이터양이 많아졌을 때 한계점에 부딪치게 된다. 

모든 데이터를 메모리에 올려놓고 SQL로 변환하는 만큼 서버에 부담이 많이 가고, 백업도 많은 시간이 소요된다. 마찬가지로 복구도 모든 SQL이 실행되어야 하므로 같은 문제점을 가지고 있다.


xtrabackup은 Mysql, MariaDB 모든 버전을 지원하는 백업 솔루션이다. facebook은 엄청난 양의 데이터를 생성하는데 백업은 xtrabackup를 사용하고 있다.


“Facebook users create a vast amount of data every day. To make sure that data is stored reliably, we back up our databases daily. Facebook was an early adopter of incremental backup in Percona XtraBackup.”


대표적인 기능은 빠르고 안정적으로 백업/복구가 가능하고, 백업 중 중단없이 트랜젝션 처리가 가능하다. 모든 데이터를 가공하는 게 아닌, data 파일을 복제하는 것을 기반으로 하기 때문이다. 추가로 증분 백업을 지원하기 때문에 데이터양이 많아도 시점별로 관리가 가능하다.


사용하려면 별도로 설치해야 한다. linux에서만 지원하기 때문에, windows에서는 사용할 수 없다.

설치 가이드: https://www.percona.com/doc/percona-xtrabackup/LATEST/installation.html


설치가 완료되었다면 innobackupex 명령어를 통해서 전체 백업을 진행해보자.


백업 하기 전 주의사항이 있는데 엔진이 InnoDB인 경우 백업을 완료하는 시점에서 현재 스키마를 저장하기 위해 일시적으로 'Global Lock'을 걸게 되는데, 그 시간 동안 write 작업은 대기 상태가 되고, Lock이 해제되는 순간 진행된다. 데이터 파일이 크다면 길어질 수 있기 때문에 "--no-lock" 옵션을 사용하게 되면 이슈는 사라진다. 처리 시간은 DISK I/O의 영향을 많이 받으며, 가능하다면 별도의 디스크에 백업하는 것을 권장한다. 


전체 백업 시에는 MariaDB 서버의 설정 파일을 "--default-file"에 명시해야 한다. 서버 메모리가 여유가 된다면 "--use-memory"를 늘려서 처리하면 빠르게 진행할 수 있다. 백업이 완료된 후 "/backups"로 이동하여 파일을 확인해보면 data 파일이 이동된 것을 확인할 수 있다.


innobackupex \
        --default-file=my.cnf \
        --backup \
        --host=${backup_host} \
        --port=${backup_port} \
        --user=${backup_user} \
        --password=${backup_password} \
        --parallel=4 \
        --no-lock \
        --use-memory=4gb \
        /backups


데이터 복구를 진행하기 전 반드시 MariaDB 서버를 종료시키고, data 파일은 비워줘야 한다. 복구 시 파일 덮어쓰기는 불가능하다.

"/backups"를 data 파일 경로에 복사하여 복구 하므로 MariaDB 접속은 하지 않아도 된다.


복구 하기 전 "--apply-log" 옵션을 넣어서 준비상태로 만들어야 한다.


innobackupex \
        --use-memory=4gb \
        --apply-log \
/backups


완료되면 "--copy-back" 옵션을 넣고 복구를 진행한다.


innobackupex \
        --default-file=my.cnf \
        --parallel=4 \
        --copy-back \
        --use-memory=4gb \
        /backups


data 경로의 권한을 mysql로 변경해야 시작 시 권한 문제가 발생하지 않는다.


chown -R mysql. /mariadb/data


MariaDB를 시작하면 복구된 데이터를 확인할 수 있다.


만약 시간이 허락한다면, xtrabackup를 도입해서 장기적으로 장애 및 재해에 미리 대비하는 편이 안전하고 신뢰성을 높이는 길이라고 생각된다.


참고 사이트

  • https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
  • [리얼타임] MariaDB 실전 활용 노하우 (6.1. xtrabackup 참고)


+ Recent posts