Явний DAG замість векторних годин для синхронізації


13

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

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

Коли незалежні однолітки вносять зміни, вони можуть "позначити" час "годинником". Я використовую термін "годинник" і "штамп часу", але я не маю на увазі настінний годинник. Я маю на увазі якусь часткову впорядкованість подій, яка дає зрозуміти причинність. Саме відносини "сталися раніше" між подіями формують спрямований ациклічний графік (DAG).

Схоже, "звичайним" способом побудови цього часткового впорядкування є використання векторного годинника . Однак вони можуть стати дуже великими. Більш недавні розробки, такі як інтервальні годинники, забезпечують більш компактне зберігання часових позначок.

Що мені зовсім не зрозуміло, це те, чому протоколи синхронізації, очевидно, не "просто" зберігають DAG явно. (Або вони?)

Колеги можуть самостійно створювати позначку часу, випадковим чином генеруючи UUID (або іншими способами, такими як <peer-name> + <local-monotonically-increasing-counter>). Упорядкування цієї позначки часу цілком однозначно для цього однолітка.

Коли 2 однолітків синхронізуються один з одним, вони можуть домовитись про нову позначку часу. Знову ж таки, впорядкування цієї позначки часу зрозуміло обом ровесникам.

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

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

Зважаючи на те, що зберігання та синхронізація DAG явно видається простою: чи це застосовується на практиці? Якщо ні, то чому переважні векторні годинники?


Примітки

Оглядатись

Я б віддав перевагу рівноправному рішенню над рішенням клієнтського сервера.

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


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

Спасибі @kdgregory - хороший момент. Щоб мати можливість обчислити тристоронній злиття в майбутньому, вам потрібно знати минуле (і вміти визначати DAG минулих часових точок). Отже, якщо ви зберігаєте ці минулі моменти часу, то явне зберігання DAG дешевше. Якщо ви не зберігаєте ці минулі моменти часу, тоді ви не можете обчислити тристороннє об'єднання даних. - Цікаво, чи може бути ця річ у трьох напрямках? Якщо ви не хочете тристоронні, можливо, векторні годинники краще, ніж явні DAG?
Бенджон

Я вважаю, що це може бути вирішальним моментом @kdgregory, тому я трохи додав про це питання. Я припускаю, що можна здійснити тристоронній злиття, що також означає, що вся історія відома. Якщо відома вся історія, то (я вважаю) явний DAG дешевше. Якщо історія урізана, то векторний годинник, мабуть, є менш затратним підходом.
Бенджон

1
Так, моє розуміння векторних годин полягає в тому, що вони призначені просто для прийняття / відхилення рішення: "вузол C намагається оновити цю частину даних, але не знає про оновлення вузла B".
kdgregory

Відповіді:


1

Наскільки я можу сказати, системи управління версіями на зразок Git та Mercurial використовують підхід DAG, а не векторні годинники.


1
Без пояснення ця відповідь може стати марною у випадку, якщо хтось інший висловить протилежну думку. Наприклад, якщо хтось опублікував претензію на кшталт "Системи контролю пропаганди, такі як Git та Mercurial, використовують векторні годинники, а не підхід DAG" , як ця відповідь допоможе читачеві вибрати дві протилежні думки? Розглянемо редагування ІНГ його в кращій формі, щоб зустрітися Як відповідати стандартам якості.
гнат

2
Як я зрозумів це питання, вони запитували, чи є приклади реального світу, де використовується DAG, а не векторні годинники.
bikeman868

1
І Git, і Mecurial - це реальні приклади синхронізації змін однорангових змін за допомогою DAG, і я сподіваюся, що Бенджон знайде мою відповідь корисною, навіть якщо ви її проголосували.
bikeman868

Привіт @ bikeman868 Я проголосував за чистий 0 (вибачте). Ваш відповідь є корисним, навіть якщо витриманий з невизначеністю! Хоча посилання або авторитетні відповіді завжди приємні, обмін стеками не вимагає цього! Ваша пропозиція має сенс з пунктами коментарів до питання. Схоже, коли ви хочете зберігати історію і мати можливість об'єднати історії, тоді DAG підходить. Якщо ви не зберігаєте історію і хочете синхронізації та консенсусу щодо поточного стану, то векторні годинники - це те, що вам потрібно.
Бенджон

1

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

Іншим (можливо, дотичним) підходом до цієї проблеми є розробка CRDT .


Braid HTTP намагається створити протокол синхронізації на основі CRDT шляхом збільшення HTTP. Вони мають чудову візуалізацію часу DAG та Space DAG, і як ці дві концепції взаємопов’язані, щоб досягти можливої ​​послідовності.
Дуейн J

-1

Протокол Aleph - це протокол без лідерів p2p, який будує розподілену DAG набору транзакцій (або подій) за допомогою консенсусу

https://arxiv.org/pdf/1908.05156


Ви повинні розширити свою відповідь, щоб показати, як посилається на протокол вирішення питань, піднятих оригінальним запитанням. Важливо зробити відповіді самодостатніми, оскільки це приносить користь усім, хто стикається з цим питанням.
BobDalgleish
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.