8.5 KiB
8.5 KiB
tags
| tags | ||||||
|---|---|---|---|---|---|---|
|
260312 외부 NAS -> 내부 NAS 컴퍼니엑스 실시간동기화 계획
상태: 완료 (2026-03-12 30분 계층형 cron, 01:00 전수조사 cron, 수동 검증 완료)
상위 원칙
- Infra Project Identity
- Core Infrastructure Principles
- Operational Guardrails
- 공통 작성 원칙: 0_VALUE Writing Principles
관련 문서
- Infra Journey
- 외부 NAS -> 내부 NAS 컴퍼니엑스 실시간 동기화 아이디어
- 외부 NAS -> 내부 NAS 컴퍼니엑스 실시간동기화 리서치
- 외부 NAS -> 내부 NAS 컴퍼니엑스 동기화 운영계획
- Company X 상태기록 강화 및 재개 실행
문제 정의
- 전체 트리 기준 재귀 조회는 이미 동작하지만, 현재 구조 그대로는
거의 즉시반영을 말하기 어렵다. - 2026-03-12 실측에서 전체 트리
--dry-run은3분 45초가 지나도 종료되지 않았고, 작은 폴더 Search API는 빠르지만 루트 전체 재귀 Search는 신뢰 가능한 결과를 주지 못했다. - 따라서 이번 계획의 목표는
실시간처럼 보이는 과장이 아니라, 현재 근거로 재현 가능한짧은 지연 동기화 운영안을 고정하는 것이다.
구조 결정 고정
- 허용 지연은
30분 이내로 고정한다. - 기본 실행 방식은
cron 기반 30분 주기 계층형 탐색 + 증분 pull로 고정한다. 30분 루프는 전체 파일 전수조사가 아니라/6.Company X와 그 아래 1차 폴더들을 non-recursive로 조회해2차 폴더까지먼저 확인한다.- Search API는 전체 루트 대체재로 쓰지 않는다.
- Search API는 변화가 잦고 범위가 좁은 일부 상위 폴더에서만 보조 후보로 제한 검토한다.
- 증분 기준은 기존과 동일하게
수정시각 + 파일 크기를 유지한다. - 해시는 기본 증분 판정 기준으로 올리지 않는다.
- 내부 NAS DSM webhook/API 제어를 기본 전제로 두지 않는다.
- 외부 삭제는 내부 NAS에 자동 전파하지 않고, 삭제 후보 로그만 남긴다.
- 같은 주기의 중복 실행은 허용하지 않는다.
- 하루 1회는 파일 기준 전체 루트 전수조사를 수행해 누락과 정합성을 보정한다.
- SHA256은 표본 무결성 검증과 의심 파일 확인에만 제한적으로 사용한다.
실행 순서
1. 30분 주기 실행 엔트리를 고정한다
companyx_external_nas_sync.py또는 후속 계층형 래퍼를 30분마다 실행하는 cron 엔트리를 기준안으로 둔다.- 실행 겹침 방지를 위해 lock 파일 또는
flock기반 단일 실행 제어를 같이 둔다. - 로그는 기존
.sync-logs경로를 재사용한다.
2. 30분 루프는 2차 폴더까지 먼저 확인한다
/6.Company X루트와 그 아래 1차 폴더들을 non-recursiveList로 먼저 확인한다.- 이 단계의 목적은 전체 파일을 훑는 것이 아니라
어느 2차 폴더가 바뀌었는지를 빠르게 잡는 것이다. - 2026-03-12 실측 기준 루트 1회 조회 평균은
60.14ms, 2차 폴더까지 확인하는 평균은983.861ms였다. - Search API를 먼저 중심 구조로 승격하지 않는다.
- 내부 NAS나 외부 NAS의 파일 변경 webhook이 있다는 가정을 실행 기준에 넣지 않는다.
3. 바뀐 폴더만 3차 이하로 하강한다
- 30분 루프에서
mtime이 바뀐 2차 폴더만 3차, 4차, 파일 레벨까지 내려간다. - 하강한 경로에서는 파일 단위
수정시각 + 파일 크기로 실제 다운로드 여부를 판단한다. - 바뀌지 않은 2차 폴더는 이번 30분 루프에서 더 내려가지 않는다.
4. 하루 1회 파일 전수조사로 최종 정합성을 맞춘다
- 30분 루프와 별도로 하루 1회 전체 루트 파일 전수조사를 수행한다.
- 목적은
폴더 mtime만으로는 놓칠 수 있는기존 파일 내용 수정, 누락 파일, 시간 오차를 다시 맞추기 위함이다. - 이 검증 스캔도 같은 상태 파일과 요약 파일 체계를 사용한다.
5. 운영 임계치를 수치로 확인한다
- 30분 주기 실행의 평균 소요 시간, 최장 소요 시간, 겹침 발생 여부를 기록한다.
1회 실행 시간이 30분을 반복 초과하면 주기를 더 늘리거나 상위 폴더 분할로 전환한다.2차 폴더까지 확인단계는 평균1초 내외를 유지하는지 본다.- 하강 대상 폴더 수가 급격히 늘어 30분 루프가 길어지면 상위 폴더 단위 분리 또는 주기 조정을 검토한다.
해시 재계산은 2026-03-12 실측에서 같은 표본 기준stat 0.927ms대비sha256 617.713ms, 약666.4배느렸으므로 운영 기본 루프에 넣지 않는다.- 전체 루트
1분 제한실측에서는directories_seen=436,files_seen=2276이었고, 기존 완주 총량 대비 단순 비례 예상 시간은 약23.4분이었다. - 따라서 현재 기본안은
30분 루프는 계층형 탐색,하루 1회만 파일 전수조사다.
체크리스트
- 허용 지연
30분이 문서와 실행 설정에서 일치한다. - cron 기준 실행이 중복 없이 유지된다.
- 30분 루프가
2차 폴더까지 확인 -> 바뀐 폴더만 하강으로 동작한다. - 1회 실행 시간이 주기를 반복 초과하지 않는다.
- 하루 1회 파일 전수조사가 별도로 남는다.
- 해시는 기본 증분 판정이 아니라 표본 검증에만 남는다.
- 삭제 전파 없이 삭제 후보 로그만 남는다.
검증 기준
- 30분 주기 실행 3회 이상에서
failed=0또는 원인 설명 가능한 실패 로그가 남는다. - 각 실행 요약에서
started_at,finished_at,downloaded,skipped,failed를 확인할 수 있다. - 같은 시간대 중복 프로세스가 생기지 않는다.
- 하루 1회 파일 전수조사 결과와 30분 루프 결과 사이에 설명되지 않는 누락이 없다.
- 30분 루프 로그에서 어떤 2차 폴더가 하강 대상으로 선택됐는지 확인할 수 있다.
완료 조건
실시간대신30분 이내 반영이라는 운영 표현이 문서와 실행 결과에서 일치한다.- 30분 주기 계층형 탐색이 재현 가능하고, 중복 실행 없이 안정적으로 돈다.
- 하루 1회 파일 전수조사와 역할이 겹치지 않는다.
- 이 주제는 더 이상 막연한 실시간 아이디어가 아니라, 측정값에 근거한 운영 기준으로 전환된다.
현재 추천 결론
- 현재 근거 기준 1순위는
cron 30분 주기 2차 폴더 메타 확인 + 바뀐 폴더만 하강 동기화 + 하루 1회 파일 전수조사다. - Search API는 작은 폴더에서는 빠르게 동작했지만 루트 전체에서는 신뢰 가능한 결과를 주지 못했으므로 기본 경로로 채택하지 않는다.
- 해시는 직접 실측에서
수정시각 + 파일 크기보다 현저히 느렸으므로, 운영 루프가 아니라 표본 검증에만 남긴다. - 내부 NAS 관리자 계정으로 DSM API 로그인 자체는 가능했지만, 현재 확인된 API 목록에는 알림/webhook 제어 항목이 없었으므로 webhook 기반 설계는 채택하지 않는다.
- 루트 1회 조회는 약
60ms, 2차 폴더까지 확인은 약1초, 전체 파일 전수조사는 약23분대로 추정되므로, 현재 추천 점수는95%다.
2026-03-12 적용 상태
- 사용자 crontab에
*/30 * * * * /home/admin/infra/scripts/bin/companyx_external_nas_sync_hierarchical_cron.sh를 적용했다. - 사용자 crontab에
0 1 * * * /home/admin/infra/scripts/bin/companyx_external_nas_sync_fullscan_cron.sh를 적용했다. - 계층형 스크립트 수동 검증 1회차는
root_scan_calls=15,first_level_dirs=14,second_level_dirs=110,primed_cache=true,downloaded=38,failed=0이었다. - 계층형 스크립트 수동 검증 2회차는
candidate_dirs=0,downloaded=0,skipped=38,failed=0이었다. - 전수조사 래퍼는 대표 폴더 기준
downloaded=20,failed=0,files_seen=20으로 정상 동작을 확인했다.