Яндекс диск не синхронізується. Що робити, якщо диск не синхронізується. Вибіркова синхронізація папок на Яндекс.Диску - Блог Яндекса

Останнім часом все більшої популярності набирають сервіси хмарного зберігання даних, такі як Яндекс.Диск, Google Drive і т.д. Вони дозволяють Вам підстрахуватися від втрати важливих даних, таких як документи фотографії та ін. У принципі, це зручно, за винятком одного моменту – програмне забезпечення сервісу створює на комп'ютері свою папку, з якою здійснює синхронізацію хмарний сервіс, тобто щоб надіслати якісь- то дані в “хмару” необхідно скопіювати в цю папку. Це незручно при великих обсягах даних: так якщо у вас, наприклад, 300 Гб фотографій, то для синхронізації їх потрібно виділити і скопіювати в папку сервісу (а копіювання такого обсягу явно не для слабкодухих), і цей процес потрібно повторювати при оновленні даних. Але знайшлося вирішення проблеми – символічне посилання.

Символічна (символьне) посилання - спеціальний файл у файловій системі, для якого не формуються жодні дані, крім одного текстового рядка з покажчиком. Цей рядок трактується як шлях до файлу, який повинен бути відкритий при спробі звернутися до посилання (файлу). Символьне посилання займає стільки місця у файловій системі, скільки потрібно для запису її вмісту.

Символьні посилання використовуються для зручнішої організації структури файлів на комп'ютері, тому що дозволяють для одного файлу або каталогу мати кілька імен та різних атрибутів, а також вільні від деяких обмежень, властивих жорстким посиланням (останні діють лише в межах однієї файлової системи (одного розділу) і можуть посилатися на каталоги).

Це за матеріалами Wikipedia, а якщо "російською", то все, що у вас в каталозі, на який вказує посилання, то і в цільовому каталозі. Саме символьне посилання широко використовується на Linux системах, але є можливість створити його і в системі Windows.

Створити посилання можна за допомогою командного рядка, але набагато простіше за допомогою утиліти Link Shell Extension, яка вміє створювати необхідний тип посилання.

Розглядати цей метод ми на прикладі сервісу Яндекс.Диск.

І так. Для початку потрібна реєстрація в системі Яндекс. Далі переходимо на сторінку Яндекс.Диск, завантажуємо дистрибутив ПЗ Яндекс.Диск на комп'ютер і встановлюємо його. З'явиться іконка у вигляді літаючої тарілки із зеленою галочкою або синім кружечком зі стрілочками на панелі завдань біля годинника.

Також буде створено папку Яндекс.Диск на комп'ютері у вказаному вами місці.

Потім завантажуємо утиліту Link Shell Extension, встановлюємо її, перезавантажуємо комп'ютер і в контекстному меню, що викликається натисканням правої кнопки миші, у нас з'являються новий рядок "Запам'ятати джерело посилання".

Щоб синхронізувати папку з "хмарою", знаходимо її на комп'ютері, натискаємо по ній правою кнопкою миші та вибираємо "Запам'ятати джерело посилання".

Після цього переходимо в папку Яндекс.Диск, натискаємо правою кнопкою миші і вибираємо “Помістити як -> Символічне посилання”

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

У цьому пості я розповім, чому так вийшло: чого ми не змогли передбачити, коли вигадували першу версію ПЗ Яндекс.Діска, і як створювали нову.

Насамперед, про завдання синхронізації. Технічно кажучи, вона полягає в тому, щоб у папці Яндекс.Диска на комп'ютері користувача та у хмарі був один і той же набір файлів. Тобто такі дії користувача, як перейменування, видалення, копіювання, додавання та зміна файлів повинні синхронізуватися з хмарою автоматично.

Чому це не так просто, як здається на перший погляд?

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

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

Трапляються випадки, коли файл на комп'ютері користувача не можна назвати так само, як він називається у хмарі. Це може статися, якщо в імені є символ, який не може використовуватися локальною файловою системою, або в тому випадку, коли користувача запрошують до спільної папки, а у нього є своя папка з таким ім'ям. У таких випадках нам доводиться використовувати локальні псевдоніми та відслідковувати їхній зв'язок з об'єктами у хмарі.

Попередня версія алгоритму

У минулій версії десктопного програмного забезпечення Яндекс.Диска для пошуку змін використовувався алгоритм порівняння дерев. Будь-яке інше рішення на той момент не дозволяло реалізувати пошук переміщень та перейменувань, оскільки бекенд у відсутності унікальних ідентифікаторів об'єктів.

У цій версії алгоритму ми використовували три основних дерева: локальне (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 порівнюються. Оскільки вони збігаються, додається стабільний стан;
  4. Стан local та remote видаляються. Вони більше не потрібні, тому що вся інформація є у stable.


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

Інші покращення

У новій версії ми попрацювали над іншими поліпшеннями, що вплинули на продуктивність. Збереження дерева зробили інкрементальним, що дозволяє записувати у файл лише останні зміни.

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

Цифри

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

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

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

Upload 1Gb. З'єднання Wi-Fi 10 Мбіт
Час, сік

Що вийшло

З прикладів видно, що нова версія ПО Яндекс.Діска використовує приблизно в 3 рази менше за оперативну пам'ять і приблизно в 2 рази менше навантажує CPU. Обробка дрібних змін не призводить до збільшення обсягу пам'яті, що використовується.

В результаті виконаних змін суттєво збільшилася кількість файлів, з якими без проблем справляється програма. У версії для Windows – 300 000, а на Mac OS X – 900 000 файлів.

Допустимо, ви намалювали картинку kartinka.jpg на комп'ютері, відключеному від інтернету, а потім завантажили на Диск фотографію з тим самим ім'ям з мобільного телефону.

Коли ви підключите комп'ютер до Інтернету, Яндекс.Диск розпочне синхронізацію. Виявивши різні файли з однаковими іменами, Диск перейменує один із них: у результаті файли будуть називатися kartinka.jpg та kartinka (2).jpg.

  • - Усі файли синхронізовані;
  • - Іде синхронізація;
  • - У процесі синхронізації сталася помилка.

У Провіднику Windows такі ж піктограми відображаються для кожного файлу в папці Яндекс.Диска.

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

Яндекс.Диск визначає, які частини файлу були змінені, і вивантажує на сервер лише змінені фрагменти, а чи не файл повністю.

Для збереження місця на комп'ютері можна вимкнути синхронізацію окремих папок. Ці папки будуть видалені з комп'ютера, але залишаться доступними на сторінці сервісу та інших програмах Яндекс.Диска.

Детальні інструкції з налаштування вибіркової синхронізації:

  • у програмі для Windows;
  • у програмі для Mac.

yandex.ru

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

Для взаємодії локального комп'ютера з центром хмарного Яндекс Диска існує термін «синхронізація». Програма, встановлена ​​на комп'ютері, активно щось із чимось синхронізує. Давайте розберемося, що це за процес і для чого він потрібний.

Принцип синхронізації полягає в наступному: при здійсненні дій з файлами (редагування, копіювання або видалення) зміни відбуваються у хмарі.

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

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

Індикація процесу синхронізації у системному треї:

Такі самі піктограми з'являються у всіх файлів та папок у каталозі Диска.

Швидкість, з якою відбувається синхронізація даних на Яндекс диску, можна дізнатися, навівши курсор на піктограму програми в треї.

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

Це дуже зручно, якщо на диску зберігаються файли будь-якого поточного проекту. Редагування документів прямо в папці Диску заощаджує трафік та час.

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

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

Зрозуміло, у додатку є функція повного відключення синхронізації з хмарним сховищем.

Висновок: процес синхронізації дозволяє вносити зміни до документів відразу на всіх пристроях, підключених за допомогою програми Яндекс Диск до одного облікового запису. Зроблено це для економії часу та нервів користувачів. Синхронізація позбавляє нас необхідності постійно завантажувати і закачувати редаговані файли на Диск.

Та ні

lumpics.ru

Як настроїти Яндекс Диск

Після реєстрації та створення Яндекс Диска його можна налаштувати на свій розсуд. Розберемо основні налаштування програми.

Налаштування Яндекс Диска викликається натисканням правою кнопкою миші на піктограмі програми в треї. Тут ми бачимо список останніх синхронізованих файлів та маленьку шестерню у нижньому правому кутку. Вона нам і потрібна. Натискаємо, у контекстному меню, що випадає, знаходимо пункт «Налаштування».

Основні

На цій вкладці налаштовується запуск програми при вході в систему і включається можливість отримання новин від Яндекс Диска. Можна також змінити розташування папки програми.

Якщо робота з Диском ведеться активно, тобто Ви постійно звертаєтесь до сервісу та робите якісь дії, то автозавантаження краще включити – це економить час.

Змінювати розташування папки, на думку автора, особливого сенсу не має, якщо тільки Ви не хочете звільнити місце на системному диску, а саме там папка і лежить. Перенести дані можна в будь-яке місце, навіть на флешку, щоправда, у разі, при відключенні накопичувача від комп'ютера Диск працювати перестане.

І ще один нюанс: необхідно буде стежити за тим, щоб буква диска при підключенні флешки відповідала вказаній в налаштуваннях, інакше програма не знайде шлях до папки.

Щодо новин від Яндекс Диска складно щось сказати, оскільки за весь час використання жодної новини не приходило.

Акаунт

Це більша інформативна вкладка. Тут вказаний логін від облікового запису Яндекс, інформація про витрати обсягу та кнопка відключення комп'ютера від Диска.

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

Синхронізація

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

Для окремих папок синхронізацію можна вимкнути, але в цьому випадку папка буде видалена з комп'ютера і залишиться лише у хмарі. У меню налаштувань вона також буде помітна.

Автозавантаження

Яндекс Диск дає можливість автоматично імпортувати фотографії із підключеної до комп'ютера камери. При цьому програма запам'ятовує профілі налаштувань і при наступному підключенні нічого налаштовувати не доведеться.

Кнопка "Забути пристрої" відв'язує всі камери від комп'ютера.

Скріншоти

На цій вкладці настроюються гарячі клавіші для виклику різних функцій, вид імені та формат файлу.

Програма для виробництва скріншотів всього екрану дозволяє використовувати стандартну клавішу Prt Scr, а ось для зйомки певної області доведеться викликати скріншотилку через ярлик. Це дуже незручно, якщо потрібно зробити скріншот частини вікна, розгорнутого на весь екран (наприклад, браузера). Тут і приходять на допомогу гарячі кнопки.

Поєднання можна вибрати будь-яке, головне, щоб ці комбінації не були зайняті системою.

Проксі

Про ці установки можна написати цілий трактат, тому обмежимося коротким поясненням.

Проксі сервер - сервер, через який йдуть запити клієнта до мережі. Він є своєрідним екраном між локальним комп'ютером та інтернетом. Такі сервери виконують різні функції – від шифрування трафіку до захисту ПК від атак.

У будь-якому випадку, якщо Ви користуєтесь проксі, і знаєте, навіщо він Вам потрібен, то все налаштуєте самостійно. Якщо ж ні, він і не потрібен.

Додатково

На цій вкладці налаштовується автоматичне встановлення оновлень, швидкість з'єднання, надсилання повідомлень про помилки та повідомлення про спільні папки.

Тут все зрозуміло, розповім лише про налаштування швидкості.

Яндекс Диск, при виконанні синхронізації, качає файли в кілька потоків, займаючи досить велику частину інтернет-каналу. Якщо є необхідність обмежити апетит програми, можна поставити цю галку.

Тепер ми знаємо, де знаходяться налаштування Яндекс Диска і що вони змінюють у програмі. Можна розпочинати роботу.

Ми раді, що змогли допомогти Вам у вирішенні проблеми.

Опитування: чи допомогла вам ця стаття?

Та ні

lumpics.ru

Вибіркова синхронізація папок на Яндекс.Диску - Блог Диска

Windows,Mac Os X,Синхронізація,Програми та програми

yandex.ru

Вибіркова синхронізація папок на Яндекс.Диску - Блог Яндекса

У додатках Яндекс.Диска для Windows та Mac OS X з'явилася важлива функція – вибіркова синхронізація. Тепер ви можете вибирати, які папки зберігати на комп'ютері, а які - тільки на Яндекс.Діске. Наприклад, якщо ви використовуєте Яндекс.Диск для зберігання бекапів або архівів, не обов'язково мати копії цих файлів на домашньому комп'ютері. Вони рідко бувають потрібні, але займають місце. Ви можете вимкнути синхронізацію для папок із такими файлами. Якщо ви використовуєте Диск на декількох комп'ютерах, синхронізацію окремих папок можна включити на одному з них і вимкнути на іншому. Наприклад, особистий фотоархів можна зберігати домашньому комп'ютері, ніж він займав місце робочому. А загальні папки тримати тільки на робочому ноутбуці, щоб не було спокуси попрацювати з ними з дому. Управління синхронізацією папок доступне в установках програм.

Програма Windows також дозволяє вимкнути синхронізацію папки з Провідника.

При цьому завантажувати нові файли в папку, що не синхронізується, можна прямо на комп'ютері. Просто перетягніть файли у потрібну папку у вікні налаштувань.

Слідкуйте за новинами Яндекс.Діска у нашому блозі.

Програма може керувати лише одним диском, що належить одному певному акаунту. Якщо ви авторизуєтеся з іншим логіном, для синхронізації буде створено нову папку Яндекс.Диска з ім'ям «Яндекс.Диск – інший логін». Копію файлів попереднього облікового запису буде збережено.

Що станеться, якщо перемістити папку Яндекс.Діска?

Якщо ви перенесете папку Яндекс.Диска, не вказавши нове положення в налаштуваннях програми, програма створить папку на новому місці. Щоб перемістити копію диска, натисніть піктограму диска, виберіть пункт Установки , натисніть кнопку Налаштувати розташування папокта вкажіть новий шлях до папки: програма автоматично перенесе файли на нове місце.

Чи можна довіряти роботу з диском стороннім програмам?

Чи не можна зберігати на своєму комп'ютері файли, що зберігаються на Диску?

Програма Яндекс.Диск 3.0 дозволяє синхронізувати з комп'ютером не всі файли з диска, щоб заощадити місце на комп'ютері. Наприклад, якщо ви часто працюєте з папкою Документи, увімкніть для неї синхронізацію - ця папка зберігатиметься на комп'ютері. Інші папки зберігатимуться лише у хмарі, але будуть також доступні у програмі.

Налаштувати вибіркову синхронізацію можна за інструкцією для Windows, MacOS.

Що станеться, якщо видалю файли з папки Яндекс.Диска?

Коли ви видаляєте файли в програмі, вони потрапляють у Кошик і зберігаються у ньому 30 днів. Після цього вони автоматично видаляються із сервера. Не можна відновити видалені з сервера файли.Відновити файли з Корзини можна лише у веб-інтерфейсі Яндекс.Диска.

Увага. Файли, переміщені в Кошик, продовжують займати місце на диску. Якщо вам не вистачає місця, почистіть Кошик.

Якщо ви бажаєте видалити файл з комп'ютера, але зберегти на сервері, настройте вибіркову синхронізацію за інструкцією для Windows, для MacOS.

Чи можна обмежити доступ до папки Яндекс.Діска?

Якщо ви хочете закрити папку, наприклад, від інших користувачів комп'ютера, ви можете обмежити доступ до неї стандартними засобами Windows. При цьому слід пам'ятати, що обмеження доступу може стати на заваді роботі програми.

Що станеться, якщо я видалю програму або перевстановлю операційну систему?

Файли Диску можуть залишитися на вашому комп'ютері, але синхронізуватися не будуть. Щоб автоматично синхронізувати файли з сервером, установіть програму та авторизуйтесь.

Як вибрати іншу папку для синхронізації із сервером?

    Натисніть кнопку Налаштувати розташування папок.

    Вкажіть іншу папку для синхронізації із сервером.

Як дізнатися скільки залишилося вільного місця на Диску?

Як настроїти програму для роботи через проксі-сервер?

    Натисніть піктограму Диска в області сповіщень.

    Виберіть пункт Установки .

    Перейдіть на вкладку Проксі.

    Виберіть пункт Налаштування проксі-сервера..

Як приховати піктограму Диска на панелі Dock у macOS?

    Натисніть піктограму Диска в області сповіщень.

    Виберіть пункт Установки .

    Перейдіть на вкладку Додатково.

    Увімкніть опцію Сховати значок на панелі Dock.

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

    У цьому пості я розповім, чому так вийшло: чого ми не змогли передбачити, коли вигадували першу версію ПЗ Яндекс.Діска, і як створювали нову.

    Насамперед, про завдання синхронізації. Технічно кажучи, вона полягає в тому, щоб у папці Яндекс.Диска на комп'ютері користувача та у хмарі був один і той же набір файлів. Тобто такі дії користувача, як перейменування, видалення, копіювання, додавання та зміна файлів повинні синхронізуватися з хмарою автоматично.

    Чому це не так просто, як здається на перший погляд?

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

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

    Трапляються випадки, коли файл на комп'ютері користувача не можна назвати так само, як він називається у хмарі. Це може статися, якщо в імені є символ, який не може використовуватися локальною файловою системою, або в тому випадку, коли користувача запрошують до спільної папки, а у нього є своя папка з таким ім'ям. У таких випадках нам доводиться використовувати локальні псевдоніми та відслідковувати їхній зв'язок з об'єктами у хмарі.

    Попередня версія алгоритму

    У минулій версії десктопного програмного забезпечення Яндекс.Диска для пошуку змін використовувався алгоритм порівняння дерев. Будь-яке інше рішення на той момент не дозволяло реалізувати пошук переміщень та перейменувань, оскільки бекенд у відсутності унікальних ідентифікаторів об'єктів.

    У цій версії алгоритму ми використовували три основних дерева: локальне (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 порівнюються. Оскільки вони збігаються, додається стабільний стан;
    4. Стан local та remote видаляються. Вони більше не потрібні, тому що вся інформація є у stable.


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

    Інші покращення

    У новій версії ми попрацювали над іншими поліпшеннями, що вплинули на продуктивність. Збереження дерева зробили інкрементальним, що дозволяє записувати у файл лише останні зміни.

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

    Цифри

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

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

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

    Upload 1Gb. З'єднання Wi-Fi 10 Мбіт
    Час, сік

    Що вийшло

    З прикладів видно, що нова версія ПО Яндекс.Діска використовує приблизно в 3 рази менше за оперативну пам'ять і приблизно в 2 рази менше навантажує CPU. Обробка дрібних змін не призводить до збільшення обсягу пам'яті, що використовується.

    В результаті виконаних змін суттєво збільшилася кількість файлів, з якими без проблем справляється програма. У версії для Windows – 300 000, а на Mac OS X – 900 000 файлів.

    Технології