S3 Eventual Consistency: части файла теряются при PUT с перезаписью

Я использую Amazon S3 для хранения большого количества текстовых файлов.
Мое программное обеспечение написано на Java, и я использую официальный S3 SDK.
Помимо создания/удаления/получения/, мне часто нужно добавлять новое содержимое в файлы.

S3 не поддерживает добавление, поэтому я реализовал операцию добавления, которая в основном:
- с S3 GET получает метаданные файла из S3
- с S3 GET загружает весь файл в локальную копию
- выполняет добавление к локальной копии
- с S3 PUT загружает локальный файл на S3, перезаписывая старый.

Добавления никогда не выполняются одновременно.
Я протестировал программное обеспечение, и пока оно работает хорошо.

И вот моя проблема: в сценариях, где добавление происходит очень и очень часто, когда я выполняю добавление, большие части моих файлов теряются. Может ли это зависеть от возможной согласованности S3 при перезаписи PUT?

Спасибо за вашу помощь!


person Andrea Rossi    schedule 20.09.2017    source источник


Ответы (1)


Да, мог. Согласованность в конечном счете означает, что следующий GET объекта может возвращать или не возвращать результаты последнего PUT, когда объект был перезаписан.

Включите управление версиями корзины, и вы сможете легко определить, что происходит в этих событиях, фиксируя и регистрируя идентификатор версии объекта каждый раз, когда вы загружаете или скачиваете его.

Если версия, которую вы загрузили последней, отличается от той, которую вы загружаете впоследствии, это признак возможной согласованности, вызывающей проблему.

С другой стороны, если вы активно управляете своей загрузкой, специально запрашивая последнюю версию, используя ее последний известный идентификатор версии (который вам нужно будет захватить, когда вы PUT объект, и сохранить где-то, что предлагает строго согласованное чтение, например DynamoDB или RDS), то вы всегда можете явно запросить последнюю версию при ее загрузке.

Явные запросы для конкретной версии объекта решают проблему, потому что они не имеют ограничений согласованности — данная, указанная версия объекта либо существует, либо нет. Проблема согласованности связана с неявным получением «последней» версии объекта. Если конкретная реплика индекса, которая обслуживает ваш запрос, еще не узнала о последней версии, она будет обслуживать предыдущую версию.

Это верно независимо от того, включено управление версиями или нет, потому что перезапись объекта на самом деле не является перезаписью, даже в неверсионной корзине. Это операция хранения + обновления индекса для нового места внутреннего хранилища + очистки старого места хранения. Это не задокументировано, но атомарная перезапись и модель согласованности диктуют, что это обязательно должно иметь место.

person Michael - sqlbot    schedule 20.09.2017
comment
Спасибо, Михаил, за отличный ответ. К сожалению, я вижу, что управление версиями корзин AWS довольно дорого, поэтому я не знаю, смогу ли я его использовать. Я предполагаю, что моя настоящая проблема - это комбинация функции без добавления + возможная согласованность. Если бы я мог просто добавлять содержимое без необходимости перечитывать весь файл, это было бы намного проще. - person Andrea Rossi; 21.09.2017
comment
Управление версиями можно использовать таким образом, чтобы оно почти не отличалось по стоимости от неверсионных сегментов. Единственная дополнительная плата связана с хранением всех старых версий, но старые версии не должны сохраняться. Вы можете создать политику жизненного цикла для очистки старых версий через 1 день, и если вы хотите быть еще более агрессивным, вы можете сохранить идентификатор версии предыдущей версии в метаданных текущей версии, а когда вы открываете текущую версию, отправить удаление запрос на предыдущий. - person Michael - sqlbot; 21.09.2017
comment
Однако обе функции являются такими, какие они есть, по какой-то причине. Объекты атомарны. Добавление побеждает атомарность. Согласованность в конечном счете для перезаписей позволяет существенно повысить производительность по количеству возможных запросов на чтение в секунду. - person Michael - sqlbot; 21.09.2017