Как загрузить файл в облако mail ru и отправить ссылку на него

Обновлено: 02.07.2024

Основные особенности

  • Пути могут быть настолько глубокими, насколько это необходимо, например. удаленный:каталог/подкаталог
  • У файлов есть свойство времени последнего изменения, а у каталогов нет
  • Удаленные файлы по умолчанию перемещаются в корзину
  • Файлами и каталогами можно делиться через общедоступные ссылки.
  • Частичная загрузка или потоковая передача не поддерживаются, размер файла должен быть известен перед загрузкой.
  • Максимальный размер файла ограничен 2 ГБ для бесплатной учетной записи и неограничен для платной учетной записи.
  • Хранилище хранит хэш для всех файлов и выполняет прозрачную дедупликацию. Алгоритм хеширования представляет собой модифицированный алгоритм SHA1.
  • Если определенный файл уже присутствует в хранилище, можно быстро отправить хэш файла вместо загрузки длинного файла (эта оптимизация поддерживается rclone)

Конфигурация

Это проведет вас через интерактивный процесс настройки:

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

Просмотр каталогов верхнего уровня

Создать новый каталог

Список содержимого каталога

Синхронизируйте /home/local/directory с удаленным путем, удалив все лишние файлы на этом пути.

Время изменения

Файлы поддерживают атрибут времени модификации с точностью до 1 секунды. У каталогов нет времени изменения, которое отображается как «1 января 1970 года».

Контрольные суммы хешей

Очистка корзины

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

Информация о квоте

Чтобы просмотреть текущую квоту, вы можете использовать команду rclone about remote:, которая отобразит ваш лимит использования (квоту) и текущее использование.

Ограниченные символы в имени файла

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

< /tr> < /tbody>
Символ Значение Замена
" 0x22
* 0x2A
: 0x3A
0x3C
> 0x3E
? 0x3F
\ 0x5C
| 0x7C

Недопустимые байты UTF-8 также будут заменены, так как их нельзя использовать в строках JSON.

Стандартные варианты

--mailru-пользователь

Имя пользователя (обычно адрес электронной почты).

  • Конфигурация: пользователь
  • Вариант окружения: RCLONE_MAILRU_USER
  • Тип: строка
  • Требуется: true

--mailru-pass

Примечание. Входные данные для этого должны быть скрыты — см. rclone obscure.

  • Конфигурация: пройти
  • Вариант окружения: RCLONE_MAILRU_PASS
  • Тип: строка
  • Требуется: true

--mailru-speedup-enable

Пропустить полную загрузку, если есть другой файл с таким же хешем данных.

Эта функция называется "ускорение" или "путем хеша". Это особенно эффективно в случае общедоступных файлов, таких как популярные книги, видео- или аудиоролики, т.к. файлы ищутся по хешу во всех аккаунтах всех пользователей mailru. Это бессмысленно и неэффективно, если исходный файл уникален или зашифрован. Обратите внимание, что rclone может потребоваться локальная память и место на диске, чтобы заранее вычислить хеш контента и решить, требуется ли полная загрузка. Кроме того, если rclone заранее не знает размер файла (например, в случае потоковой передачи или частичной загрузки), он даже не будет пытаться использовать эту оптимизацию.

  • Конфигурация: speedup_enable
  • Вариант окружения: RCLONE_MAILRU_SPEEDUP_ENABLE
  • Тип: bool
  • По умолчанию: правда
  • Примеры:
    • "правда"
      • Включить
      • Отключить

      Дополнительные параметры

      --mailru-speedup-file-patterns

      Список шаблонов имен файлов, разделенных запятыми, которые можно ускорить (обозначается хэшем).

      Шаблоны нечувствительны к регистру и могут содержать '*' или '?' метасимволы.

      • Конфигурация: speedup_file_patterns
      • Вариант окружения: RCLONE_MAILRU_SPEEDUP_FILE_PATTERNS
      • Тип: строка
      • По умолчанию: ".mkv,.avi,.mp4,.mp3,.zip,.gz,.rar. ,.pdf"
      • Примеры:
        • ""
          • Пустой список полностью отключает ускорение (ставится хэшем).
          • Все файлы будут пытаться ускориться.
          • Только обычные аудио- и видеофайлы будут проверяться на размещение по хэшу.
          • Только обычные архивы или книги в формате PDF будут тестироваться на ускорение.

          --mailru-speedup-max-disk

          Эта опция позволяет отключить ускорение (по хэшу) для больших файлов.

          Причина в том, что предварительное хеширование может привести к истощению оперативной памяти или места на диске.

          • Конфигурация: speedup_max_disk
          • Вариант окружения: RCLONE_MAILRU_SPEEDUP_MAX_DISK
          • Тип: SizeSuffix
          • По умолчанию: 3Gi.
          • Примеры:
            • "0"
              • Полностью отключить ускорение (ставить по хешу).
              • Файлы размером более 1 ГБ будут загружены напрямую.
              • Выберите этот вариант, если на локальном диске свободно менее 3 ГБ.

              --mailru-speedup-max-memory

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

              • Конфигурация: speedup_max_memory
              • Вариант окружения: RCLONE_MAILRU_SPEEDUP_MAX_MEMORY
              • Тип: SizeSuffix
              • По умолчанию: 32 Ми.
              • Примеры:
                • "0"
                  • Предварительное хеширование всегда будет выполняться во временном месте на диске.
                  • Не выделяйте более 32 МБ ОЗУ для предварительного хеширования.
                  • У вас есть не более 256 МБ свободной ОЗУ для хеш-вычислений.

                  --mailru-check-hash

                  Что делать при копировании, если контрольная сумма файла не соответствует или недействительна.

                  • Конфигурация: check_hash
                  • Переменная окружения: RCLONE_MAILRU_CHECK_HASH
                  • Тип: bool
                  • По умолчанию: правда
                  • Примеры:
                    • "правда"
                      • Сбой с ошибкой.
                      • Игнорировать и продолжить.

                      --mailru-user-agent

                      По умолчанию используется "rclone/VERSION" или "--user-agent", указанные в командной строке.

                      • Конфигурация: user_agent
                      • Вариант окружения: RCLONE_MAILRU_USER_AGENT
                      • Тип: строка
                      • Обязательно: false

                      --mailru-quirks

                      Список внутренних флагов обслуживания, разделенных запятыми.

                      Эта опция не должна использоваться обычным пользователем. Он предназначен только для облегчения удаленного устранения неполадок серверной части. Строгое значение флагов не задокументировано, и его сохранение между выпусками не гарантируется. Причуды будут удалены, когда бэкенд станет стабильным. Поддерживаемые особенности: atomicmkdir binlist unknowndirs

                      • Конфигурация: особенности
                      • Вариант окружения: RCLONE_MAILRU_QUIRKS
                      • Тип: строка
                      • Обязательно: false

                      --mailru-кодировка

                      Кодировка для серверной части.

                      • Конфигурация: кодировка
                      • Вариант окружения: RCLONE_MAILRU_ENCODING
                      • Тип: MultiEncoder
                      • По умолчанию: косая черта, LtGt, двойная кавычка, двоеточие, вопрос, звездочка, вертикальная черта, обратная косая черта, Del, Ctl, InvalidUtf8, точка.

                      Ограничения

                      Обратите внимание, что Mailru нечувствителен к регистру, поэтому у вас не может быть файла с именем "Hello.doc" и файла с именем "hello.doc".



                      Сведения о приложении

                      Мое хранилище фотографий БЕСПЛАТНО, но есть и другие дополнения

                      Скриншоты приложения

                      Мое хранилище фотографий, диск: Cloud screenshot-0

                      Мое хранилище фотографий, диск: Cloud screenshot-4

                      Мое хранилище фотографий, диск: Cloud screenshot-5

                      Описание магазина приложений

                      * Загружайте фотографии со своего мобильного телефона. Настройте автоматическое «сохранение на диск» в вашей галерее. В целях экономии трафика рекомендуется выполнять загрузку при подключении к сети Wi-Fi.

                      * Свободное место на вашем устройстве, поскольку все ваши фотографии уже находятся в Облаке.

                      * Делитесь файлами и папками с друзьями и коллегами одним щелчком мыши.

                      * Экономьте пропускную способность. Вы можете отправить ссылку на изображение, видео или документ по SMS, электронной почте, в мессенджере или через социальную сеть.

                      * Просмотр документов MS Office: Word, Excel, PowerPoint и PDF, а также файлов других форматов.

                      * Управляйте своими файлами откуда угодно; переименовывать, удалять и перемещать их между папками.

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

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

                      * Вы можете увеличить объем облачного хранилища. Список подписок находится в боковой панели приложения.

                      Все подписки продлеваются автоматически. Каждая активная подписка будет автоматически продлена, если она не будет отменена как минимум за 24 часа до окончания ее текущего периода. Плата за подписку будет списана с вашей кредитной карты через вашу учетную запись iTunes. Цена может варьироваться в зависимости от местоположения. Вы не сможете отменить подписку в течение активного периода подписки. Управляйте своими подписками в настройках аккаунта после покупки.

                      Отказ от ответственности:
                      AppAdvice не владеет этим приложением и предоставляет только изображения и ссылки, содержащиеся в API поиска iTunes, чтобы помочь нашим пользователям найти лучшие приложения для загрузки. Если вы являетесь разработчиком этого приложения и хотите, чтобы ваша информация была удалена, отправьте запрос на [email protected], и ваша информация будет удалена.

                      < бр />

                      Air Explorer позволяет загружать и скачивать файлы, хранящиеся в наиболее важных облачных хранилищах, таких как Google Drive, OneDrive, Naver, Box, Dropbox и Mega, а также управлять ими. Простой интерфейс приложения позволяет регистрировать свои аккаунты во всех облаках и загружать файлы, передавать из одного облака в другое, загружать папки и даже обмениваться файлами и воспроизводить онлайн-видео. Mega — одно из поддерживаемых облаков, в котором мы можем выполнять ряд действий.

                      Mega – это очень безопасный облачный сервис, который является одним из лучших вариантов для тех, кто ищет много свободного места для хранения. Бесплатная учетная запись даст вам колоссальные 20 ГБ облачного хранилища, а также есть платный план для его расширения. Если вы добавите свою учетную запись Mega в Air Explorer, вы сможете воспользоваться всеми преимуществами этого облачного сервиса.

                      Air Explorer показывает эскизы файлов, которые вы загрузили в Mega, чтобы вы могли быстро просмотреть их. Кроме того, в Air Explorer повышена скорость загрузки в Mega, поэтому сохранение всех ваших файлов в облаке занимает меньше времени.


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



                      < /p>

                      Чтобы оптимизировать использование места на вашем компьютере, с Air Explorer вам не нужно загружать видео, сохраненные в Mega, для их воспроизведения, вы можете воспроизводить видео онлайн в Mega с помощью VLC на своем компьютере.



                      < /p>

                      С помощью инструмента поиска Air Explorer вы можете найти любой файл, который вы сохранили в хранилище Mega. Вы можете использовать фильтры, предлагаемые инструментом, чтобы сузить область поиска и упростить поиск нужного файла.


                      Инструмент синхронизации позволяет обновлять файлы в облаке. Таким образом, вы можете делать резервные копии на Mega и хранить свои файлы в безопасности. Вы можете выполнять синхронизацию между своим компьютером и Mega или между другими облаками и Mega. Синхронизацию можно запланировать и выполнять регулярно с помощью планировщика задач, включенного в Air Explorer.

                      < бр />

                      Когда вы загружаете файлы в Mega, платформа шифрует все, что вы загружаете на свои серверы. Но с помощью Air Explorer вы можете зашифровать его во второй раз при загрузке файлов, тем самым обеспечив двойную безопасность.

                      Huawei

                      Работайте с облаками так же, как и с папками, в удобном интерфейсе и быстрее, чем в браузере. Возможности приложения постоянно расширяются. Следите за обновлениями!

                      Диск-О: позволяет подключить все самые популярные платформы облачных хранилищ и работать с ними в едином интерфейсе. Забудьте об отдельных приложениях.

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

                      Диск-О: позволяет получить прямую ссылку на файл в облаке. Документ будет доступен только тем людям, которым вы отправите сгенерированную ссылку.

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

                      Используя Диск-О: вы можете загружать столько файлов, сколько позволяет объем облака, не занимая места в памяти вашего компьютера.

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


                      Huawei

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

                      Диск-О: поддерживает работу со всеми типами файлов, для которых на вашем устройстве установлено программное обеспечение. Вы можете создавать, открывать и редактировать файлы на своем компьютере, а благодаря функции синхронизации все ваши изменения будут сохранены в ваших облаках. Единственным исключением являются файлы, имена которых содержат специальные символы. Их невозможно будет открыть в Диск-О:. Помните об этом, когда будете придумывать имена для своих файлов.

                      Эндрю Сумин

                      На индексы и тела приходится только 15 % объема хранилища, тогда как 85 % занимают файлы. Итак, оптимизацию файлов (то есть вложений) стоит изучить подробнее. В то время у нас не было дедупликации файлов, но мы подсчитали, что это может уменьшить общий размер хранилища на 36%, потому что многие пользователи получают одни и те же сообщения, такие как прайс-листы из интернет-магазинов и информационные бюллетени из социальных сетей, которые содержать изображения и так далее. В этой статье я опишу, как мы внедрили систему дедупликации под руководством PSIAlt.

                      Дополнительная литература на SmashingMag:

                      Хранение метаданных

                      Мы имеем дело с потоком файлов. Когда мы получаем сообщение, мы должны доставить его пользователю как можно скорее. Нам нужно уметь быстро распознавать дубликаты. Простым решением было бы назвать файлы на основе их содержимого. Мы используем SHA-1 для этой цели. Исходное имя файла хранится в самом письме, поэтому нам не нужно об этом беспокоиться.

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

                      Теперь давайте загрузим файл в наше хранилище и выясним, существует ли там уже другой файл с таким же хешем. Это означает, что нам нужно хранить все хэши в памяти. Назовем это хранилище хэшей FileDB.

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

                      Счетчик увеличивается с каждым новым загружаемым файлом. Около 40% всех файлов удаляются, поэтому, если пользователь удаляет электронное письмо, содержащее файлы, загруженные в облако, счетчик должен быть уменьшен. Если счетчик достигает нуля, файл можно удалить.

                      Здесь мы сталкиваемся с первой проблемой: информация об электронном письме (индексы) хранится в одной системе, а информация о файле — в другой. Это может привести к ошибке. Например, рассмотрим следующий рабочий процесс:

                      1. Система получает запрос на удаление сообщения электронной почты.
                      2. Система проверяет индексы электронной почты.
                      3. Система видит наличие вложения (SHA-1).
                      4. Система отправляет запрос на удаление файла.
                      5. Происходит сбой, поэтому письмо не удаляется.

                      В этом случае письмо остается в системе, но счетчик уменьшается на 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, которые были сохранены в индексах соответствующего письма при загрузке.То есть запрошенный файл будет предоставлен только в том случае, если он был загружен вместе с этим письмом.

                      Читайте также: