Сайт компьютерных навыков

Сохраняем данные. Автоматическая синхронизация с облачным сервисом Яндекс.Диск при помощи Link Shell Extension. Синхронизация данных Идет синхронизация 100 яндекс диск

  • Разработка веб-сайтов ,
  • Алгоритмы
  • Яндекс.Диск - один из немногих сервисов Яндекса, частью которого является программное обеспечение для десктопа. И одна из самых важных его составляющих - алгоритм синхронизации локальных файлов с их копией в облаке. Недавно нам пришлось его полностью поменять. Если старая версия с трудом переваривала даже несколько десятков тысяч файлов и к тому же не достаточно быстро реагировала на некоторые «сложные» действия пользователя, то новая, используя те же ресурсы, справляется с сотнями тысяч файлов.

    В этом посте я расскажу, почему так получилось: чего мы не смогли предвидеть, когда придумывали первую версию ПО Яндекс.Диска, и как создавали новую.

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

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

    Теоретически задача может показаться достаточно простой, но в реальности мы сталкиваемся с разными сложными ситуациями. Например, человек переименовал папку на своем компьютере, мы это детектировали и послали команду на бекенд. Однако никто из пользователей не ждет, пока бекенд подтвердит успешность переименования. Человек сразу открывает свою локально переименованную папку, создает в ней подпапку, и, к примеру, переносит в нее часть файлов. Мы попали в ситуацию, в которой невозможно сразу выполнить все необходимые операции синхронизации в облаке. Сначала надо дождаться завершения первой операции и только потом можно продолжать.

    Ситуация может стать еще сложнее, если с одним аккаунтом одновременно работают несколько пользователей или у них есть общая папка. А это случается достаточно часто в организациях, использующих Яндекс.Диск. Представьте себе, что в предыдущем примере в тот момент, когда мы получили от бекенда подтверждение первого переименования, другой пользователь берет и переименовывает эту папку еще раз. В этом случае опять нельзя сразу выполнить действия, которые уже совершил первый пользователь у себя на компьютере. Папка, в которой он работал локально, на бекенде в это время уже называется по-другому.

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

    Прошлая версия алгоритма

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

    В этой версии алгоритма мы использовали три основных дерева: локальное (Local Index), облачное (Remote Index) и последнее синхронизированное (Stable Index). Кроме этого, чтобы предотвратить повторную генерацию уже поставленных в очередь операций синхронизации, использовались ещё два вспомогательных дерева: локальное ожидаемое и облачное ожидаемое (Expected Remote Index и Expected Local Index). В этих вспомогательных деревьях хранилось ожидаемое состояние локальной файловой системы и облака, после выполнения всех операций синхронизации, которые уже поставлены в очередь.


    Процедура сравнения деревьев в старом алгоритме выглядела следующим образом:
    1. Если локальное ожидаемое дерево и облачное ожидаемое дерево пусты, инициализируем их, копируя последнее синхронизированное дерево;
    2. Сравниваем локальное дерево с облачным ожидаемым и по результатам сравнения отдельных узлов добавляем в очередь операции синхронизации в облаке (создание коллекций, передача файлов в облако, перемещение и удаление в облаке);
    3. Для всех операций, которые поставлены в очередь на предыдущем шаге, фиксируем их будущий эффект в ожидаемом облачном дереве;
    4. Сравниваем облачное дерево с локальным ожидаемым и по результатам сравнения отдельных узлов добавляем в очередь операции синхронизации с локальной файловой системой (создание директорий, скачивание файлов из облака, перемещение и удаление локальных файлов и директорий);
    5. Для всех операций, которые поставлены в очередь на предыдущем шаге, фиксируем их будущий эффект в ожидаемом локальном дереве;
    6. Если в очередь попадают одновременные операции с одним и тем же файлом или директорией (например, передача файла в облако и скачивание этого же файла из облака), то фиксируем конфликт - файл изменился в двух местах;
    7. После того, как операция синхронизации выполнена в облаке или с локальной файловой системой, заносим её результат в последнее синхронизированное дерево;
    8. Когда очередь операций синхронизации становится пустой, удаляем локальное ожидаемое и облачное ожидаемое дерево. Синхронизация закончена, и они нам больше не понадобятся.

    Почему нам пришлось придумывать новый алгоритм

    Главными проблемами алгоритма сравнения деревьев стали большое потребление памяти и необходимость сравнения деревьев целиком даже при небольших изменениях, что приводило к большой нагрузке на процессор. Во время обработки изменений даже одного файла использование оперативной памяти возрастало примерно на 35%. Допустим, у пользователя было 20 000 файлов. Тогда при простом переименовании одного файла размером 10Кб потребление памяти вырастало скачкообразно - со 116Мб до 167МБ.

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

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

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

    Новый алгоритм

    Мы решили изменить структуру хранения данных и заменить три дерева (Local Index, Remote Index, Stable Index) на одно, что должно было привести к снижению избыточности в главной структуре данных. Из-за того что ключом в дереве является путь к элементу файловой системы, в результате объединения значительно сократился объем используемой оперативной памяти.


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

    Так как мы понимали, что это серьезное изменение, то создали прототип, подтвердивший эффективность нового решения. Рассмотрим на примере, как меняются данные в дереве во время синхронизации нового файла.

    1. После того как пользователь добавил в папку Диска новый файл, программа обнаружила его и добавила в дерево новый элемент. У этого элемента известно только одно состояние – local. Так как stable и remote состояния отсутствуют, память под них не выделяется;
    2. Программа выполняет upload файла. Из облака приходит push, подтверждающий появление нового файла, и в дерево добавляется remote состояние;
    3. Состояния local и remote сравниваются. Так как они совпадают, добавляется stable состояние;
    4. Состояния local и remote удаляются. Они больше не нужны, так как вся информация есть в stable.


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

    Другие улучшения

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

    Яндекс.Диск использует дайджесты sha256 и MD5 для проверки целостности файлов, обнаружения изменившихся фрагментов и дедупликации файлов на бекенде. Так как эта задача сильно нагружает CPU, в новой версии реализация расчетов дайджеста была существенно оптимизирована. Скорость получения дайджеста файла увеличена примерно в два раза.

    Цифры

    Синхронизация уникальных 20000 файлов по 10Кб

    Вычисление дайджестов уникальных 20000 файлов по 10кб (индексация)

    Запуск с 20000 синхронизированных файлов по 10Кб

    Upload 1Gb. Соединение Wi-Fi 10 МБит
    Время, сек

    Что получилось

    Из примеров видно, что новая версия ПО Яндекс.Диска использует примерно в 3 раза меньше оперативной памяти и примерно в 2 раза меньше нагружает CPU. Обработка мелких изменений не приводит к увеличению объема используемой памяти.

    В результате проделанных изменений существенно увеличилось количество файлов, с которым без проблем справляется программа. В версии для Windows – 300 000, а на Mac OS X - 900 000 файлов.

    В конце прошлого месяца по Интернету прошла волна слухов о скором открытии нового облачного сервиса для синхронизации данных от Google. Но пока все с интересом ждали появления Google Drive, 5 апреля подобный сервис без лишней рекламы представил «Яндекс». За день до запуска нового сервиса в официальном «Твиттере» компании был опубликован его логотип, и пользователям предлагалось отгадать, что за ним скрывается.

    Оказалось, что летающая тарелка — это эмблема нового сервиса «Яндекс.Диск». Подобно популярным Dropbox и SugarSync, он дает возможность хранить файлы в «облаке» и получать к ним доступ с любого компьютера, подключенного к Интернету, а также с мобильных устройств.

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

    Когда в Сети появляется очередной сервис для синхронизации, сразу же возникает вполне резонный вопрос: чем он лучше? У «Яндекса» есть несколько очевидных преимуществ перед конкурентами:

    • Бесплатный статус. Возможно, в будущем какие-то платные пакеты и появятся, но пока что об этом не говорят. При этом в онлайновом хранилище можно размещать до 10 Гбайт данных. Это в пять раз больше, чем Dropbox дает новым пользователям (правда, за привлеченных пользователей на Dropbox можно получить еще 16 Гбай т, но для этого придется поработать). У Microsoft на SkyDrive — 25 Гбайт, но удобного клиента для работы с файлами на компьютере все еще нет.
    • Неограниченная тарифом скорость для тех провайдеров, в локальной сети которых находится «Яндекс». Полный список провайдеров, подключенных к программе «Локальная сеть Яндекса», .
    • Поддержка протокола WebDav, благодаря чему «Яндекс.Диск» может работать и без «родного» клиента. У сервиса пока что нет клиента для Linux, но поддержка WebDav позволяет работать с ним и в этой среде.
    • Русский интерфейс. Людей, для которых это имеет значение, по-прежнему много.

    Подобно Google, «Яндекс» идет по пути интеграции своих сервисов. «Яндекс.Диск» интегрирован с почтой: для доступа к веб-интерфейсу нужно открыть страницу mail.yandex.ru/neo2/#disk/. Исходный размер хранилища — 3 Гбайт, но его легко увеличить до 10 Гбайт за три простых шага: скачать и установить клиент для Windows или Mac OS X, загрузить несколько файлов на сервис с помощью этой программы и рассказать о новом сервисе друзьям в социальных сетях или же отправив им сообщение по электронной почте. Нужно иметь в виду, что такое сообщение не является приглашением — это просто уведомление о появлении нового сервиса.

    В процессе установки и настройки приложения «Яндекс.Диск» нужно указать учетную запись электронной почты на «Яндексе» и определиться с тем, будет ли включена постоянная авторизация на текущем компьютере. Вместе с новым приложением, кстати, традиционно предлагается установить «Яндекс.Бар» и прочие сервисы от «Яндекса» , так что стоит быть бдительным.

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

    Если установка приложения прошла успешно, значок «Яндекс.Диска» появится в трее, а в «Проводнике» можно будет увидеть одноименную папку. Работает она примерно по тому же принципу, что и Dropbox: вы копируете файл в папку « Яндекс.Диска » — он тут же загружается на сервер и становится доступным через веб-интерфейс.

    Если приложение установлено на нескольких компьютерах, все изменения синхронизируются. О том, что файлы успешно синхронизированы, можно догадаться по зеленым пометкам на их названиях в файловом менеджере, а также по наличию такой же пометки на иконке приложения в трее (смотрите, как похоже на Dropbox, — его иконка справа).

    По умолчанию папка располагается по адресу C:\Пользователи\Имя_пользователя\YandexDisk, но ее расположение изменяется в настройках программы. Там же можно отключить запуск приложения при загрузке системы, посмотреть, сколько осталось свободного места, и задать ручные настройки прокси-сервера.

    Механизм обмена файлами реализован максимально просто. «Яндекс.Диск» добавляет в контекстное меню команду, при выборе которой генерируется ссылка для скачивания файла с сервера. Ссылка сразу же укорачивается и копируется в буфер обмена. Такой механизм расшаривания файлов работает и для тех данных, которые еще не скопированы в «Яндекс.Диск», — можно выбрать любой файл на компьютере, при этом он будет скопирован в папку «Диска» автоматически.

    В отличие от Dropbox, в « Яндекс.Диске » при вставке ссылки на файл в адресную строку браузера загрузка не происходит автоматически. Вместо этого пользователь попадает на страницу с названием файла и кнопкой «Скачать». «Яндексу» — дополнительная реклама, а пользователям — одно ненужное действие.

    Все файлы, к которым был открыт доступ, можно просмотреть в разделе «Опубликованные» в веб-интерфейсе сервиса. Если выбрать файл, можно снова получить ссылку на него (на этот раз — уже не короткую), а также снова сделать его личным. При этом он сразу же пропадет из «Опубликованных».

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

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

    Просмотр пока что работает только для графических файлов. Попытки просмотреть в браузере документы PDF, RTF, MS Office, а также текстовые и HTML-файлы успехом не увенчались — сервис предлагает их только скачать. То же самое с музыкой — загруженные на сервис MP3 слушать с сервера нельзя.

    Отдельного внимания заслуживает папка «Почтовые вложения», в которой хранятся все отправленные и полученные аттачменты. Размер этой папки в общую квоту «Диска» не входит. В этом разделе можно быстро находить вложения по типам (графика, документы, музыка, видео, архивы), а также по дате получения или отправки либо по имени отправителя. Файл вложения можно загрузить, не переходя к письму. Просится еще кнопочка для копирования вложения в основное хранилище «Диска», но ее пока что нет.

    Одно из главных преимуществ «Яндекс.Диска» перед Dropbox — поддержка протокола WebDAV. Благодаря этому можно управлять файлами в сетевом хранилище через любую программу, которая поддерживает этот протокол. Такие программы существуют и для Windows, и для Mac OS X, и для Linux — даже для FreeBSD. При использовании «Яндекс.Диска» через WebDAV можно создать виртуальный диск, который будет отображаться в списке устройств системы. К тому же, в этом случае можно не беспокоиться о попадании в систему «лишних» приложений вроде «Яндекс.Бара». С другой стороны, при работе с WebDAV, например, не работает быстрое открытие доступа к файлу при помощи команды контекстного меню.

    Для настройки доступа к «Яндекс.Диску» через WebDAV в Windows нужно выбрать команду «Подключить сетевой диск» в контекстном меню элемента «Компьютер» в «Проводнике», затем выбрать букву виртуального диска, указать адрес сервера «Яндекса» — https://webdav.yandex.ru — и ввести данные учетной записи почты.

    После этого виртуальный диск появится в списке устройств. Инструкции по подключению «Диска» через WebDav для других систем можно найти в справочном центре «Яндекса .

    Теперь еще пара слов о мобильных приложениях, ведь именно их наличие для многих является главным фактором для выбора сервиса синхронизации. «Яндекс» предлагает приложения для устройcтв с Android и iOS, но не пытайтесь найти «Яндекс.Диск» в Google Play и App Store. «Диск» доступен не в виде отдельного приложения, а как часть обновленной «Яндекс.Почты» . Конечно, не всем это понравится, но для тех, кто уже использует почту от «Яндекса» , удобство налицо — дополнительное приложение устанавливать не нужно.

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

    Файлы можно скачивать на устройство, есть и возможность загрузки фотографий и любых других данных с мобильного на «Яндекс.Диск». Для обмена файлами между компьютером и мобильным устройством «Яндекс.Диск» и подобные сервисы — просто находка. Трудно придумать более удобный способ копирования файлов, чем загрузить их на «Диск» с мобильного, а через пару секунд уже работать с ними на компьютере.

    ⇡ Заключение

    Хотя скептики продолжают твердить о том, что хранение файлов «на сервере у незнакомого дяди» — небезопасно, даже они вынуждены согласиться: это чертовски удобно. Сервисы для синхронизации позволяют нам не задумываться о том, на каком компьютере мы в последний раз работали с файлом и в кармане каких брюк оставили флешку с последней копией. Они также обеспечивают удобнейший обмен файлами между компьютерами и мобильными устройствами, поэтому нет ничего удивительного, что число пользователей Dropbox, SugarSync и прочих сервисов с каждым днем растет.

    «Яндекс.Диск» — очень интересный проект, при разработке которого учитывались многие удачные наработки других сервисов. Поэтому, несмотря на приставку «бета», сервис уже вполне конкурентоспособен и для русскоязычной аудитории является отличной альтернативой Dropbox. Надеемся, что расширения функциональности и завершения этапа закрытого тестирования долго ждать не придется. И еще все же очень интересно посмотреть, каким будет ответ Google.

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

    Возможно, синхронизация просто выключена


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

    Закончилось место в облаке






    Очень часто бывает, что пользователь не замечает как заканчивается место на диске. Из-за этого синхронизация прекращается. Чтобы это проверить, нажмите на значок Яндекс Диск в области уведомлений. Кликаете по значку шестеренки. Далее выбираете пункт меню «Настройки». В открывшемся окне, нам нужен раздел «Аккаунт».

    Антивирус заблокировал синхронизацию

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

    Сбои в работе интернета






    Еще одна из распространенных проблем, это неполадки в сети. Если вы видите перебои в загрузке сайтов, то на Яндекс. Диске это тоже отразится. Он просто не сможет синхронизировать данные. Для решения проблемы, снова обратимся к области уведомлений. Здесь нажимаем на значок монитора правой кнопкой мыши. Выбираем «Центр управления сетями и общим доступом». В открывшемся окне, с левой стороны кликаем по надписи «Изменение параметров адаптера». Вы увидите все ваши сетевые подключения. Если используется Wi-Fi, тогда смотрим на беспроводные подключения. Проводной интернет, тогда подключения по локальной сети. В обоих случаях, должно быть указано состояние «Подключено». Если это не так, необходимо обратиться к провайдеру за диагностикой.

    Ничего не помогло?


    В случае, если вышеуказанные шаги не помогают, вы можете сообщить поддержке Яндекса об ошибке. Для этого нажимаете левой кнопкой мыши по значку Яндекс.Диск. Затем на значок шестеренки. Выбираем раздел меню «Справка» и «Сообщить Яндекс об ошибке».

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

    Принцип синхронизации заключается в следующем: при совершении действий с файлами (редактирование, копирование или удаление) изменения происходят и в облаке.

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

    При одновременной загрузке с разных устройств файлов с одинаковыми именами, Яндекс Диск присвоит им порядковый номер (file.exe, file(2).exe и т.д.).

    Индикация процесса синхронизации в системном трее:



    Такие же значки появляются у всех файлов и папок в каталоге Диска.

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

    Может показаться странным, что, к примеру архив весом 300 МБ, закачался на Диск за несколько секунд. Ничего странного, просто программа определяет, какие фрагменты файла были изменены и синхронизирует только их, а не весь архив (документ) целиком.

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

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

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

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

    Вывод: процесс синхронизации позволяет вносить изменения в документы сразу на всех устройствах, подключенных с помощью приложения Яндекс Диск к одному аккаунту. Сделано это для экономии времени и нервов пользователей. Синхронизация избавляет нас от необходимости постоянно скачивать и закачивать редактируемые файлы на Диск.

    Похожие публикации