Как стать автором
Обновить

Держитесь подальше от холодных хранилищ Selectel

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров31K

От любви до ненависти — один шаг, это история об этом. Если вы используете или планируете использовать холодное хранилище Selectel для бэкапа, выбросьте эту идею из головы НЕМЕДЛЕННО!

Я был привлечен дешевыми тарифами холодного хранилища Selectel и настроил на них архивацию данных из 1С.

Один раз я обжегся, когда создал одному клиенту не лимитированный контейнер версий, в него попадали даже частично переданные файлы и он стал занимать почти терабайт. Правда, обошлось все в небольшую сумму, 2000 RUR.

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

Мне так понравилось холодное хранилище Selectel, что я рекомендовал его и настроил на него у трех своих клиентов архив 1С. Ничто не предвещало БЕДЫ.

Раз в месяц я проверял, что клиенты пополнили баланс, что файлы архивируются нормально.

Все было хорошо пару месяцев, но в один прекрасный день я с удивлением обнаружил, что за контейнер объемом 50 Гб я выплачиваю 600 RUR в месяц:

В связи с чем обратился в поддержку с вопросом «Почему холодное хранилище стоит так дорого»:

И вот тут вскрылось страшное:

В результате переписки выяснилось, что если выгрузка прерывается, оборванные фрагменты файлов так и остаются в невидимом из личного кабинета служебном контейнере, причем на размер этого хранилища не накладывается лимит основного контейнера (я его по-барски сделал 400 Гб):

К сожалению, также выяснилось, что простыми способами невозможно добиться транзакционной завершенности синхронизации данных через rclone или подобную программу синхронизации — чтобы при обрыве операции фрагменты удалялись.

А просто почистить служебное хранилище нельзя до начала синхронизации или после — в нем почему-то хранятся фрагменты файлов из основного хранилища. Почему так сделано, непонятно.

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

Всё это особенно печально еще и потому, что раньше Selectel использовал другую технологию холодного хранилища, потому что тогда еще была заливка даже по FTP. Потом оно перешло на непосредственную технологию от Amazon S3 без своей программной прокладки. В итоге получился ни на что не годный франкенштейн. Хотя я ошибаюсь, поддержка ответила, что и раньше все было точно так же криво:

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

Мой вывод — забудьте про объектные хранилища Selectel. Буду благодарен за рекомендации других объектных хранилищ без таких фокусов. Нужен простой, надежный архив через командную строку. Пусть Rclone, но без служебных контейнеров.

Переписку со службой поддержки прилагаю:

Поддержка

У нас при небольшом объеме холодного хранения получается 600 рублей в месяц, это 6.000 в год.Выгоднее даже брать яндекс-диск.Может мы что-то делаем не так?

Со своей стороны наблюдаем, что у вас есть два контейнера:backupbackup_s3multipartuploadsНа данный момент в контейнере backup хранится 44.5 GiB, а в backup_s3multipartuploads — 551.1 GiB.Контейнер backup_s3multipartuploads, является служебным.При сегментированной загрузке объекта в основной контейнер создается служебный контейнер, в который помещаются сегменты объектов.При загрузке объектов через S3 API контейнер создается автоматически и называется _s3multipartuploads.Вероятно, с вашей стороны производилась загрузка в объектное хранилище по S3, а очистка вручную в панели управления. Хотим отметить, чтобы производилось полное удаление, в том числе и сегментов, необходимо производить удаление через ПО, с которого осуществлялась загрузка.Вы можете произвести удаление ненужных вам сегментов самостоятельно, но для этого необходимо использовать ПО, например, rclone, так как в панели управления данный контейнер не отображается.

А где об этом в документации?Я сохраняю как раз через rcloneКак через Rclone мне удалить данные в служебном контейнере?Как полностью его очистить? через rcloneВ отчетах можно увидеть объем тарифицируемых хранилищ, включая служебное? Я бы тогда по объему бы увидел что что-то не так

Сегментированная загрузка(технология Multipart Upload) является стандартным решением при работе по протоколу S3 не только для Объектного хранилища Selectel. Информация о сегментированной загрузке указана в нашей Документации. Некоторые утилиты API (Rclone, Cyberduck) поддерживают сегментированную загрузку и автоматически включают ее для объектов больше определенного размера. В остальных случаях ее нужно инициализировать вручную.В случае удаления служебного контейнера целиком файлы в основном бакете будут повреждены. Рекомендуем производить перемещение либо удаление файлов контейнера backups_s3multipartuploads только после проверки того, что они не нужны для целостности данных в основном контейнере backups.До обновления продукта «Объектное хранилище» была возможность скрыть и отобразить служебные контейнеры. После обновления служебные контейнеры не отображаются, а их объем суммируется к основному контейнеру, и данный суммированный объем отображается в рамках панели управления в информации об основном контейнере. Также служебный контейнер можно увидеть с помощью rclone:rclone lsd 'конфигурационный файл':При возникновении дополнительных вопросов, пожалуйста, обращайтесь.

Так как мне в итоге синхронизировать файлы через rclone так, чтобы не нужные файлы в служебном хранилище удалялись? Есть пример? По сути я сейчас оплачиваю какие-то старые ненужные файлы в служебном хранилище. Как их удалить, не затрагивая нужные?

До обновления продукта «Объектное хранилище» была возможность скрыть и отобразить служебные контейнеры. После обновления служебные контейнеры не отображаются, а их объем суммируется к основному контейнеру, в вашем случае exporter-files, и данный суммированный объем отображается в рамках панели управления в информации об основном контейнере. Отображение контейнеров возможно через API.Удалить объекты с сегментами вы также можете по нашей инструкции.Вы также можете удалить лишние сегменты файлов в контейнере exporter-files_s3multipartuploads, подключившись к нему напрямую, например через rclone.

А как понять, какие сегменты файлов в служебном контейнере лишние?простая и понятная технология холодного хранения превратилась в какую-то непонятно усложненную штуковину, выкачивающую деньги. Этим можно как-то разумно пользоваться или все же отказаться в пользу более предсказуемых инструментов хранения?

Я лично писал несколько статей на habr за холодное хранение в Selectel, но сейчас вижу, что получился какой-то франкенштейн, где вместо просто холодного хранения нужно плясать вокруг каких-то технических нюансов типа служебных хранилищ, пожирающих память.
Этим можно нормально пользоваться или холодное хранилище теперь только для гиков?
у нас нет ресурсов разбираться как очищать ненужные данные в служебном контейнере.

У вас есть инструкция, как с помощью rclone определить и удалить ненужные в контейнере данные? или нам придется отказаться от этого монстра.

Если перед началом и после окончания синхронизации через rclone очищать служебное хранилище, это решит проблему? или это нарушит хранение данные в основном контейнере?

Чтобы удалить объект с сегментами, удалите файл-манифест. Для удаления используйте API, которое вы использовали для загрузки объекта (панель управления использует Swift API).Если загрузка и удаление объекта выполняется разными способами (например, объект был загружен с помощью S3 API, а удален в панели управления), сегменты объекта могут не удалиться, продолжить храниться в скрытом контейнере и тарифицироваться.При каждой сегментированной загрузке будет создаваться служебный контейнер. Очистку необходимо производить Вам самостоятельно при необходимости. В случае удаления служебного контейнера целиком файлы в основном бакете будут повреждены. Рекомендуем производить перемещение либо удаление файлов контейнера backups_s3multipartuploads только после проверки того, что они не нужны для целостности данных в основном контейнере backups.При возникновении дополнительных вопросов, пожалуйста, обращайтесь.Сегментированная загрузка(технология Multipart Upload) является стандартным решением при работе по протоколу S3 не только для Объектного хранилища Selectel. Некоторые утилиты API (Rclone, Cyberduck, s3cmd ) поддерживают сегментированную загрузку и автоматически включают ее для объектов больше определенного размера. В остальных случаях ее нужно инициализировать вручную.Так, например, если вы используете s3cmd, которая работает по S3 API — при включении сегментированной загрузки создается служебный контейнер _s3multipartuploadsВключение\отключение сегментированной загрузки (multipart upload) зависит от настроек используемой вами утилиты s3cmd. По умолчанию сегментированная загрузка в этой утилите используется всегда, если размер загружаемого объекта превышает 15Мб.Вы также можете полностью отключить сегментированную загрузку при работе с утилитой, используя ключ —disable-multipartВозможно выполнить настройку значения размера объекта, после превышения которого будет включаться multipart upload, это можно сделать при помощи ключа —multipart-chunk-size-mb=SIZEПримеры данных настроек представлены также в документации утилиты s3cmd: https://s3tools.org/kb/showall3.htm#13Также вы можете настроить автоматическое удаление файла манифест при использовании, например, swift api указать время жизни можно в заголовке X-Delete-AfterОбращаем ваше внимание, что существует баг клиента python-swiftclient с установкой x-delete-at и x-delete-after на сегменты. Подробная информация доступна по ссылке.Можем порекомендовать сначала создавать контейнер для сегментов с ‘X-Container-Meta-Default-Delete-After’, например:swift post db_multipart -H 'X-Container-Meta-Default-Delete-After: 2592000'

Я загружаю данные через Rclone в хранилище.у нее есть команда:—disable-multipart?Если я отключу multipart, служебный контейнер не будет создаваться?Иногда я удаляю файлы через консоль приложения.Как мне сейчас очистить служебный контейнер? Как понять какие данные связаны с основным контейнером?Что значит удалять манифесты, а не файлы?Я не использую никакое API кроме rcloneВы можете на данный момент удалить служебный контейнер так, чтобы основные данные не были разрушены, чтобы нам не начисялись деньги за хранение служебного контейнера?Или подсказать какой командой это сделать? Не через API, потому что я его не использую.

— Если я отключу multipart, служебный контейнер не будет создаваться?

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

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

— Как мне сейчас очистить служебный контейнер? Как понять какие данные связаны с основным контейнером? Что значит удалять манифесты, а не файлы?
Как вы знаете, в основной контейнер () вместо объекта загружается манифест — файл с описанием сегментов и пути до них. При скачивании файла-манифеста сегменты автоматически подставляются в объект. Поэтому чтобы удалить объект с сегментами, необходимо сначала удалить файл-манифест. Для удаления используйте API, которое вы использовали для загрузки объекта — в данном случае Rclone. Необходимо очистить бакет backup_s3multipartuploads от файлов-манифестов сегментов объектов, которые не нужны, а так же в будущем учитывать этот момент.

— Вы можете на данный момент удалить служебный контейнер так, чтобы основные данные не были разрушены?

Нет, удаление и менеджмент служебных контейнеров осуществляются со стороны клиента.

Подождите, я же оплачиваю за объем файлов в основном контейнере, значит они там хранятся полностью?или вы имеете ввиду, что пока файл не закачается в основной контейнер, он хранится там в виде манифеста?Почему тогда в служебном контейнере хранится много файлов? Они не докачались и остались в рамках незавершенной транзакции? Почему они там хранятся.Как вычленить их и удалить через rclone, если вы не показываете служебный контейнер в личном кабинете?Ну невозможно так пользоваться сервисом, реально.

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

Вы оплачиваете за объем хранения в хранилище за весь объем. Как в основном контейнере, так и в служебных.Служебные контейнеры существовали и работали всегда, как до обновления так и после. По умолчанию эти контейнеры скрыты, это было так же всегда, если не была установлена соответствующая настройка.Причина по которой сегменты могли копиться в служебном контейнере, это:Незавершенные загрузки. Само по себе хранилище не удаляет ничего, если на это не пришел запрос от клиента. Т.е. если и были такие случаи, то запрос на удаление сегментов должна была направить программа, которой выполняется загрузка. Как правило Swift или S3 клиенты этого не делают;Из-за ошибки при перезаписи объекта. Ранее существовал феномен, когда при перезаписи объекта с сегментами, вконце должен был быть удален манифест, но так как манифест имел то же имя, что и старый файл, он не удалялся. В результате старые сегменты сохранялись. Это исправлено и теперь перезапись сегментов и манифеста работает корректно.Что бы почистить хранилище, возможны два варианта:Скачать объекты на локальный компьютер, или перенести объекты в другой контейнер, с новым названием. Перенос рекомендуем выполнить при помощи Rclon или аналогичной программы. После переноса можно будет удалить все объекты в старом контейнере и в служебном контейнере. Служебные контейнеры можно увидеть через тот же Rclon или любой другой клиент;Почистить лишние объекты вручную, но это трудозатратный вариант.— Скажите, если я удалю основной контейнер, то служебный тоже удалится?Удалятся те сегменты, который принадлежат имеющимся объектам. Те, сегменты, для которых нет манифеста сохранятся. В данном случае поможет удаление двух контейнеров.

Это исправит ситуацию на текущий момент. а как этим пользоваться в будущем, чтобы не накапливались данные в служебном контейнере? Я так понимаю, что способа отличить корректно завершенные сегменты от не корректных нет? получается, система нежизнеспособна, если по крайней мере использовать только Rclone?Ну как же так? это полное фиаско холодного хранилища….По умолчанию эти контейнеры скрыты, это было так же всегда, если не была установлена соответствующая настройка. — а можно включить эти контейнеры, чтобы они были видимы в ЛК?И я не совсем понял, если данные перенеслись в основной котейнер, почему они хранятся еще и в служебном контейнере? Т.е. если система мне показывает, что файл хранится в основном контейнере, почему он хранится в служебном контейнере?У меня у трех клиентов, включая этого, настроена архивация Selectel, если мы не найдем сейчас решения в рамках поддержки, придется отказываться от облака, потому что мы опять сталкиваемся с неконтролируемым ростом служебного контейнера. На него можно наложить ограничение по объему?

И нет рабочей схемы с использованием RCLONE, придется городить какие-то костыли. Да и сама схема хранения не очень понятна. Почему служебное облако не чистит данные за собой? Почему нельзя удалить все служебные данные? Почему файл показывается в основном контейнере, хотя часть его еще находится в служебном облаке? Это как-то все очень некрасиво реализовано.
Получается, технические проблемы перекладываются на плечи пользователей.
неужели так сложно организовать прозрачное облако?
Я близок к разочарованию в Selectel и уже готовлюсь писать статью на habr об этом фиаско.

Почему в личном кабинете не видно всего, за что мы платим и служебные контейнеры скрыты? С точки зрения пользователя это обман, уж извините.

Хорошо что суммы пока что копеечные.

Если надо, позвоните мне +7909 153 29 87 Сергей

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

В случае ошибки с перезаписью файла и накапливанию старых сегментов, эта проблема была устранена ранее, сейчас такого не будет. В случае, если загрузка будет оборвана незавершившись, то никак этого обойти не получится, потребуется зачистить сегменты перед новой загрузкой. Если от Вашего программного обеспечения не придет запрос на очистку, ничего не произойдет. Для хранилища нет разницы сегмент это или что то другое, манифест и сегменты создает клиент Swift или S3, а не хранилище. К нам пришел запрос PUT мы загрузили, ничего более.

— А можно включить эти контейнеры, чтобы они были видимы в ЛК?

Сейчас включить их в панели управления нельзя. В будущем мы добавим эту возможность. Если Вы управляете хранилищем при помощи лбого инструмента Swift или S3 все эти контейнеры видны. Их нет только в панели управления, но в панели управления нельзя загрузить файл сегментировано. А соответственно Вы не создадите какие то сущности, о которых не сможете узнать.

— И я не совсем понял, если данные перенеслись в основной котейнер, почему они хранятся еще и в служебном контейнере? Т.е. если система мне показывает, что файл хранится в основном контейнере, почему он хранится в служебном контейнере?

Вопрос не понятен, сами объекты никуда не переносятся и если Вы переносите манифест, то переносятся и служебные объекты в соответствующий контейнер.

— У меня у трех клиентов, включая этого, настроена архивация Selectel, если мы не найдем сейчас решения в рамках поддержки, придется отказываться от облака, потому что мы опять сталкиваемся с неконтролируемым ростом служебного контейнера. На него можно наложить ограничение по объему?

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

— Почему служебное облако не чистит данные за собой? Почему нельзя удалить все служебные данные? Почему файл показывается в основном контейнере, хотя часть его еще находится в служебном облаке? Это как-то все очень некрасиво реализовано.

Потому что облако их не создает. Это принцип работы S3 или Swift. Запрос на сегментирование приходит от Вас. Для удобства сделано так, что в основном контейнере отображается общий объем манифеста и всех сегментов относящихся к ним, иначе все файлы занимали бы 0 кб., что вызывало куда больше бы вопросов.

— Почему в личном кабинете не видно всего, за что мы платим и служебные контейнеры скрыты? С точки зрения пользователя это обман, уж извините.

На сегодняшний день действительно нельзя сделать выгрузку затрат по контейнерам. Мы работаем над реализацией этого функционала. Что касается контейнеров с сегментами, они отображаются через любой инструмент, который работает с хранилищем, кроме панели управления.
Скрыли эти контейнеры не для того, что бы утаить содержимое, а для безопасности данных. В противном случае регулярно возникают инциденты с их удалением.
В целом не существует такого понятия как «Служебный» контейнер. Для Селектела — это просто контейнер с данными, такой же как и все другие. Служебный он относительно и скорее для Вашего программного обеспечения. Swift не позволяет, по умолчанию, работать с объектами больше 5 Гб., без дополнительных манипуляций. При необходимости можно ознакомиться с сегментированной загрузкой в документации https://developers.selectel.ru/docs/cloud-services/cloud-storage/storage_swift_api/#сегментированные-объекты

Резюмируя:
— Ошибка с перезаписью объектов была устранена ранее, сейчас не повторяется;
— При обрыве загрузке сегменты нужно чистить руками, хранилище не отслеживает и не будет отслеживать к чему тот или иной объект относится;
— Служебный контейнер создает не хранилище, а запрос на его создание приходит от клиента. Служебным он также является для него, а не для Селектела;
— Скрыты контейнеры для безопасности. Так как удаление контейнеров с сегментами — это частая практика. После восстановить данные не получится;
— Если клиент использует программное обеспечение для работы с хранилищем, то все контейнеры видны. Через панель управления нельзя загрузить объект сегментировано.

Вы пишите, что лимиты накладываются и на служебный контейнер. Но вы пишите: На данный момент в контейнере backup хранится 44.5 GiB, а в backup_s3multipartuploads — 551.1 GiB.А у меня лимит на основной контейнер вроде бы 100 Гб? Сейчас баланс отрицательный, не могу проверить. Как так?

Скрыты контейнеры не для безопасности, а потому что у вас нет технической возможности их отображать в ЛК.
Когда я вижу «для безопасности» у меня возникают сомнения. Если скрыты для безопасности, ок, дайте галочку «Показать скрытые контейнеры», для уверенных в своих действиях пользователей.

Правильно ли я понимаю, что используя только rclone, невозможно использовать нормально контейнер, т.к. невозможно очищать оборванные файлы (их просто невозможно отличить от завершенных нормально)?
И какой сценарий тогда использования облака вы предлагаете, если нет нормальной транзакционной завершенности?

Посмотрел, у меня лимит 400 Гб, а текущий размер контейнера 600 гб, при том что всего 60 объектов хранится в основном контейнере и то в среднем по 3-4 Гб.
Как лимит был преодолен? Вы же пишите, что лимит не может быть превзойден.

Разве это не ошибка с вашей стороны, почему за нее должны платить мы?

Галочка «показать скрытые контейнеры» ранее была, об этом сообщалось в рамках этого тикета. После обновления ее не стало, в будущем она будет возвращена. Ее отсутствии вызвано сменой архитектуры. Про «для безопасности» контейнеры были скрыты в момент, когда галочка еще была в панели. Никакого противоречия в этом нет.По вопросу дублирования лимитов на контейнеры с сегментами, мы проверим работу. Изначально все должно дублироваться с основного.Не имеет значения какую программу Вы выбираете. Повторно обращаем внимание, что хранилище обрабатывает запрос, присланные от программы. Приходит PUT какого то сегмента, хранилище его загрузит. Если загрузка оборвалась, хранилище примет это как завершение загрузки. И ничего не будет удалять. Для нас, что контейнер с сегментами, что основной контейнер они одинаковые. Связку организует запрос, от Вас который формируем манифест и связывает его с сегментами.Сейчас мы рассчитываем сумму потраченную на лишние сегменты и средства будут возвращены.

Скажите, у вас есть какой-либо рабочий сценарий или пример, как использовать rclone для транзакционно завершенного копирования файлов в объектное хранилище? или это невозможно организовать только Rclone?

Потому что я не представляю, как удалять не завершенные отправки.

К сожалению, готового решения у нас нет.Но вы можете попробовать использовать проверку копирования: https://rclone.org/commands/rclone_check/Также изменить размер сегментов с помощью -swift-chunk-size, но рекомендуем вам все же не выбирать слишком большой объем сегмента, так как может произойти обрыв соединения, следовательно, файл не будет загружен полностью.Как ранее было отмечено, при обрыве загрузке сегменты необходимо производить вручную, хранилище не отслеживает к чему тот, или иной объект относится.

Увы, это сводит на нет все преимущества холодного хранилища Selectel. если нет простого и надежного инструмента копирования, то вся эта кухня ни к чему. Буду вынужден искать альтернативы хранилищу. Слишком костыльный подход для простой задачи бэкапа.

Придется скрепя сердце информировать клиентов о переходе на новое облачное хранилище. увы. вашей системой невозможно по-человечески пользоваться. раньше же было нормально, зачем все сломали?

Здравствуйте. Хранилище не меняло принципа работы. Все было ровно также как и сейчас, единственное изменение это добавление проектов и гибкого управления пользователями.Сценарии работы с любым инструментом как были так и остаются идентичными. Раньше rclone как не мог контролировать загрузку, так и не может.Вы столкнулись с дублированием сегментов и мы неоднократно сообщили, что исправили эту ситуацию. Все остальное осталось точно таким же. Компенсация за лишние затраты также будет зачислена.

Подождите, я не понял.сейчас если загрузка оборвется, в служебном хранилище останется сегмент?Т.е. даже если я сейчас почищу служебный и основной контейнер, я не смогу использовать Rclone для синхронизации данных на контейнер, потому что в случае обрыва загрузки в служебном контейнере опять будут болтаться беспризорные сегменты?

… to be continued…

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 103: ↑82 и ↓21+100
Комментарии242

Публикации