백업 · 복원
데이터레이크의 백업은 두 종류입니다. 무엇을 잃었느냐에 따라 고릅니다.
| 논리 덤프 | 물리 백업 | |
|---|---|---|
| 명령 | pd backup (인자 없이) | pd backup run …, 그리고 매일 도는 systemd 타이머 |
| 무엇을 | PostgreSQL 사용자 DB 를 SQL 파일로(pg_dump) | PostgreSQL 은 pgBackRest, Cassandra 는 Medusa 가 데이터 파일 자체를 |
| 어디에 | /data1/pp-data/postgres/dump/<db>-YYYYmmdd_HHMMSS.sql | /data1/pp-backup/ (pgbackrest/ · medusa/) + 기록 history.jsonl |
| 되돌리기 | pd recover <파일> — pp DB 하나 | pd backup restore … — 데이터 디렉터리 전체 |
| full / diff · 시점 복구 | 없음(항상 전체) | 있음. PostgreSQL 은 --target 으로 시점 복구(PITR) |
타이머가 밤에 찍는 백업과 운영자가 pd backup run 으로 찍는 백업은 같은 툴킷(plantpulse-backup)을 지나 같은 history.jsonl 에 남습니다. 관리 콘솔의 백업 화면도 같은 명령을 부릅니다.
자동 백업 — 이미 켜져 있습니다
| 잡 | 언제 | 무엇 |
|---|---|---|
postgres-diff | 매일 01:30 | PostgreSQL 차등 |
postgres-full | 일요일 01:00 | PostgreSQL 전체 |
cassandra-diff | 매일 01:20 | Cassandra 차등 |
cassandra-full | 일요일 00:10 | Cassandra 전체 |
purge | 일요일 03:00 | 보관 정책에 따라 정리 |
docker exec plantpulse-datalake pd backup schedule # 일정 · 마지막 결과 · 다음 실행
docker exec plantpulse-datalake pd backup list # 세트 목록
docker exec plantpulse-datalake pd backup status # 지금 도는 것이 있나
pd backup schedule 의 LAST 열이 never 면 아직 한 번도 안 돈 것(정상), fail (…) 이면 마지막 실행의 오류입니다. SIZE 가 - 인 Cassandra 세트는 크기 정보가 없을 뿐 0 이 아닙니다. STATUS 가 error · incomplete 인 세트로는 복원하지 않습니다.
일정 바꾸기
docker exec plantpulse-datalake pd backup schedule set --job postgres-diff --calendar "*-*-* 02:45:00"
docker exec plantpulse-datalake pd backup schedule set --job purge --enabled false
docker exec plantpulse-datalake pd backup schedule reset --job postgres-diff # 그 잡만 기본으로
docker exec plantpulse-datalake pd backup schedule reset # 전부 기본으로
캘린더는 systemd 문법입니다 — *-*-* 02:45:00(매일 02:45), Sun *-*-* 01:00:00(일요일 01:00), Mon..Fri *-*-* 23:30:00(평일). 틀린 식은 검증에서 걸려 아무것도 쓰지 않습니다. 선택은 /data1/pp-data/backup/schedule.json 에 남아 컨테이너를 다시 만들어도 매 기동 때 다시 적용됩니다.
전역 스위치가 이깁니다. 사이드카에 PP_BACKUP_SCHEDULE_ENABLED=false 를 적으면 잡별로 뭘 켜 놓아도 타이머가 «skipped» 로만 기록하고 끝납니다.
큰 작업 전에 — 지금 시점 하나 더
업그레이드 · 복원 · 설정 변경 같은 큰 작업 직전에는 «지금 이 순간» 을 하나 더 남깁니다.
docker exec plantpulse-datalake pd backup run --engine postgres --type diff
docker exec plantpulse-datalake pd backup run --engine cassandra --type full
docker exec plantpulse-datalake pd backup # 그리고 SQL 사본 하나
한 번에 하나만 돕니다 — 도는 중이면 exit 3 으로 거부합니다. 도구가 0 으로 끝났어도 저장소가 자라지 않았으면 fail 로 판정합니다.
복원 — 물리 백업으로
마지막 수단입니다. 그 세트 이후의 모든 쓰기가 사라집니다. 이 동사는 절차를 강제합니다 — --yes 없이 치면 --dry-run 을 하라고 거부합니다.
# 1. 세트 고르기 — STATUS 가 ok 인 것만
docker exec plantpulse-datalake pd backup list
# 2. 드라이런 — 전제조건 일곱과 «정확히 무슨 명령이 무엇을 덮어쓸지». 아무것도 안 건드린다
docker exec plantpulse-datalake pd backup restore --engine postgres --set 20260903-013040F_20260904-135107D --dry-run
# preconditions (all pass - ready) 가 나올 때까지 실행하지 않는다
# 3. pp 를 쓰는 서비스를 역순으로 내린다 — storage 는 둔다 (PostgreSQL 은 이 동사가 스스로 멈추고 띄운다)
docker exec plantpulse-datalake pd stop admin-api
docker exec plantpulse-datalake pd stop data-gateway
docker exec plantpulse-datalake pd stop workflow
docker exec plantpulse-datalake pd stop cep
docker exec plantpulse-datalake pd stop timeseries
# 4. 실행
docker exec plantpulse-datalake pd backup restore --engine postgres --set 20260903-013040F_20260904-135107D --yes
# 5. 끝 줄 "done in NNs - restart the dependent services" 를 보고
docker exec plantpulse-datalake pd restart
# 6. 확인
docker exec plantpulse-datalake pd status # 0 STOPPED
docker exec plantpulse-datalake pd backup status # 락이 free
- 시점 복구(PITR) — PostgreSQL 만
--target "2026-09-04 12:00:00"처럼 시각을 줄 수 있습니다. 그 세트를 깐 뒤 WAL 을 그 시각까지 재생합니다. Cassandra 에--target을 주면 exit 2. - Cassandra 복원은 Medusa 가 Cassandra 를 스스로 멈추고 띄우며, diff 세트를 고르면 그것이 참조하는 full 까지 같이 깔립니다.
- 워커에서는 돌지 않습니다. 복원은 마스터의 일이고 워커는 그것을 따라갑니다.
복원 — 논리 덤프로
pp 데이터베이스 하나만 논리 덤프 시점으로 되돌립니다. 되돌릴 수 없고 드라이런이 없습니다 — 파일 이름을 넘긴 순간 DROP DATABASE "pp" 가 실행됩니다.
ls -l /data1/pp-data/postgres/dump/ # 날짜와 크기를 먼저 눈으로
docker exec -it plantpulse-datalake pd recover # 목록을 찍고 파일 이름을 묻는다 (Ctrl+C 취소)
docker exec plantpulse-datalake pd recover pp-20260904_131500.sql
절차는 물리 복원의 3 ~ 6 과 같습니다(서비스를 먼저 내리고, 끝난 뒤 올립니다). 다른 데이터베이스(temporal · hive · kestra)의 덤프를 넣어도 pp 에 들어갑니다 — 그 DB 들은 물리 백업이 맞습니다.
하지 마세요
--dry-run없이--yes를 치지 마세요. 계획을 눈으로 보지 않은 복원은 «어느 시점으로 돌아가나» 를 모르는 복원입니다.- 살아 있는 서비스 위에서 복원하지 마세요. 붙어 있던 서비스는 끊긴 세션을 붙들고 오류를 뿜습니다.
- 락 파일(
/data1/pp-backup/pd-backup.lock)을 손으로 지우지 마세요. 죽은 pid 의 락은pd가 free 로 읽습니다. - 덤프를
/data1/pp-temp에 복사해 두지 마세요.pd clean이 지웁니다.
관련 문서
- 백업 및 복구 — 볼륨 백업, 오프사이트 복제, 재해 복구 시나리오
pdCLI- 관리 콘솔 — 백업 화면