Litekauto.ru

Авто Сервис
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Новый алгоритм синхронизации: как не подавиться 900 000 файлов

Новый алгоритм синхронизации Яндекс.Диска: как не подавиться 900 000 файлов

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

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

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

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

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

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

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

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

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

Читайте так же:
Зид карбюратор его регулировка

В этой версии алгоритма мы использовали три основных дерева: локальное (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МБ.

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

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

Читайте так же:
Регулировка тормоза тельфера 5 тонн

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

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

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

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

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

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

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

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

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

Цифры

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

Версия ПОЗагрузка на CPU.
Расчет дайджестов
Нагрузка на CPU
upload
Использование оперативной памяти, Мб
Яндекс.Диск 1.3.328% (1 ядро 100%)Примерно 1%102
Яндекс.Диск 1.2.748% (2 ядра 100%)Примерно 10%368

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

Версия ПОНагрузка на CPUВремя, секИспользование оперативной памяти, Мб
Яндекс.Диск 1.3.325% (1 ядро 100%)19082
Яндекс.Диск 1.2.750% (2 ядра 100%)200245

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

Версия ПОНагрузка на CPUВремя, секИспользование оперативной памяти, Мб
Яндекс.Диск 1.3.325% (1 ядро 100%)1055
Яндекс.Диск 1.2.750% (2 ядра 100%)22125

Upload 1Gb. Соединение Wi-Fi 10 МБит

Версия ПОНагрузка на CPUВремя, сек
Яндекс.Диск 1.3.35%1106
Яндекс.Диск 1.2.75%2530
Читайте так же:
Клапана 402 двигатель регулировка клапанов

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

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

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

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

Синхронизация Яндекс.Диска выключена

Синхронизация выключена

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

Включаем синхронизацию Яндекс.ДискаВключаем синхронизацию

Как настроить выборочную синхронизацию папок?

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

Управление синхронизацией доступно только для папок, расположенных непосредственно в папке Диска. Например, вы можете изменить настройки синхронизации для папки Яндекс.Диск/Музыка , но не для вложенной папки Яндекс.Диск/Музыка/Избранное .

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

Отключение синхронизации папки

Чтобы отключить синхронизацию папки, выполните следующие действия:

  1. Нажмите на значок программы в трее и выберите пункт меню Настройки.
  2. Перейдите на вкладку Синхронизация.
  3. Снимите флажок с папки, для которой вы хотите отключить синхронизацию.
  4. Нажмите кнопку OK.
  5. В появившемся окне нажмите кнопку Применить, чтобы изменения вступили в силу.

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

Как настраивать синхронизацию Яндекс Браузера

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

  • Синхронизировать закладки, историю, пароли, формы автозаполнения и настройки браузера;
  • Заходить и смотреть закладки и вкладки на любых устройствах;
  • Если устройство внезапно выключится, данные не потеряются, так как они уже хранятся на серверах разработчиков;
  • Совершать звонки с телефона на номера, которые вы ранее нашли в интернете.

Способ включения синхронизации всего лишь один, а вот вариантов как ее настраивать – несколько. Поэтому сегодня рассмотрим именно их.

Вариант 1: Включение синхронизации

Чтобы данная функция Яндекс Браузера была работоспособна, необходимо проделать следующие действия:

  1. Перейдите в меню браузера, далее – пункт «Синхронизация»;
  2. В этом окне введите личную информацию, которая необходима для входа в аккаунт;
  3. Кликните на кнопочку «Включить синхронизацию».

Также перейдите в раздел «Изменить настройки», в котором настроите необходимые пункты синхронизации.

Вариант 2: Изменение пунктов синхронизации

Эта возможность также покажет вам, какая информация передается на подключенные устройства, а какая – нет. Следуйте следующему короткому порядку действий:

  1. Зайдите в меню браузера, далее – раздел «Синхронизация»;
  2. В этой вкладке введите личную информацию, которая необходима для входа в аккаунт Яндекса;
  3. Перейдите в пункт «Показать параметры».
Читайте так же:
Клапан регулировки длины впускного коллектора

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

Вариант 3: Удаление данных и отключение возможности синхронизации

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

Отключить же синхронизацию просто. Во вкладке «Синхронизация» нажмите на кнопочку «Отключить».

Синхронизация папок

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

  1. В системном трее щелкаем правой кнопкой мыши по значку «Яндекс.Диск» и в меню выбираем пункт «Настройки».
  2. В открывшемся окошке перемещаемся на вкладку «Синхронизация».
  3. В окне ниже располагаются папки, которые можно синхронизировать. Требуется выбрать нужные путем установки напротив них соответствующей отметки (галочки).
  4. Нажимаем «Применить».
  5. Жмем «ОК».

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

настройка яндекс диска на андроид

Отключение в настройках приложения

Первый вариант – отключение синхронизации между устройствами в настройках приложения для смартфона.

Android

На устройстве Android зайдите в установленное приложение Яндекс.Диск (он должен быть авторизирован с профилем):

  1. В левом верхнем углу жмите «Лента».
  2. В новом окне кликните «Настройки».
  3. По очереди переходите в разделы «Автозагрузка фото и видео», «Обновление раздела Офлайн», «Обновление раздела Фото».
  4. Деактивируйте каждый элемент автозагрузки фото и видео.
  5. В обновлениях жмите «Выключить».
  6. Опуститесь ниже и удалите «Кэшированные данные».

На iPhone можно выключить синхронизацию фотографий через приложение:

  1. Откройте Яндекс.Диск, нажмите на значок своего профиля и перейдите в «Настройки».
  2. Кликните пункт «Автозагрузка фото» и переведите его в состояние «Выключить».
  3. Дополнительно очистите кэш.

МИНУТКА ЮМОРА

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

Синхронизация с Яндекс.Диском

Устанавливаем программу FreeFyleSync из PPA-репозитория:

Настройки для фоновой односторонней синхронизации папки «test» (создание зеркала). Запускаем FreeFyleSync:

1. Выбираем тип синхронизации (зеленая шестерня):
— выбрать кнопку «Зеркало =>>»
— настройки удаления переставить в «Удалить безвозвратно».

2. В левом столбце через «обзор» добавляем источник, в правом — папку на Яндекс.Диске.
Если нужно синхронизировать больше одной папки, то через «+» добавляем остальные «пары» директорий для синхронизации.

3. «Программа» — «Сохранить как пакетное задание».
4. Убираем галочки с «Показать окно прогресса» и «Сохранить лог-файл».
5. Сохраняем файл-задание в /home/tyrion/.FreeFileSync, чтоб не мешал (удалять его нельзя).

Закрываем FreeFyleSync и открываем RealtimeSync (идет в комплекте с первой программой):

Читайте так же:
Колонка рулевая чери того регулировка

1. «Программа» — «Открыть».
2. Находим в директории /home/tyrion/.FreeFileSync файл *.ffs_batch (по-умолчанию BatchRun.ffs_batch).
3. Время задержки ставим «90» (часто изменений больше одного и чтобы синхронизация не проводилась по сто раз, задержку лучше увеличить).
4. «Старт».

Для автозапуска добавляем в «Запуск приложений» новый элемент с командой:

Если Яндекс.Диск не монтируется автоматически, то синхронизация произойдет когда он станет доступен (примонтирован).

Share this:

Понравилось это:

Похожее

3 responses to “Синхронизация с Яндекс.Диском”

Спасибо за Руководство. Получил положительный результат. Но… пришлось попыхтеть. Основная проблема в том, что уровень текста несколько «круче» моей базы знаний и опыта. Не все интуитивно понятно. Поэтому поделюсь своими наблюдениями:
1) Программу устанавливаем через Терминал, последовательно копируя и запуская в нем три (приведенные Автором) командные строки. В итоге получаем не самую свежую версию… очевидно, надо бы что-то подкорректировать, либо сразу идти на обновление (кто смелый), но работать будет и так.
2) Описание FreeFyleSync скудноватое (оно и понятно, рассматривается только поставленая задача, и все ж таки…), и есть не соответствия тому, что у меня встало на компьютер: Так в п. 3 следовало бы написать «ФАЙЛ» — «Сохранить как…» (вместо «Программа» — » Сохранить…») Примечание! Это доступно только в полноэкранном режиме; в п. 4 … «Сохранить окно прогресса» галку не убрал, т.к. не нашел такой строки. ;
3) Теперь про RealtimeSync. В п.1 уточнения аналогичны п. 3 (описания FreeFyleSync); после п. 3 добавить пункт «3-а» такого содержания: -Сохранить результат «ФАЙЛ»-«Сохранить как» и выбрать ту же папку что и в п. 5, (описания FreeFyleSync)-.
4) Для обеспечения автозапуска (а без него зачем было огород городить!?) отыскиваем на компьютере приложение с названием «Автоматически запускаемые приложения», и запускаем его. Жмем «Добавить», графы ИМЯ и ОПИСАНИЕ заполняем на свой вкус, а в графу КОМАНДА копируем туда строку команды приведенной Автором, но на ее конце вносим исправление: вместо»…LastRun.ffs_real» указываем»…Realtime.ffs_real».

Ну, хорошо хоть чем-то статья оказалась полезной. Вообще эти записи, в большей степени, ведутся для себя, потому они не особо рассчитаны на широкую аудиторию. Благодарю за дополнения. Думаю, кому-нибудь это может пригодится.
Сейчас, кстати, появилось (помимо консольного клиента) какое-то решение от самого Яндекса (https://disk.yandex.ua/download/?from=webinterface#pc), правда не пробовал. Но по логике, если синхронизация со сторонними директориями отсутствует «из коробки», а описание вроде бы намекает, можно попробовать организовать с помощью deja dup.

Как я понимаю возможности FreeFyleSync куда больше чем только синхронизация Яндекс-диска с папками на жестком диске. К примеру, я начал использовать его чтобы синхронизировать Dropbox c Yandeks. А судя по таким кнопкам как «фильтр» и «сравнить» универсальность этого инструмента просто глобальная! Но увы, нет нигде даже маломальского примера использования остальных возможностей…

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector