streaming은 알겠고, rsync는 언제 쓰나
2편에서 Barman의 streaming-only 모델을 셋업했어요. 이 글에서는 같은 lab을 rsync 모델로 바꾸거나 처음부터 rsync로 셋업하고, 왜 rsync를 골랐는지 정리해 보려고 해요.
처음 보는 독자도 따라올 수 있게 환경을 짧게 정리합니다.
| 호스트 | 역할 | Barman 라벨 |
|---|---|---|
demo-pg01 | PostgreSQL 17 primary | 해당 없음 |
demo-barman01 | Barman 3.18 서버 | pg01 |
pg01은 Barman 서버 라벨이고, demo-pg01은 실제 호스트네임입니다. 환경 셋업이 처음이라면 2편을 먼저 보고 오는 편이 빠릅니다.
rsync 모델 vs streaming 모델 한눈에
| 항목 | rsync 모델 (이 글) | streaming 모델 (2편) |
|---|---|---|
| 도입 시기 | Barman 1.x (2012-) | Barman 2.0 (2016-) |
| 전송 채널 | SSH + rsync | PostgreSQL streaming replication |
| WAL 수집 | archive_command (폴링) | pg_receivewal (실시간 stream) |
| 의존 | 양방향 SSH 키 | replication slot, replication user |
| 증분 dedup | 하드링크 (reuse_backup = link) | (PG 17+ 블록 레벨 점진 이행) |
| 병렬 복사 | parallel_jobs = N | (단일 stream) |
| 적합 환경 | 베어메탈/VM, SSH 통제 가능 | 컨테이너/K8s, SSH 미허용 |
이 글의 주제는 다섯/여섯 번째 행에 있는 하드링크 dedup과 parallel_jobs입니다. 둘 다 rsync 모델 고유의 강점입니다.
양방향 SSH 셋업
rsync 모델은 두 방향의 SSH가 필요합니다.
| 방향 | 용도 |
|---|---|
barman@demo-barman01 → postgres@demo-pg01 | base backup 시 rsync로 데이터 디렉토리 풀링 |
postgres@demo-pg01 → barman@demo-barman01 | archive_command로 WAL을 Barman에 푸시 |
비밀번호 없이 통과해야 cron이 자동으로 돌므로 SSH 키 기반입니다.
첫 번째 방향은 demo-barman01의 barman 사용자에서 설정합니다.
sudo -u barman ssh-keygen -t ed25519 -N "" -f ~barman/.ssh/id_ed25519 \
-C "barman@demo-barman01"
# 공개키를 demo-pg01의 ~postgres/.ssh/authorized_keys에 등록
sudo -u barman ssh-copy-id postgres@demo-pg01
# 검증 — 비밀번호 없이 통과해야 함
sudo -u barman ssh postgres@demo-pg01 'echo ok'
두 번째 방향은 demo-pg01의 postgres 사용자에서 설정합니다.
sudo -u postgres ssh-keygen -t ed25519 -N "" -f ~postgres/.ssh/id_ed25519 \
-C "postgres@demo-pg01"
sudo -u postgres ssh-copy-id barman@demo-barman01
sudo -u postgres ssh barman@demo-barman01 'echo ok'
운영 환경에서는
authorized_keys에from="..."호스트 제약이나command="..."락다운을 거는 편이 안전합니다. 이 글은 lab이라 단순화했습니다.
PostgreSQL 측의 archive_command 활성화
/var/lib/pgsql/17/data/postgresql.conf 핵심 항목:
listen_addresses = '*'
wal_level = replica
archive_mode = on
archive_command = 'barman-wal-archive -U barman demo-barman01 pg01 %p'
barman-wal-archive는 Barman 패키지에 같이 설치됩니다. 내부적으로 SSH로 barman@demo-barman01에 접속해 WAL 파일을 /var/lib/barman/pg01/incoming/에 정확히 전달합니다 — cp나 직접 scp하는 것보다 안전합니다.
pg_hba.conf에는 Barman의 conninfo 접속을 열어 둡니다. replication slot은 rsync 모델에서 필수가 아니지만, barman check가 PostgreSQL 메타데이터를 읽으려면 이 접속이 필요합니다.
host postgres barman demo-barman01 scram-sha-256
PostgreSQL 재시작 후 사용자 생성:
sudo systemctl restart postgresql-17
sudo -u postgres psql <<'SQL'
CREATE USER barman WITH ENCRYPTED PASSWORD 'changeme';
GRANT pg_read_all_settings, pg_read_all_stats TO barman;
SQL
streaming 모델과 달리 REPLICATION 속성/replication slot은 생성하지 않습니다.
Barman 측의 backup_method = rsync 설정
/etc/barman.d/pg01.conf를 다음과 같이 설정합니다.
[pg01]
description = "Production PostgreSQL primary (rsync mode)"
ssh_command = ssh postgres@demo-pg01
conninfo = host=demo-pg01 user=barman dbname=postgres
backup_method = rsync
parallel_jobs = 2
reuse_backup = link
archiver = on
retention_policy = RECOVERY WINDOW OF 4 WEEKS
핵심 다섯 줄의 의미는 이렇습니다.
| 키 | 의미 |
|---|---|
backup_method = rsync | base backup 때 SSH+rsync로 데이터 디렉토리를 가져옵니다 |
ssh_command = ssh postgres@demo-pg01 | rsync가 사용할 SSH 명령입니다. barman 사용자에서 postgres@demo-pg01로 접속합니다 |
parallel_jobs = 2 | 병렬 rsync worker 수입니다. 디스크/네트워크 여유에 맞춰 조정합니다 |
reuse_backup = link | 이전 backup에서 변경되지 않은 파일을 하드링크로 재사용합니다. 핵심 dedup 옵션입니다 |
archiver = on | archive_command로 들어오는 WAL을 자동으로 처리합니다 |
streaming 모델의 streaming_conninfo, streaming_archiver, slot_name 키는 모두 사용하지 않습니다.
설정 검증:
sudo -u barman barman check pg01
receive-wal running은 streaming 모델 전용이므로 rsync 모드에서는 항목이 빠지거나 disabled로 나옵니다. 그 외 항목이 모두 OK면 셋업이 끝난 것입니다.
첫 backup + 하드링크 dedup 실측
# 첫 base backup
sudo -u barman barman backup pg01
기대 출력 (요약):
Starting backup using rsync-over-ssh method for server pg01 ...
Copy done (time: 12 seconds)
Backup size: 41.5 MiB
이번에는 의도적으로 작은 변경만 만든 뒤 두 번째 backup을 수행합니다.
# 데이터 일부 갱신
sudo -u postgres psql -c "UPDATE notes SET body = body || '!' WHERE id < 100;"
# 두 번째 base backup — reuse_backup = link 가 동작
sudo -u barman barman backup pg01
sudo -u barman barman list-backup pg01
이제 디스크 사용량을 두 가지 방식으로 잽니다.
# 실제 디스크 사용량 (하드링크는 한 번만 카운트)
sudo du -sh /var/lib/barman/pg01/base/
# 예: 42.0 MiB
# 논리 사용량 (하드링크가 중복 카운트되어 backup별로 따로 잡힘)
sudo du -sh --apparent-size /var/lib/barman/pg01/base/
# 예: 83 MiB
두 측정값의 차이인 41 MiB ≈ 첫 backup 크기가 dedup으로 절약된 디스크 공간입니다. 두 번째 backup은 변경된 페이지만 새로 차지하고 나머지는 첫 backup 파일에 hardlink로 연결되므로, backup 횟수가 늘수록 누적 절약 효과가 커집니다.
rsync를 선택하는 기준 4가지
| 기준 | rsync 유리 | streaming 유리 |
|---|---|---|
| 환경 | 베어메탈/VM, SSH 통제 가능 | 컨테이너/K8s, SSH 미허용 |
| 디스크 절약 | 하드링크 dedup → 동일 backup 다수 보관 시 절약 큼 | 블록 레벨 dedup은 PG 17+로 점진 이행 중 |
| 병렬화 | parallel_jobs로 N개 worker | 단일 stream |
| 운영 부담 | 양방향 SSH 키 관리 | replication slot 관리 |
베어메탈/VM에서 디스크 효율과 병렬 복사가 중요하면 rsync가 잘 맞습니다. 컨테이너/K8s에서 SSH를 피하고 운영을 단순화하려면 streaming이 유리합니다. 둘 다 가능한 환경이라면 운영자의 SSH 키 관리 부담이 적은 streaming이 무난합니다.
streaming과 rsync 사이의 전환
같은 라벨로 두 모델을 동시에 운영할 수는 없습니다. backup_method는 하나만 지정할 수 있기 때문입니다. 전환 절차는 다음과 같습니다.
# 1단계: 기존 라벨 비활성화
[pg01]
active = false
...
# 2단계: 새 conf 파일로 다른 라벨 만들기 (예: pg01-rsync)
[pg01-rsync]
backup_method = rsync
...
새 라벨에 backup이 안정적으로 들어오는 것이 확인되면, 보통 1주일+ 경과/복구 리허설 1회 이상을 기준으로 기존 라벨을 폐기합니다.
운영 환경에서는 기존 backup을 즉시 버리지 않습니다. 보존 정책에 따라 자연 만료될 때까지 두 라벨을 함께 보관하면 이전 시점 PITR이 필요할 때 안전망이 됩니다.
정리
| 항목 | 내용 |
|---|---|
| 백업 모델 | backup_method = rsync, SSH+rsync 기반 |
| WAL 수집 | archive_command = 'barman-wal-archive ...' |
| SSH 방향 | 양방향 (rsync용 + archive_command용) |
| 핵심 dedup | reuse_backup = link, 하드링크 기반이며 백업 횟수가 누적될수록 절약 큼 |
| 병렬 복사 | parallel_jobs = N |
| streaming과의 관계 | 동시 사용 불가 (라벨당 한 모델), 전환 시 새 라벨로 병행 운영 후 폐기 |
streaming은 운영 단순화에 강하고 rsync는 디스크 효율과 병렬화에 강해요. 환경 때문에 한쪽을 골라야 하는 상황이 아니라면 streaming부터 시도해 보는 편이 무난해요.