Как удалить файлы из облака mail ru
Обновлено: 20.11.2024
Сегодня мы увидим, как работает удаление файлов в облачное хранилище и как восстановить загруженные данные, которые исчезли из облачных хранилищ Dropbox, Google Диска и Microsoft OneDrive.
Содержание:
Облачное хранилище – это удобный сервис, предназначенный для хранения личных файлов, фотографий, текстовых документов и других файлов.
Через облако вы можете обмениваться данными, предоставлять доступ другим пользователям или просто хранить различную информацию, которая может занимать слишком много места на жестком диске.
Кроме того, с помощью облачной синхронизации пользователи могут получать доступ к данным на всех своих устройствах. Например, документ, загруженный с вашего компьютера, будет быстро доступен на вашем смартфоне, планшете или другом гаджете.
Современное облачное хранилище относительно надежно и безопасно, но в некоторых случаях могут возникать сбои, приводящие к удалению или недоступности загруженных данных.
Как я могу вернуть свои данные на Google Диске?
Google Диск — один из самых популярных облачных сервисов, где вы можете бесплатно хранить до 15 ГБ информации. Облако от Google имеет относительно простую схему работы при удалении информации. Если пользователь решил удалить определенные данные, ему достаточно зайти в нужную папку, выбрать файл, нажать правую кнопку мыши и выбрать «Удалить»
После такого удаления файл будет перемещен в Корзину, где находятся все данные, когда-либо удаленные пользователем. Эта функция имеет несколько сходств со стандартным перемещением файлов в корзину из интерфейса Windows. Подробнее об удалении и функционировании Корзины вы можете узнать в статье «Как восстановить файлы, перемещенные в Корзину, и ее очистка»
Для восстановления информации из Корзины необходимо: перейти в раздел «Корзина», который находится в левой колонке меню облачного хранилища. Найдите удаленный файл, щелкните его правой кнопкой мыши и выберите «Восстановить»
Здесь следует быть осторожным, потому что, если пользователи выберут «Удалить», файл корзины будет полностью очищен, и его восстановление будет невозможно!
Вы можете использовать специальную функцию для полной очистки корзины, а не для удаления файлов по одному. Для этого: перейдите в Корзину, нажмите на флажок рядом с пунктом «Корзина», расположенный под поисковой строкой на облачном хранилище, и выберите функцию «Очистить корзину».
Следует отметить, что удаление без возможности восстановления в проводнике Windows — довольно неординарная процедура, о которой многие пользователи не подозревают. Простое удаление файлов с компьютера комбинацией клавиш Shift+Delete оставляет практически стопроцентную гарантию восстановления информации с помощью специального программного обеспечения.
Например, утилита RS Partition Recovery может восстановить случайно удаленную или отформатированную информацию, а также данные, утраченные в результате изменений логической структуры или файловой системы накопителя. Таким образом, восстановление данных, удаленных с помощью Shift+Delete – не сможет бесследно уничтожить файл. О том, как удалить информацию и не оставить следов, вы можете прочитать в статье «Удаление файлов без возможности восстановления»
Как вернуть данные в Dropbox?
Облачное хранилище Dropbox имеет некоторые отличия в работе и немного другую систему удаления файлов из облака. В Dropbox нет корзины, так как она заменена функцией, скрывающей файлы, которые не меняют своего местоположения после удаления. Чтобы удалить файл в Dropbox, нужно зайти в нужную папку, найти нужный файл, нажать на трехточечный значок и в открывшемся меню выбрать «Удалить».
После подтверждения удаления файл будет скрыт, но останется в текущей папке. Чтобы просмотреть все удаленные файлы из указанной папки, нажмите «Показать удаленные», расположенную в правой части интерфейса.
После отображения удаленные данные с точной датой удаления будут отображаться в папке. Если нажать на три точки возле удаленных файлов, откроется небольшое меню, из которого можно Восстановить файл или Полностью удалить его из облака без возможности восстановления.
Как вернуть данные в Microsoft OneDrive?
Microsoft OneDrive и Google Chrome имеют схожие функции для удаления файлов с облачного диска. Таким образом, удаление приводит к перемещению файлов в корзину.
Выглядит это так: находите нужный файл, кликаете по нему правой кнопкой мыши и в выпадающем меню выбираете «Удалить».
Чтобы восстановить удаленные файлы, перейдите к элементу "Корзина" в левой части экрана и нажмите кнопку "Восстановить все элементы".
После восстановления файлы вернутся на прежнее место.
Если вам не нужно восстанавливать все файлы, вы можете выбрать их по одному и вернуть из корзины с помощью кнопки «Восстановить».
Функция безвозвратного удаления всех или определенных файлов также находится в корзине.
Как я могу вернуть данные в [email protected]?
Как и в других хранилищах, использующих Корзину, пользователи [email protected] могут восстановить данные, удаленные в Корзину, с помощью столбца «Корзина» в главном меню веб-версии хранилища.
Чтобы восстановить файлы из Корзины, выберите нужные элементы и нажмите кнопку «Восстановить».
Важно отметить: файлы, перемещенные в Корзину более 14 дней назад, будут автоматически удалены без возможности восстановления!
Что делать, если файлы были полностью удалены?
Если вы вдруг обнаружите, что важные данные были удалены из облака. В этом случае мы рекомендуем проверить Корзину (для Google Диска или OneDrive) или включить отображение удаленных файлов (для Dropbox), чтобы найти, куда их можно переместить.
Если их там нет, вы можете попробовать вернуть информацию через поддержку облачного хранилища.
К сожалению, это не всегда может быть полезно. В этом случае мы рекомендуем следующее:
- Запомните, с какого компьютера вы загружали важную информацию в облако.
- Попробуйте найти нужные файлы с помощью встроенного поиска Windows.
- Если информация была удалена сразу после загрузки в облако, вам следует скачать и установить RS Partition Recovery.
- После этого вам нужно запустить глубокое сканирование дисков и найти нужные файлы среди списка всех данных.
- Последний шаг — процесс восстановления данных с помощью программы.
Часто задаваемые вопросы
Удаленный файл можно восстановить только из корзины Google Диска. Если файл был удален из Корзины, его невозможно восстановить.
Dropbox не удаляет файлы, а просто делает их невидимыми. Поэтому, чтобы восстановить файл, нужно просто нажать на три точки вверху и выбрать «Показать удаленные файлы». После этого вы сможете увидеть все ранее удаленные файлы. Нажмите на нужный файл и выберите «Восстановить».
У меня был важный файл в папке Dropbox на моем компьютере. Из-за ошибки синхронизации он исчез. Как я могу восстановить важный файл?
Загрузите и установите RS Partition Recovery. Он найдет ваш файл и восстановит его в указанном месте. Процесс восстановления подробно описан на нашем сайте.
Единственное, что вы можете сделать в этой ситуации, это попросить нашу службу поддержки восстановить файл. Как показывает практика, такое решение срабатывает довольно часто.
Чтобы восстановить данные на Google Диске, перейдите в Корзину, выберите нужный файл, щелкните его правой кнопкой мыши и нажмите "Восстановить".
О Дене Брусене
Автор и инженер RecoverySoftware. В своих статьях он делится своим опытом восстановления данных на ПК и безопасного хранения информации на жестких дисках и на RAID-массивах.
1. Удалить Аккаунт Cloud Mail ru через почту
- В соответствии с GDPR – Общее положение о защите данных (для резидентов ЕС). Это дает вам право попросить организацию, которая хранит данные о вас, удалить эти данные. Это известно как «право на стирание». Вы можете сделать запрос в устной или письменной форме. Мы рекомендуем писать по электронной почте, чтобы служить доказательством. У организации есть один календарный месяц, чтобы ответить на ваш запрос.
- В соответствии с Законом штата Калифорния о конфиденциальности потребителей (CCPA). Это дает жителям Калифорнии право требовать от компании удаления данных/личной информации, которые у нее есть о вас. По закону компания обязана удалить личную информацию потребителя из своих записей и указать всем поставщикам услуг также удалить данные. Несоблюдение компанией требований Закона о защите прав потребителей и потребителей (CCPA) может привести к штрафу в размере до 7 500 долларов США за каждое нарушение.
- В своем электронном письме укажите причины, по которым вы хотите, чтобы ваши данные/аккаунт были удалены. Обратите внимание, что в соответствии с GDPR или CCPA вам не нужно указывать причину вашего запроса.
- Предоставьте всю необходимую информацию о вашей учетной записи в Cloud Mail ru.
- Укажите закон, в соответствии с которым вы делаете запрос — GDPR или CCPA.
- Уведомить Cloud Mail ru о штрафе за несоблюдение — штраф в размере 7 500 долларов США в соответствии с CCPA и 4% от годового оборота в соответствии с GDPR.
- Отправьте письмо по адресу [email protected]Войдите, чтобы увидеть письмо.
2. Удаление приложения Cloud Mail ru с телефона
а. Как удалить приложение Cloud Mail ru с вашего iPhone
- В настройках iPhone нажмите «Общие».
- Теперь нажмите "Хранилище iPhone" и прокрутите вниз, чтобы увидеть все приложения, установленные на вашем телефоне.
- Нажмите на Cloud Mail.ru: сохраните фото в безопасном приложении, которое хотите удалить.
- На следующем экране выберите «Удалить Cloud Mail.ru: Храните фото в безопасности» и подтвердите удаление.
б. Как удалить Cloud Mail ru с телефона Android
- Откройте Google Play
- Из значка меню-гамбургера перейдите в раздел "Мои приложения и игры".
- В списке доступных приложений на вашем устройстве выберите Облако Mail.ru: Храните ваши фотографии в безопасности.
- Далее нажмите "Удалить".
- На главном экране или в панели приложений нажмите и удерживайте приложение «Облако Mail.ru: храните фото в безопасности», которое хотите удалить.
- Нажмите на часть экрана с надписью "Удалить".
- Перейдите к настройкам телефона Android.
- Нажмите "Приложения".
- Выберите приложение «Облако Mail.ru: Храните фото в безопасности», которое хотите удалить.
- Нажмите "Удалить".
Сообщения о проблемах с отменой
Мне нужно отправить все мои фотографии обратно на карту памяти. Пожалуйста, объясните, как это сделать
Несколько месяцев назад случилось неизбежное - мой жесткий диск с архивом приказал долго жить. К счастью, к тому времени все файлы были скопированы в облако и ничего не потерялось.
После покупки нового диска я переустановил облачный клиент и дождался загрузки моих файлов. Но через пару минут увидел, что на диске ничего не появилось, но файлы быстро удалились из Облака.
В конце статьи есть UPD, UPD2 , UPD3 и UPD4, в которых описаны причины такого поведения.
ТЛ; ДР: ложная тревога, с файлами и синхронизацией все в порядке, но пользовательский интерфейс и работа тех. поддержка нуждается в дальнейшем развитии.
Как выяснилось после общения с тех. поддержки, это стандартное поведение клиента - какую бы папку вы ему не скармливали, он начинает ее синхронизировать с облаком, удаляя оттуда все, что не находится в папке.
Загрузка файлов через WebDav также невозможна: и все такое
Остается возможность загрузки файлов через веб-интерфейс. Файлы туда можно скачивать по одному, а можно выбрать несколько файлов или папок и скачать их одним архивом, что довольно удобно. Единственным ограничением является то, что размер архива не может превышать 4 ГБ.
Я пытался пойти этим путем, но быстро понял, что это очень неудобный вариант:
- Ограничение в 4 гигабайта означает, что если у вас есть около терабайта в облаке, вам придется загрузить не менее 250 архивов.
- Каждый архив нужно создавать вручную, выбирая папки, считая их общий размер и отмечая уже скачанные.
- Иногда архивы не открываются по неизвестной причине.
- Структура папок потеряна.
Первое, что вам нужно понять, это как получить список папок и файлов. Изначально я планировал просто разобрать страницы, выдрать из них информацию о папках и файлах и построить дерево. Но, открыв исходный код страницы, я сразу увидел, что весь интерфейс для работы с документами построен через javascript, что, если подумать, очень логично.
Поэтому у меня было два возможных решения: подключить
Selenium и все равно построить дерево из html или разобраться с внутренним API, который используется в скрипте.
Я выбрал второй путь, как наиболее разумный — зачем парсить что-то сторонними инструментами, если у вас уже есть готовый API?
К счастью, скрипт не был запутан и даже не сжат - мне были доступны оригинальные имена переменных и функций и комментарии разработчиков, это значительно облегчило задачу.
После нескольких минут изучения я увидел, что все доступные методы API описаны в виде массива:
Вот почему я не трачу время в своем коде на красивое форматирование — кто-нибудь его обязательно сломает.
Открываем страницу в браузере и видим такой ответ:
Очевидно, вам необходимо авторизоваться на портале. Авторизуйтесь, повторите запрос и увидите еще одну ошибку:
Неудивительно, что для выполнения запросов API требуется токен. В списке методов есть два подходящих метода: tokens/csrf и tokens/download .
Запрашиваем, добавляем в вызов метода папки параметр ?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP и получаем новую ошибку:
Здесь мне пришлось снова прочитать источник, чтобы узнать, какие аргументы принимает этот метод. Оказалось, что в параметре home нужно указать папку, содержимое которой мы хотим получить.
Информация о файлах и каталогах — это то, что вам нужно!
Функциональность API подтверждена, схема его работы понятна — можно приступать к написанию программы. Я решил написать консольное приложение на php, так как хорошо знаю этот язык. Компонент Console от Symfony идеально подходит для этой задачи. Я уже писал консольные команды для Laravel, которые построены именно на этом компоненте, но там уровень абстракции достаточно высок и напрямую с ним я не работал, поэтому решил, что пора познакомиться поближе. /p>
Не буду пересказывать документацию, она достаточно подробная и очень простая. Ничего не зная о компоненте, я несколько часов писал вот такие простенькие интерфейсы:
Так выглядит приложение в процессе загрузки файлов.
И так в конце: выводится небольшая табличка (максимум 100 строк) с информацией о скачанных файлах. Никакой практической пользы это не несет и сделано исключительно в образовательных целях.
Структура консольного приложения может включать несколько команд , вызванных следующим: аргумент команды php app.php --option . Но для моих целей мне нужна только одна команда и я хотел бы начать загрузку следующим образом: php app.php arguments --option . Этого легко добиться с помощью инструкций в документации компонента.
Итак, консольное приложение готово, оно отображает информацию с заранее подготовленных фикстур и даже покрыто тестами. Пришло время реализовать прямое получение информации о файлах и папках из облака.
Поскольку в ответ на запрос авторизации возвращается несколько редиректов, которые в конечном итоге приводят к почтовому ящику пользователя, я решил просто проверить заголовок страницы, чтобы определить, прошла ли авторизация успешно.
Проверка настолько проста, что теперь она не проходит, если в почтовом ящике есть непрочитанные сообщения — их количество отображается в шапке страницы. Но коробкой не пользуюсь, так что для моих целей этого достаточно.
Далее я попытался запросить токен csrf, но с удивлением получил знакомую ошибку:
Проще всего это сделать один раз при инициализации клиента:
Еще один параметр инициализации — 'debug' => true , с ним отладка запросов практически безболезненна.
Я добавил этот запрос после запроса авторизации и, наконец, смог получить токен. Ну а дальше дело техники - запросить содержимое корневой папки и рекурсивно содержимое ее подпапок, и дерево готово.
Как оказалось, в итоге дерево даже не понадобилось — каждый файл хранит полный путь от корня, так что для скачивания достаточно плоского списка.
Учитывая, что адреса шардов отличаются только номером, думаю, можно было бы не заморачиваться и хардкодить адрес, а если и делать, то до конца!
Нас интересует массив, хранящийся в get .
Выбираем из массива шардов случайный элемент, добавляем к нему адрес файла и ссылка на скачивание готова!
Для экономии памяти можно сразу указать при создании запроса, куда Guzzle должен писать ответ; для этого используется параметр стока.
Окончательный код выложен на GitHub под лицензией MIT, буду рад, если кому-то пригодится.
Приложение далеко от идеала, его функционал ограничен, в нем точно есть баги и покрытие тестами оставляет желать лучшего, но оно на 100% решило мою проблему, а это именно то, что требуется от MVP.
*Все, что не успел удалить первым.
UPD: Связь с тех. поддержка.
Добрый день.
Я заменил жесткий диск, на котором находилась облачная папка. Старый диск сломан, поэтому нет возможности перенести данные с него. В веб-интерфейсе все мои данные на месте.
Когда я создал пустую папку на новом диске и настроил ее в приложении, файлы в облаке начали удаляться при синхронизации.
Как мне настроить приложение на компьютере, чтобы оно считало основной копией веба, а не пустую папку - то есть я бы начал скачивать файлы на компьютер, а не удалять их в облаке.
Пробовал качать файлы через браузер, но это нереально - их очень много.
К сожалению,
восстановить файлы, удаленные одновременно в Облаке и на ПК, невозможно.
По умолчанию
выполняется полная двусторонняя синхронизация между веб-интерфейсом и приложением на компьютере - при удалении файла из
Облака в веб-интерфейсе файл также удаляется в приложении и
наоборот: удаление файла в приложении также удаляет файл в Облаке.
Вы можете настроить выборочную синхронизацию в клиенте Cloud PC. Для этого
щелкните правой кнопкой мыши по значку Облака (в области уведомлений) и
перейдите в раздел «Выбор папок».
В открывшемся окне снимите галочки напротив тех папок, для
которых вы хотите отменить синхронизацию и нажмите «Выбрать».
Если папка была ранее синхронизирована, то она будет удалена с вашего
компьютера, но папка, а также все содержащиеся в ней
файлы, будут сохранены в веб-интерфейсе Облака .
Чтобы повторно включить синхронизацию для ранее удаленной папки,
щелкните правой кнопкой мыши значок облачного приложения, нажмите «Выбрать папки» и
установите флажок рядом с названием нужной папки.
Вы также можете временно отключить синхронизацию. Для этого
щелкните правой кнопкой мыши значок облачного приложения и выберите «Приостановить
синхронизацию».
Возможно я не совсем ясно изложил свою проблему, попробую перефразировать.
Все мои файлы сейчас находятся в облаке. Я купил новый жесткий диск и хочу загрузить на него эти файлы. Но когда я создал на нем пустую папку и указал ее в приложении, вместо загрузки файлов из облака на компьютер файлы начали удаляться из облака.
Как мне запустить процесс в обратном направлении - скачать все из облака на компьютер без использования веб-интерфейса.
Если это невозможно сделать через приложение, есть ли альтернативные инструменты? WebDav, я так понимаю, еще не реализован?
В данный момент эта функция отсутствует.
Ваш комментарий передан разработчикам.
UPD3: На ноуте, где раньше никогда не стоял облачный клиент, скачал последнюю версию с официального сайта, установил, запустил. При выборе существующей папки история повторяется: файлы вместо скачивания начинают удаляться. Папку пробовал не создавать - аналогично.
На индексы и тела приходится только 15 % объема хранилища, тогда как 85 % занимают файлы. Итак, оптимизацию файлов (то есть вложений) стоит изучить подробнее. В то время у нас не было дедупликации файлов, но мы подсчитали, что это может уменьшить общий размер хранилища на 36%, потому что многие пользователи получают одни и те же сообщения, такие как прайс-листы из интернет-магазинов и информационные бюллетени из социальных сетей, которые содержать изображения и так далее. В этой статье я опишу, как мы внедрили систему дедупликации под руководством PSIAlt.
Дополнительная литература на SmashingMag:
Познакомьтесь с сенсорным дизайном для мобильных интерфейсов – совершенно новым руководством Стивена Хубера по дизайну для мобильных устройств с проверенными, универсальными и ориентированными на человека рекомендациями. 400 страниц, заполненных подробными исследованиями пользователей и рекомендациями.
Хранение метаданных
Мы имеем дело с потоком файлов. Когда мы получаем сообщение, мы должны доставить его пользователю как можно скорее. Нам нужно уметь быстро распознавать дубликаты. Простым решением было бы назвать файлы на основе их содержимого. Мы используем SHA-1 для этой цели. Исходное имя файла хранится в самом письме, поэтому нам не нужно об этом беспокоиться.
После получения нового электронного письма мы извлекаем файлы, вычисляем их хэши и добавляем результат в электронное письмо. Это необходимый шаг, чтобы можно было легко найти файлы, принадлежащие определенному электронному письму, в нашем будущем хранилище, когда это электронное письмо будет отправлено.
Теперь давайте загрузим файл в наше хранилище и выясним, существует ли там уже другой файл с таким же хешем. Это означает, что нам нужно хранить все хэши в памяти. Назовем это хранилище хэшей FileDB.
Один файл можно прикрепить к разным электронным письмам, поэтому нам понадобится счетчик, который отслеживает все электронные письма, содержащие этот файл.
Счетчик увеличивается с каждым новым загружаемым файлом. Около 40% всех файлов удаляются, поэтому, если пользователь удаляет электронное письмо, содержащее файлы, загруженные в облако, счетчик должен быть уменьшен.Если счетчик достигает нуля, файл можно удалить.
Здесь мы сталкиваемся с первой проблемой: информация об электронном письме (индексы) хранится в одной системе, а информация о файле — в другой. Это может привести к ошибке. Например, рассмотрим следующий рабочий процесс:
- Система получает запрос на удаление сообщения электронной почты.
- Система проверяет индексы электронной почты.
- Система видит наличие вложения (SHA-1).
- Система отправляет запрос на удаление файла.
- Происходит сбой, поэтому письмо не удаляется.
В этом случае письмо остается в системе, но счетчик уменьшается на 1. Когда система получает второй запрос на удаление этого письма, счетчик снова уменьшается, и мы можем столкнуться с ситуацией, когда файл все еще прикреплен к электронному письму, но счетчик уже равен 0.
Не потерять данные очень важно. У нас не может быть ситуации, когда пользователь открывает электронное письмо и не обнаруживает там вложений. При этом хранение некоторых избыточных файлов на дисках не имеет большого значения. Все, что нам нужно, — это механизм, позволяющий однозначно определить, правильно ли счетчик установлен на 0. Поэтому у нас есть еще одно поле — magic .
Алгоритм прост. Вместе с хэшем файла мы храним в электронном письме случайно сгенерированное число. Все запросы на загрузку или удаление файла учитывают это случайное число: в случае запроса на загрузку это число добавляется к текущему значению магического числа; если это запрос на удаление, это случайное число вычитается из текущего значения магического числа.
Таким образом, если все электронные письма увеличивали и уменьшали счетчик нужное количество раз, то магическое число также будет равно 0. В противном случае файл нельзя удалять.
Давайте рассмотрим пример. У нас есть файл с именем sha1. Он загружается один раз, и письмо генерирует для него случайное (магическое) число, равное 345.
Затем приходит новое электронное письмо с тем же файлом. Он генерирует собственное магическое число (123) и загружает файл. Новое магическое число добавляется к текущему значению магического числа (345), а счетчик увеличивается на 1. В результате в FileDB мы имеем магическое число со значением 468 и счетчиком, установленным на 2. .
После того как пользователь удалит второе электронное письмо, магическое число, сгенерированное для этого электронного письма, вычитается из текущего значения магического числа (468), а счетчик уменьшается на 1.
Давайте сначала посмотрим на обычный ход событий. Пользователь удаляет первое электронное письмо, и магическое число и счетчик становятся равными 0. Это означает, что данные непротиворечивы и файл можно удалить.
Теперь предположим, что что-то пошло не так: второе письмо отправляет два запроса на удаление. Значение счетчика, равное 0, означает, что ссылок на файл больше нет, но магическое число, равное 222, сигнализирует о проблеме: файл нельзя удалить, пока данные не будут согласованы.
Давайте еще немного разовьем ситуацию. Предположим, что первое электронное письмо также было удалено. В этом случае магическое число (-123) по-прежнему сигнализирует о несоответствии.
В качестве меры предосторожности, когда счетчик достигает 0, а магическое число — нет (в нашем случае магическое число — 222, а счетчик — 0), файлу присваивается флаг «Не удалять». Таким образом, даже если — после серии удалений и загрузок — и магическое число, и счетчик каким-то образом станут 0, мы все равно будем знать, что этот файл проблемный и его нельзя удалять. Системе не разрешено генерировать магический узел 0. Если вы отправите 0 в качестве магического числа, вы получите сообщение об ошибке.
Вернуться к FileDB. Каждая сущность имеет набор флагов. Планируете ли вы их использовать или нет, они вам понадобятся (например, если файл необходимо пометить как неудаляемый).
У нас есть все атрибуты файла, за исключением того, где файл находится физически. Это место определяется сервером (IP) и диском. Таких серверов и два таких диска должно быть два. Мы храним две копии каждого файла.
Но на одном диске хранится очень много файлов (в нашем случае около 1 миллиона), а значит, эти записи будут идентифицироваться одной и той же парой дисков в FileDB, поэтому хранить эту информацию в FileDB было бы расточительно. Поместим его в отдельную таблицу PairDB, связанную с FileDB через идентификатор пары дисков.
Полагаю, само собой разумеется, что помимо идентификатора пары дисков нам также понадобится поле флагов. Забегая немного вперед, упомяну, что это поле сигнализирует о том, заблокированы ли диски (скажем, один диск вышел из строя, а другой копируется, поэтому ни на один из них нельзя записать новые данные).
Кроме того, нам нужно знать, сколько свободного места есть на каждом диске, а значит, и соответствующие поля.
Чтобы все работало быстро, FileDB и PairDB должны быть резидентными в оперативной памяти. Раньше мы использовали Tarantool 1.5, теперь нужно использовать последнюю версию. FileDB имеет пять полей (длиной 20, 4, 4, 4 и 4 байта), что в сумме дает 36 байтов.Кроме того, каждая запись имеет 16-байтовый заголовок и 1-байтовый указатель длины для каждого поля, в результате чего общий размер записи составляет 57 байт.
Tarantool позволяет указать минимальный размер выделяемой памяти, поэтому накладные расходы, связанные с памятью, могут быть близки к нулю. Мы будем выделять точное количество памяти, необходимое для одной записи. У нас 12 миллиардов файлов.
(57 * 12 * 10^9) / (1024^3) = 637 ГБ
Но это еще не все, нам также понадобится индекс для поля sha1, который добавляет еще 12 байт к общему размеру записи.
(12 * 12 * 10^9) / (1024^3) = 179 ГБ
Всего требуется 800 ГБ оперативной памяти. И давайте не будем забывать о репликации, которая удваивает требуемый объем оперативной памяти.
Если мы купим машины с 256 ГБ ОЗУ, нам понадобится восемь таких машин.
Мы можем оценить размер PairDB. Средний размер файла составляет 1 МБ, а емкость диска — 1 ТБ, что позволяет хранить около 1 миллиона файлов на одном диске; Итак, нам потребуется около 28 000 дисков. Одна запись PairDB описывает два диска. Таким образом, PairDB содержит 14 000 записей — ничтожно мало по сравнению с FileDB.
Загрузка файла
Теперь, когда мы разобрались со структурой базы данных, давайте обратимся к API для взаимодействия с системой. На первый взгляд, нам нужны методы загрузки и удаления. Но не забывайте о дедупликации: велика вероятность, что файл, который мы пытаемся загрузить, уже находится в хранилище, и загружать его второй раз не имеет смысла. Итак, необходимы следующие методы:
Давайте подробнее рассмотрим, что происходит во время загрузки. Для демона, реализующего этот интерфейс, мы выбрали протокол IProto. Демоны должны хорошо масштабироваться для любого количества машин, поэтому они не сохраняют состояния. Предположим, мы получаем запрос через сокет:
Имя команды сообщает нам длину заголовка, поэтому мы сначала читаем заголовок. Теперь нам нужно узнать длину файла origin-len. Для его загрузки необходимо выбрать пару серверов. Мы просто извлекаем все записи (несколько тысяч) из PairDB и используем стандартный алгоритм для поиска нужной пары: Берем отрезок длиной, равной сумме свободных мест на всех парах, случайным образом выбираем точку на этом отрезке, и выберите любую пару, к которой принадлежит эта точка.
Однако такой выбор пары сопряжен с риском. Предположим, что все наши диски заполнены на 90% — и тогда мы добавляем новый пустой диск. С большой долей вероятности все новые файлы будут загружаться на этот диск. Чтобы избежать этой проблемы, мы должны суммировать не свободное пространство пары дисков, а n-й корень этого свободного места.
Итак, мы выбрали пару, но наш демон потоковый, и если мы начинаем загружать файл в хранилище, пути назад нет. При этом перед загрузкой реального файла мы сначала загрузим небольшой тестовый файл. Если тестовая загрузка прошла успешно, мы прочитаем содержимое файла из сокета и загрузим его в хранилище; в противном случае выбирается другая пара. Хэш SHA-1 можно считывать на лету, поэтому он также проверяется при загрузке.
Теперь рассмотрим загрузку файла из загрузчика на выбранную пару дисков. На машинах с дисками настраиваем nginx и используем протокол WebDAV. Приходит электронное письмо. В FileDB пока нет этого файла, поэтому его необходимо загрузить на пару дисков через загрузчик.
Но ничто не мешает другому пользователю получить то же электронное письмо — допустим, указаны два получателя. Помните, что FileDB еще не имеет этого файла, поэтому еще один загрузчик будет загружать этот самый файл и может выбрать ту же пару дисков для загрузки.
Nginx, скорее всего, разрешит эту ситуацию правильно, но нам нужно контролировать весь процесс, поэтому мы сохраним файл со сложным именем.
Красная часть имени — это место, где каждый загрузчик помещает случайное число. Таким образом, два метода PUT не будут перекрываться и загружать два разных файла. Как только nginx отвечает 201 (ОК), первый загрузчик выполняет атомарную операцию MOVE, которая указывает окончательное имя файла.
Когда второй загрузчик завершит загрузку файла и также выполнит MOVE , файл будет перезаписан, но в этом нет ничего страшного, поскольку это один и тот же файл. Как только файл окажется на дисках, необходимо добавить новую запись в FileDB. Наша версия Tarantool разделена на два пространства. До сих пор мы использовали только пробел 0.
Однако вместо простого добавления новой записи в FileDB мы используем хранимую процедуру, которая либо увеличивает счетчик файлов, либо добавляет новую запись в FileDB. Почему? За то время, которое прошло с тех пор, как загрузчик убедился, что файл не существует в FileDB, загрузил его и приступил к добавлению новой записи в FileDB, кто-то другой мог загрузить этот файл и добавить соответствующую запись. Мы рассмотрели именно такой случай: на одно письмо указываются два получателя, поэтому загружать файл начинают два загрузчика; как только второй загрузчик завершает загрузку, он также добавляет новую запись в FileDB.
В этом случае второй загрузчик просто увеличивает счетчик файлов.
Теперь рассмотрим метод dec.У нашей системы есть две первоочередные задачи: надежно записать файл на диск и быстро отдать его клиенту с этого диска. Физическое удаление файла создает определенную нагрузку и замедляет выполнение этих двух задач. Вот почему мы выполняем удаление в автономном режиме. Сам метод dec уменьшает значение счетчика. Если последнее становится равным 0, как и магическое число, то это означает, что файл больше никому не нужен, поэтому мы перемещаем соответствующую запись из пробела 0 в пробел 1 в Tarantool.
Валькирия
В каждом хранилище есть демон Valkyrie, который отслеживает целостность и согласованность данных и работает с пространством1. На каждый диск приходится один экземпляр демона. Демон перебирает все файлы на диске и проверяет, содержит ли space1 запись, соответствующую определенному файлу, что означает, что этот файл следует удалить.
Но после вызова метода dec и перемещения файла в space1 Valkyrie может потребоваться некоторое время, чтобы найти этот файл. Это означает, что в промежутке между этими двумя событиями файл может быть перезалит и, таким образом, снова перемещен в space0.
Вот почему Valkyrie также проверяет, существует ли файл в space0 . Если дело обстоит именно так и пара_ид соответствующей записи указывает на пару дисков, на которых работает этот экземпляр Valkyrie, то запись удаляется из пространства1.
Если в space0 не найдено ни одной записи, то файл является потенциальным кандидатом на удаление. Однако между запросом к space0 и физическим удалением файла все еще есть временное окно, в котором новая запись, соответствующая этому файлу, может появиться в space0. Чтобы справиться с этим, мы помещаем файл в карантин.
Вместо удаления файла мы добавляем к его имени удаленный и временную метку. Это означает, что мы физически удалим файл с отметкой времени плюс некоторое время, указанное в файле конфигурации. Если произойдет сбой и файл будет удален по ошибке, пользователь придет, чтобы вернуть его. Мы сможем восстановить его и решить проблему без потери данных.
Теперь вспомним, что есть два диска, на каждом из которых работает экземпляр Valkyrie. Два экземпляра не синхронизированы. Отсюда вопрос: Когда запись должна быть удалена из space1?
Мы сделаем две вещи. Во-первых, для рассматриваемого файла давайте сделаем один из экземпляров Valkyrie мастером. Это легко сделать, используя первый бит имени файла: если он равен нулю, то disk0 является мастером; в противном случае disk1 является ведущим.
Давайте введем задержку обработки. Вспомните, что когда запись находится в space0, она содержит волшебное поле для проверки непротиворечивости. При перемещении записи в space1 это поле не используется, поэтому мы поместим туда временную метку, соответствующую времени появления этой записи в space1. Таким образом, главный экземпляр Valkyrie сразу начнет обработку записей в пространстве 1, тогда как подчиненный добавит некоторую задержку к метке времени и немного позже обработает и удалит записи из пространства 1.
У этого подхода есть еще одно преимущество. Если файл был ошибочно помещен в карантин на мастере, это будет видно из журнала, как только мы запросим мастер. Тем временем клиент, запросивший файл, вернется к ведомому — и пользователь получит нужный файл.
Итак, мы рассмотрели ситуацию, в которой демон Valkyrie находит файл с именем sha1, и этот файл (являющийся потенциальным кандидатом на удаление) имеет соответствующую запись в space1. Какие еще варианты возможны?
Предположим, файл находится на диске, но в FileDB нет соответствующей записи. Если в рассмотренном выше случае мастер-инстанс Valkyrie по каким-то причинам какое-то время не работал, значит, у слейва было достаточно времени, чтобы поместить файл в карантин и удалить соответствующую запись из space1 . В этом случае мы также помещаем файл в карантин, используя sha1.deleted.timestamp .
Другая ситуация: запись существует, но указывает на другую пару дисков. Это могло произойти во время загрузки, если для одного письма указаны два получателя. Вспомните эту схему:
Что произойдет, если второй загрузчик загрузит файл в другую пару, чем первый? Он увеличит счетчик в space0 , но пара дисков, на которую был загружен файл, будет содержать несколько ненужных файлов. Что нам нужно сделать, так это убедиться, что эти файлы можно прочитать и что они соответствуют sha1. Если все в порядке, такие файлы можно сразу удалить.
Кроме того, Valkyrie может обнаружить файл, помещенный в карантин. Если карантин закончится, этот файл будет удален.
Осталась последняя ситуация, связанная с проблемами с диском. Если в ходе системного мониторинга выявляется какая-либо проблема с диском, проблемный диск переводится в сервисный (только для чтения) режим, а на втором диске выполняется операция UNMOVE. Это эффективно распределяет все файлы на втором диске между другими парами дисков.
Результат
Вернемся к тому, с чего начали.Раньше наше хранилище электронной почты выглядело так:
После внедрения новой системы нам удалось уменьшить общий размер на 18 ПБ:
О SHA-1
На данный момент нет известных примеров коллизий SHA-1. Однако существуют примеры коллизий для его внутренней функции сжатия (коллизия свободного запуска SHA-1). Учитывая 12 миллиардов файлов, вероятность конфликта хэшей меньше 10^-38.
Но давайте предположим, что это возможно. В этом случае, когда файл запрашивается по его хеш-значению, мы проверяем, имеет ли он правильный размер и контрольную сумму CRC32, которые были сохранены в индексах соответствующего письма при загрузке. То есть запрошенный файл будет предоставлен только в том случае, если он был загружен вместе с этим письмом.
Читайте также: