2012-05-21 2 views
0

특정 USB 키가 연결되어있을 때 실행되는 Windows 서비스를 만들고 있습니다. 간단한 설명 : FTP 서버에 문의하여 파일을 다운로드하고 ) 아카이브를 USB에 저장합니다. 보관소는 클라이언트에 제공되는 도구를 사용하여 읽기 전용 으로 열 수 있습니다 (그러나 내 문제와 관련 없음).트랜잭션 기반 보관 컨테이너

서비스는 USB를 마스터 서버 (Dropbox와 거의 비슷하지만 다운로드 만하고 동기화 된 폴더는 이동식 미디어에 있음)와 동기화되도록 유지하는 데 사용됩니다. 아카이브는 몇 기가 바이트까지 커질 수 있습니다. 매주 약 1GB의 파일이 약 400 명의 사용자 키로 업데이트됩니다.

전체 업데이트 프로세스가 사용자에게 투명하므로 무시할 수없는 기회가 있습니다. 데이터가 아카이브에 기록 될 때 USB를 뽑습니다. 을 입력하지 마십시오. 아카이브를 손상 시키려면 다시 다운로드해야합니다. 즉, 이미로드 된 서버에서 상당한 대역폭을 낭비하게됩니다.

그래서 기본적으로 나는 트랜잭션을으로 처리해야합니다. 컨테이너가 일관성없는 상태가되지 않는 한 실패하면 정상입니다. 파일이 모두 작성되었거나 이 아니거나이 아닙니다. 컨테이너가 실제로 "보지 않으면"파일이 부분적으로 쓰여진다면 괜찮습니다.

질문은 여기에 있습니다 : 언제나 데이터 일관성을 어떻게 보장 할 수 있습니까? 특히 IO 작업을 트랜잭션으로 사용하려면 어떻게해야합니까? 너는 무엇을 제안 하겠는가? 혼자서 뭔가를 구현해야합니까? 아니면 이미이 기능을 제공하는 컨테이너가 있습니까?

이것은 내가 지금까지있어 무엇 :

  • 가, 새 아카이브를 생성 커밋에 이름을 바꿉니다 가능하지, 아카이브가 너무 큽니다.
  • 우편/타르/7Z : 적합, 실패한 쓰기 손상됩니다 아카이브
  • TrueCrypt를 : 적합, 그것은 파일 시스템 드라이버 (사용자가 하지는이 점 관리자 권한)을 필요로한다.
  • 파일 시스템을 파일에 매핑해야하는 모든 것 : 부적절합니다. 관리자가 아니면 불가능하지 않을 수도 있습니다. 가능하다면 좋을 것입니다.
  • SQLite DB에 파일 저장 : 실제로 ACID이므로 솔루션이 될 수 있습니다. 그러나 SQLite는 BLOB 용량이 제한되어 있기 때문에 파일을 분할해야합니다. 별로 우아하지는 않지만 그렇게 할 준비가되었습니다. 또한 SQLite의 트랜잭션 저널은 큰 얼룩을 저장할 때 상당히 커질 수 있습니다.
  • 직접 구현하십시오. : 가능한 한 많이 피하는 것이 좋지만 두려워하지는 않습니다. 나는 주제가 꽤 복잡하다는 사실을 발견했다.

이 질문이 너무 일반적인 경우 SU로 이동하십시오.

+0

USB는 NTFS로 포맷 되었습니까? – Fanael

+0

@Fanael 그렇습니다. 그렇지 않으면 아카이브가 어쨌든 적합하지 않습니다. –

+0

이 경우, Vista 이상에만 관심이 있다면 아마도'CreateFileTransacted'와 그 친구들을 시도해야할까요? – Fanael

답변

1

암호화 된 차이점을 다운로드하려면 svn 또는 git과 같은 것을 사용해 볼 수도 있습니다. 파일이 손상되면 일반적으로 로컬로 파일을 재구성하는 데 사용할 수 있습니다. 또는 diff를 다운로드하고 패치를 사용하여 최신 파일 버전을 생성하십시오.

사용자가 데이터를 쓰는 동안 FLASH 드라이브를 분리하면 다른 문제가 발생합니다. 많은 것은 (파일 시스템 수준이 아닌 플래시 블록 수준에서) 신뢰할 수 없으며 NTFS 또는 EXT3과 같은 저널링 파일 시스템이 복구 할 수 없을 정도로 손상 될 수 있습니다. 여기에 자세한 내용이 있습니다. https://superuser.com/questions/290060/can-flash-memory-be-physically-damaged-if-power-is-interrupted-while-writing

+0

원격 서버를 제어하지 않습니다. 그러나 마지막 단락은 매우 흥미롭고 잠시 생각하게 만들었습니다. 어쩌면 나는 아무것도 처리하지 않을거야. –

+0

git를 로컬로 실행할 수 있습니다. 버전 관리 기능을 사용하여 손상된 파일을 다시 작성할 수 있습니다. – patwood

0

정말 간단합니다. 임시로 쓰기, 쓰기가 끝나면 마스터로 설정, 그렇지 않으면 삭제하고 다시 시도하십시오.

+1

그것이 불가능하다고 말했기 때문에 아카이브가 너무 큽니다. –

+1

소리가 너무 단순하게 들리지 않게하십시오. ** [fsync()없이 이름 바꾸기()가 가능합니까?] (http://stackoverflow.com/questions/7433057/is-rename-without-fsync-safe) ** – sehe

0

아마도 SolFS (Application Edition)이 작동합니다. SolFS는 컨테이너 파일 내에 가상 파일 시스템을 제공하며, 파일 시스템 통합을 유지하는 데 도움이되는 저널링 모드의 데이터 쓰기를 지원합니다.

관련 문제