2017-09-20 1 views
0

Amazon S3를 사용하여 많은 양의 텍스트 파일을 저장하고 있습니다.
내 소프트웨어가 Java로되어 있으며 공식 S3 SDK를 사용하고 있습니다.
작성/삭제/검색/외에도 종종 새 콘텐츠를 첨부해야합니다.S3 최종 일관성 : 덮어 쓰기로 파일 부분이 손실됩니다

S3는 APPEND를 지원하지 않기 때문에 내가 그 기본적으로 추가 작업을 구현 한 :
를 - S3의 GET으로, S3
에서 파일의 메타 데이터를 가져옵니다 - S3가하세요이, 로컬 복사본에 전체 파일을 다운로드하여
- 로컬 복사본
에 추가 작업을 수행하고 S3 PUT을 사용하여 S3에서 로컬 파일을 업로드하여 이전 파일을 덮어 씁니다.

첨부는 ​​동시에 수행되지 않습니다.
나는 소프트웨어를 테스트했으며 지금까지 제대로 작동하는 것으로 보인다.

여기 내 문제가 있습니다 : 추가가 매우 빈번한 상황에서 추가를 수행하면 파일의 큰 부분이 손실됩니다. 이것이 PUT을 덮어 쓰는 S3 궁극적 인 일관성에 달려 있습니까?

도움 주셔서 감사합니다.

답변

1

예, 가능합니다. 최종 일관성은 객체의 다음 GET이 객체가 덮어 쓰기되었을 때 마지막 PUT의 결과를 반환 할 수도 있고 반환하지 않을 수도 있음을 의미합니다.

버킷 버전 관리를 사용하도록 설정하고 업로드하거나 다운로드 할 때마다 개체의 버전 ID를 캡처하고 로깅하여 이러한 이벤트에서 발생하는 상황을 쉽게 식별 할 수 있어야합니다.

마지막으로 업로드 한 버전이 이후 다운로드 한 버전이 아닌 경우 문제가되는 최종 일관성을 나타냅니다.

한편 가장 최근의 버전 ID를 사용하여 최신 버전을 요청하는 경우 (사용자가 PUT 일 때 캡처해야하며 강력하게 일관된 읽기를 제공하는 위치에 저장해야 함) , DynamoDB 또는 RDS처럼) 최신 버전을 다운로드 할 때 항상 명시 적으로 요청할 수 있습니다.

개체의 특정 버전에 대한 명시 적 요청은 일관성 제한이 없으므로 문제를 해결합니다. 지정된 지정된 버전의 개체가 존재하거나 존재하지 않습니다. 일관성 문제는 객체의 "최신"버전을 암시 적으로 가져 오는 것과 관련이 있습니다. 요청을 처리하는 특정 인덱스 복제본이 아직 최신 버전을 알지 못하면 이전 버전을 제공합니다.

버전없는 버킷에서도 개체 덮어 쓰기가 실제로 덮어 쓰기가 아니기 때문에 버전 관리의 사용 가능 여부는 사실입니다. 새로운 내부 저장소 위치에 저장소 + 업데이트 색인 + 오래된 저장소 위치 작업 삭제 이것은 문서화되지 않았지만 원자를 덮어 쓰고 일관성 모델은 필연적이어야한다고 지시합니다.

+0

대단한 답변을 해주셔서 감사합니다. 불행히도 AWS 버킷 버전 관리가 상당히 비싸다는 것을 알기 때문에 사용할 수 있을지 모르겠습니다. 내 진짜 문제는 콤보 "추가 기능 없음"+ "최종 일관성"이라고 생각합니다. 방금 전체 파일을 다시 읽지 않아도 내용을 추가 할 수 있다면 훨씬 쉬울 것입니다. –

+1

버젼 생성은 버전 화되지 않은 버킷과 거의 차이가없는 방식으로 사용될 수 있습니다. 추가 된 유일한 비용은 모든 이전 버전을 저장하기위한 것이지만 이전 버전은 보유하지 않아도됩니다 *. 라이프 사이클 정책을 작성하여 1 일 후에 이전 버전을 삭제할 수 있으며, 더 적극적으로 사용하려면 이전 버전의 버전 ID를 현재 버전의 메타 데이터에 저장할 수 있으며 현재 버전을 열 때 삭제 이전에 대한 요청. –

+0

두 가지 기능은 이유가있는 그대로입니다. 객체는 원 자성입니다. 추가하면 원 자성을 잃는다. 덮어 쓰기의 궁극적 인 일관성은 가능한 초당 읽기 요청 수의 상당한 성능 향상을 허용합니다. –

관련 문제