백업 및 복구 계획

사이트가 정식 운영에 들어가기 전에 좋은 백업 전략을 마련하고 싶습니다. 아래는 제가 설정한 단계들입니다. 무엇이 빠졌을까요?

데이터베이스 백업

  • Discourse가 매일 한 번의 데이터베이스 백업을 수행합니다.
  • UI 기반 백업에서 +12시간 시차를 두고 매일 추가적인 cron 데이터베이스 백업이 수행됩니다.
  • 백업은 S3 버킷(별도 데이터 센터)에 저장됩니다.

코어 파일

아래 파일들은 매일 두 번, S3 버킷(별도 데이터 센터)에 백업됩니다.

  • discourse/containers/app.yml
  • discourse/shared/standalone/uploads/
  • discourse/shared/standalone/backups/
  • discourse/shared/standalone/ssl/
  • discourse/shared/standalone/letsencrypt/

파일 백업은 데이터베이스 백업 후 30분 뒤에 매일 두 번 수행됩니다.

S3: 업로드

  • 업로드 파일의 매일 백업이 별도 데이터 센터의 S3 버킷에 저장됩니다.

서버 백업

  • 전체 서버의 주간 백업 - 4개의 주간 백업 유지
  • 매년 하나의 주간 백업을 마스터 백업으로 원격 위치에 저장.

이로써 기존 위치에 또는 새 서버에서 서버를 복구하는 데 필요한 모든 데이터와 설정을 제공할 수 있을 것입니다.

무엇이 빠졌나요?

그것이 권장되는 방법입니다. 데이터베이스를 하루에 한 번만 백업하면, 해당 포럼에서 24시간 동안 발생한 모든 데이터 중 최대 24시간 치를 잃을 위험이 있습니다.

적어도 두 번은 문제가 되지 않는다고 들었지만, 왜 그런지에 대해서는 아무도 설명해 주지 않았습니다. 그래서 저는 데이터베이스를 6시간마다 백업하고 있습니다. 제 포럼은 그렇게 바쁘지 않으므로 그 정도 위험을 감수할 수 있습니다. 비교하자면, 제 이커머스 사이트는 4분마다 백업합니다.

데이터베이스를 더 자주 백업하도록 설정하신 방법이 궁금합니다. 저는 하루 두 번 정도가 좋겠는데, UI 기능상 하루 한 번만 설정할 수 있습니다.

컨테이너가 아닌 서버에서 cron 작업을 실행하여 다음을 수행할 수 있습니다.

docker exec app bash -c "discourse backup"

데이터가 정말로 중요한 경우, postgres 복제 서버를 설정하여 두 번째 서버에서 모든 커밋을 수행하도록 할 수 있습니다.

다음과 같은 crontab 항목이 있습니다:

docker exec app discourse backup --sql-only

이것은 Discourse 자체의 백업 CLI 명령어입니다. docker exec app은 컨테이너 밖에서 명령을 실행하도록 안내받았습니다(물론 app은 컨테이너 이름입니다).

또한 S3를 설정하여, 이 백업이 ‘일반’ 백업이 저장되는 것과 동일한 버킷으로 전송되도록 했습니다.

작은 문제가 하나 있습니다… 아주 빠르게 백업 파일이 수없이 많이 쌓입니다. SQL 덤프를 다른 방식으로 생성한 후 aws-cli를 사용해 이동하고, 특정 시간 이전의 모든 파일을 삭제하는 것이 더 나은지, 아니면 VPS에서 동일한 작업을 수행하는 것이 더 나은지 모르겠습니다.

하지만 SQL 덤프를 얻는 가장 쉬운 방법은 이 방식입니다.

이것이 내부 디스커스 백업 루틴을 활성화한다고 가정하고, 모든 알림이 그대로 유지된다고 봅니다.

UI에서 백업 예약을 끄고 모든 것을 크론으로 관리하시나요? 아니면 UI에서 하나를 설정하고 나머지는 크론으로 추가하는 방식인가요?

아니요. 둘 다 합니다. 시스템도, 나 자신도 그만큼 신뢰하지 못합니다. 백업의 양이 실제로 문제가 되는 경우는 드물고, 부족한 것이 문제입니다.

@Jagster님과 @pfaffman님, 크론을 통해 추가 데이터베이스를 설정하는 데 도움을 주셔서 감사합니다. 덕분에 시스템의 최악의 경우 데이터 손실 시간이 12시간으로 줄었습니다.