NoSQL P2P DB на коленке
Часть 2: Синхронизация
Глеб Лебедев, Netvox Lab 2013
для MongoDB UG
Алгоритм 1. GIT
GIT
Так как мы строим Peer-2-Peer систему, то
для начала стоит рассмотреть
существующие решения.
GIT обладает всеми нужным...
GIT
GIT хранит все данные в виде объектов с
ключами
Ничего не напоминает? :)
Key - Value
GIT
Репозиторий GIT:
…
SHA1(Содержимое)
Содержимое
SHA1(Содержимое)
Содержимое
SHA1(Содержимое)
Содержимое
GIT
Контент это:
● Тип (blob, tree, commit, …)
● Пробел
● Длина файла
● 0 (ноль)
● Содержимое файла
Работает даже для пуст...
GIT: Структура истории
Допустим у нас есть файл. Вот его
содержимое:
Но где его имя?
SHA1(Содержимое)
Содержимое
GIT: Структура истории
Добавляем дерево:
Но как понять, какое дерево корневое?
SHA1(Содержимое)
blob
Содержимое
SHA1(Дерев...
GIT: Структура истории
Добавляем коммит:
Но как понять, какой коммит последний?
SHA1(Содержимое)
blob
Содержимое
SHA1(Дере...
GIT: Структура истории
SHA1(Содержимое)
blob
Содержимое
SHA1(Дерево)
Tree
Дерево
file.txtSHA1(Commit)
Commit
HEAD
Добавим ещё один файл
GIT: Структура истории
GIT: Структура истории
SHA1(Содержимое)
blob
Содержимое
SHA1(Дерево 2)
Tree
Дерево
file.txt
SHA1(Commit 2)
Commit 2
HEAD
S...
GIT как хранилище документа
Возьмём для примера текстовый документ,
похожий на docx или odt.
Оригинальное
содержимое
Tree ...
GIT как хранилище документа
Добавим в него изображение
Содержимое с
картинкой
Tree 2
content
Commit 2
HEAD
Оригинальное
со...
GIT как хранилище документа
Исправим текст
Содержимое с
картинкой
Tree 2
content
Commit 2
HEAD
Оригинальное
содержимое
Tre...
GIT
Можно использовать GIT:
● Документ должен быть разбит на мелкие,
атомарные, несвязанные блоки разумного
размера.
● Изм...
GIT
Например слайд презентации - отличный
претендент на элемент репозитория.
GIT в общей схеме БД
Serializer
Key → Value
Document
Converter
Lucene
Repository
Поисковые
запросы
λ
GIT
Преобразование
GI...
GIT в общей схеме БД
Document
Converter
Lucene
Repository
Поисковые
запросы
λ
GIT
Преобразование
GIT в объект и
наоборот
М...
GIT
Чему нас учит GIT?
● Хеш-функции можно доверять
● Хешировать можно хеши (tree)
● Можно быстро искать изменения по
конт...
GIT
Кстати о 3-х стороннем смешивании
Branch Content
Branch Tree
Origin Content
Origin Tree
Remote Content
Remote Tree
GIT
Я добавил элемент!
Branch Content
Branch Tree Origin Tree Remote Tree
GIT
Кто-то добавил элемент:
Branch Tree Origin Tree
Remote Content
Remote Tree
GIT
Кто-то удалил элемент
Branch Tree
Origin Content
Origin Tree Remote Tree
GIT
Я удалил элемент!
Branch Tree
Origin Content
Origin Tree Remote Tree
GIT
Я и кто-то другой вместе удалили элемент
Branch Tree
Origin Content
Origin Tree Remote Tree
GIT
Я и кто-то другой вместе добавили один и
тот-же элемент
Content
Branch Tree Origin Tree Remote Tree
GIT
… Или заменили старый на одинаковый
новый
Content
Branch Tree
Origin Content
Origin Tree Remote Tree
GIT
Конфликт! Кто-то одновременно со мной
поменял элемент!
Branch Content
Branch Tree
Origin Content
Origin Tree
Remote Co...
GIT
Конфликт! Я удалил элемент, а его кто-то
оменял!
Branch Tree
Origin Content
Origin Tree
Remote Content
Remote Tree
GIT
… Или я поменял, а кто-то удалил.
Конфликт!
Branch Content
Branch Tree
Origin Content
Origin Tree Remote Tree
GIT
И так далее, включая случаи, которые
лучше избегать.
GIT
Паника! Я поменял файл, который кто-то
заменил на папку с тем же именем!
Branch Content
Branch Tree
Origin Content
Ori...
Алгоритм 2.
Часы Лампорта
Справочники
● Небольшие объекты, не имеющие
сложной структуры.
● Их изменения не обязательно смешивать.
Справочники
Представим справочник в виде цепочки
событий:
Запись 1
Значение А
Запись 2
Значение Б
Запись 1
Значение В
Запи...
Часы Лампорта
Часы Лампорта (Лэсли Лэмпорт, 1978)
● Синхронизировать все узлы полностью
невозможно.
● Часы Лэмпорта присва...
Часы Лампорта
● счётчик увеличивается перед каждым внутренним
событием процесса;
● при отправке сообщения значение счётчик...
Векторные часы
Векторные часы — алгоритм получения
частичного упорядочения событий в
распределённой системе и обнаружения
...
Векторные часы
● изначально все значения часов равны 0;
● в случае внутреннего события счётчик текущего процесса
увеличива...
Справочники
Но это к нам не имеет (почти) никакого
отношения.
Допустим мы создали значение на узле 1:
Запись 1.
Источник 1...
1
Справочники
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник 2...
21
Справочники
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник ...
21
Справочники
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник ...
21
Справочники
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник ...
Справочники
Что делать если версии совпали?
Выбираем по одинковому признаку
(например по номеру источника)
Запись 1.
Источ...
Алгоритм 3.
Кольцевой хеш
Кольцевой хеш
Позволяет найти положение участка
известных данных в произвольном блоке
данных за один проход.
Используется ...
Кольцевой хеш
Можно использовать для оптимизации
блоков передаваемых данных (rsync):
Принимающий компьютер разделяет свою ...
Кольцевой хеш
Можно попробовать оптимизировать
синхронизацию журналов изменений
справочников.
Наибольшая общая
подпоследовательность
Путь копания в алгоритмах может привести
вас к очень интересным проблемам.
Но на се...
Вопросы?
(c)
2013
Upcoming SlideShare
Loading in …5
×

Синхронизация данных Peer-To-Peer

904 views

Published on

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

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
904
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Синхронизация данных Peer-To-Peer

  1. 1. NoSQL P2P DB на коленке Часть 2: Синхронизация Глеб Лебедев, Netvox Lab 2013 для MongoDB UG
  2. 2. Алгоритм 1. GIT
  3. 3. GIT Так как мы строим Peer-2-Peer систему, то для начала стоит рассмотреть существующие решения. GIT обладает всеми нужными нам свойствами.
  4. 4. GIT GIT хранит все данные в виде объектов с ключами Ничего не напоминает? :) Key - Value
  5. 5. GIT Репозиторий GIT: … SHA1(Содержимое) Содержимое SHA1(Содержимое) Содержимое SHA1(Содержимое) Содержимое
  6. 6. GIT Контент это: ● Тип (blob, tree, commit, …) ● Пробел ● Длина файла ● 0 (ноль) ● Содержимое файла Работает даже для пустых файлов!
  7. 7. GIT: Структура истории Допустим у нас есть файл. Вот его содержимое: Но где его имя? SHA1(Содержимое) Содержимое
  8. 8. GIT: Структура истории Добавляем дерево: Но как понять, какое дерево корневое? SHA1(Содержимое) blob Содержимое SHA1(Дерево) Tree Дерево file.txt
  9. 9. GIT: Структура истории Добавляем коммит: Но как понять, какой коммит последний? SHA1(Содержимое) blob Содержимое SHA1(Дерево) Tree Дерево file.txtSHA1(Commit) Commit
  10. 10. GIT: Структура истории SHA1(Содержимое) blob Содержимое SHA1(Дерево) Tree Дерево file.txtSHA1(Commit) Commit HEAD
  11. 11. Добавим ещё один файл GIT: Структура истории
  12. 12. GIT: Структура истории SHA1(Содержимое) blob Содержимое SHA1(Дерево 2) Tree Дерево file.txt SHA1(Commit 2) Commit 2 HEAD SHA1(Содержимое) blob Содержимое SHA1(Дерево) Tree Дерево file.txtSHA1(Commit) Commit file2.txt
  13. 13. GIT как хранилище документа Возьмём для примера текстовый документ, похожий на docx или odt. Оригинальное содержимое Tree 1 content Commit 1 HEAD
  14. 14. GIT как хранилище документа Добавим в него изображение Содержимое с картинкой Tree 2 content Commit 2 HEAD Оригинальное содержимое Tree 1 content Commit 1 Картинка1.png
  15. 15. GIT как хранилище документа Исправим текст Содержимое с картинкой Tree 2 content Commit 2 HEAD Оригинальное содержимое Tree 1 content Commit 1 Картинка1.png Новое содержимое с картинкой Tree 3 content Commit 3
  16. 16. GIT Можно использовать GIT: ● Документ должен быть разбит на мелкие, атомарные, несвязанные блоки разумного размера. ● Изменения каждого блока могут быть смешаны (merge) независимо.
  17. 17. GIT Например слайд презентации - отличный претендент на элемент репозитория.
  18. 18. GIT в общей схеме БД Serializer Key → Value Document Converter Lucene Repository Поисковые запросы λ GIT Преобразование GIT в объект и наоборот
  19. 19. GIT в общей схеме БД Document Converter Lucene Repository Поисковые запросы λ GIT Преобразование GIT в объект и наоборот Можно реализовать схему, в которой каждый объект в GIT будет являться отдельной записью в репозитории. Большой минус - изменения в деревьях, общие для всей системы. Может быть это можно обойти?
  20. 20. GIT Чему нас учит GIT? ● Хеш-функции можно доверять ● Хешировать можно хеши (tree) ● Можно быстро искать изменения по контрольным суммам ● Можно хранить всё ● Смешивание с использованием трёх версий
  21. 21. GIT Кстати о 3-х стороннем смешивании Branch Content Branch Tree Origin Content Origin Tree Remote Content Remote Tree
  22. 22. GIT Я добавил элемент! Branch Content Branch Tree Origin Tree Remote Tree
  23. 23. GIT Кто-то добавил элемент: Branch Tree Origin Tree Remote Content Remote Tree
  24. 24. GIT Кто-то удалил элемент Branch Tree Origin Content Origin Tree Remote Tree
  25. 25. GIT Я удалил элемент! Branch Tree Origin Content Origin Tree Remote Tree
  26. 26. GIT Я и кто-то другой вместе удалили элемент Branch Tree Origin Content Origin Tree Remote Tree
  27. 27. GIT Я и кто-то другой вместе добавили один и тот-же элемент Content Branch Tree Origin Tree Remote Tree
  28. 28. GIT … Или заменили старый на одинаковый новый Content Branch Tree Origin Content Origin Tree Remote Tree
  29. 29. GIT Конфликт! Кто-то одновременно со мной поменял элемент! Branch Content Branch Tree Origin Content Origin Tree Remote Content Remote Tree
  30. 30. GIT Конфликт! Я удалил элемент, а его кто-то оменял! Branch Tree Origin Content Origin Tree Remote Content Remote Tree
  31. 31. GIT … Или я поменял, а кто-то удалил. Конфликт! Branch Content Branch Tree Origin Content Origin Tree Remote Tree
  32. 32. GIT И так далее, включая случаи, которые лучше избегать.
  33. 33. GIT Паника! Я поменял файл, который кто-то заменил на папку с тем же именем! Branch Content Branch Tree Origin Content Origin Tree Remote Tree Remote SubTree
  34. 34. Алгоритм 2. Часы Лампорта
  35. 35. Справочники ● Небольшие объекты, не имеющие сложной структуры. ● Их изменения не обязательно смешивать.
  36. 36. Справочники Представим справочник в виде цепочки событий: Запись 1 Значение А Запись 2 Значение Б Запись 1 Значение В Запись 2 Значение удалено 1:A 1:В 2:Б 1:A 2:Б 1:В
  37. 37. Часы Лампорта Часы Лампорта (Лэсли Лэмпорт, 1978) ● Синхронизировать все узлы полностью невозможно. ● Часы Лэмпорта присваивают каждому событию единственное число, монотонно увеличивая счётчик.
  38. 38. Часы Лампорта ● счётчик увеличивается перед каждым внутренним событием процесса; ● при отправке сообщения значение счётчика прикрепляется к сообщению; ● при получении сообщения значение счётчика процесса-получателя выставляется в максимум текущего и полученного значения и увеличивается на 1.
  39. 39. Векторные часы Векторные часы — алгоритм получения частичного упорядочения событий в распределённой системе и обнаружения нарушений причинно-следственных связей.
  40. 40. Векторные часы ● изначально все значения часов равны 0; ● в случае внутреннего события счётчик текущего процесса увеличивается на 1; ● перед отправкой сообщения внутренний счётчик, соответствующий текущему процессу, увеличивается на 1, и вектор целиком прикрепляется к сообщению; ● при получении сообщения счётчик текущего процесса увеличивается на 1, далее значения в текущем векторе выставляются в максимум от текущего и полученного.
  41. 41. Справочники Но это к нам не имеет (почти) никакого отношения. Допустим мы создали значение на узле 1: Запись 1. Источник 1. Версия 1. Значение: А
  42. 42. 1 Справочники Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 2. Версия 2. Значение: Б 23
  43. 43. 21 Справочники Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 2. Версия 2. Значение: Б 3 Запись 1. Источник 1. Версия 1. Значение: А
  44. 44. 21 Справочники Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 2. Версия 2. Значение: Б 3 Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 3. Версия 2. Значение: В Запись 1. Источник 2. Версия 3. Значение: В Запись 1. Источник 2. Версия 2. Значение: Б
  45. 45. 21 Справочники Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 2. Версия 2. Значение: Б 3 Запись 1. Источник 1. Версия 1. Значение: А Запись 1. Источник 3. Версия 2. Значение: В Запись 1. Источник 2. Версия 3. Значение: В Запись 1. Источник 2. Версия 2. Значение: Б Запись 1. Источник 3. Версия 2. Значение: В Запись 1. Источник 2. Версия 3. Значение: В
  46. 46. Справочники Что делать если версии совпали? Выбираем по одинковому признаку (например по номеру источника) Запись 1. Источник 2. Версия 2. Значение: Б Запись 1. Источник 3. Версия 2. Значение: В
  47. 47. Алгоритм 3. Кольцевой хеш
  48. 48. Кольцевой хеш Позволяет найти положение участка известных данных в произвольном блоке данных за один проход. Используется в rsync
  49. 49. Кольцевой хеш Можно использовать для оптимизации блоков передаваемых данных (rsync): Принимающий компьютер разделяет свою копию файла на неперекрывающиеся куски фиксированного размера S, и вычисляет контрольную сумму для каждого куска: MD4-хеш и более слабый rolling checksum, и отправляет их серверу, с которым синхронизируется. Cервер, с которым синхронизируются, вычисляет контрольные суммы для каждого кусочка размера S в своей версии файла, в том числе перекрывающиеся куски.
  50. 50. Кольцевой хеш Можно попробовать оптимизировать синхронизацию журналов изменений справочников.
  51. 51. Наибольшая общая подпоследовательность Путь копания в алгоритмах может привести вас к очень интересным проблемам. Но на сегодня, наверное, хватит.
  52. 52. Вопросы? (c) 2013

×