Синхронизация данных peer-to-peer

52
NoSQL P2P DB на коленке Часть 2: Синхронизация Глеб Лебедев, Netvox Lab 2013 для MongoDB UG

Upload: gleb-lebedev

Post on 24-May-2015

437 views

Category:

Documents


1 download

DESCRIPTION

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

TRANSCRIPT

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

NoSQL P2P DB на коленке

Часть 2: СинхронизацияГлеб Лебедев, Netvox Lab 2013

для MongoDB UG

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

Алгоритм 1. GIT

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

GIT

Так как мы строим Peer-2-Peer систему, то для начала стоит рассмотреть существующие решения.

GIT обладает всеми нужными нам свойствами.

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

GIT

GIT хранит все данные в виде объектов с ключами

Ничего не напоминает? :)

Key - Value

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

GIT

Репозиторий GIT:

SHA1(Содержимое)

Содержимое

SHA1(Содержимое)

Содержимое

SHA1(Содержимое)

Содержимое

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

GIT

Контент это:

● Тип (blob, tree, commit, …)● Пробел● Длина файла● 0 (ноль)● Содержимое файла

Работает даже для пустых файлов!

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

GIT: Структура истории

Допустим у нас есть файл. Вот его содержимое:

Но где его имя?

SHA1(Содержимое)

Содержимое

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

GIT: Структура истории

Добавляем дерево:

Но как понять, какое дерево корневое?

SHA1(Содержимое)

blobСодержимое

SHA1(Дерево)

TreeДерево

file.txt

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

GIT: Структура истории

Добавляем коммит:

Но как понять, какой коммит последний?

SHA1(Содержимое)

blobСодержимое

SHA1(Дерево)

TreeДерево

file.txtSHA1(Commit)

Commit

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

GIT: Структура истории

SHA1(Содержимое)

blobСодержимое

SHA1(Дерево)

TreeДерево

file.txtSHA1(Commit)

Commit

HEAD

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

Добавим ещё один файл

GIT: Структура истории

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

GIT: Структура истории

SHA1(Содержимое)

blobСодержимое

SHA1(Дерево 2)

TreeДерево

file.txt

SHA1(Commit 2)

Commit 2

HEAD

SHA1(Содержимое)

blobСодержимое

SHA1(Дерево)

TreeДерево

file.txtSHA1(Commit)

Commit

file2.txt

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

GIT как хранилище документа

Возьмём для примера текстовый документ, похожий на docx или odt.

Оригинальное содержимоеTree 1

content

Commit 1

HEAD

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

GIT как хранилище документа

Добавим в него изображение

Содержимое с картинкой

Tree 2

content

Commit 2

HEAD

Оригинальное содержимоеTree 1

content

Commit 1

Картинка1.png

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

GIT как хранилище документа

Исправим текст

Содержимое с картинкой

Tree 2

content

Commit 2

HEAD

Оригинальное содержимоеTree 1

content

Commit 1

Картинка1.png

Новое содержимое с картинкойTree 3 contentCommit 3

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

GIT

Можно использовать GIT:

● Документ должен быть разбит на мелкие, атомарные, несвязанные блоки разумного размера.

● Изменения каждого блока могут быть смешаны (merge) независимо.

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

GIT

Например слайд презентации - отличный претендент на элемент репозитория.

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

GIT в общей схеме БД

Serializer

Key → Value

Document Converter

Lucene

Repository

Поисковые запросы

λ

GITПреобразование GIT в объект и

наоборот

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

GIT в общей схеме БД

Document Converter

Lucene

Repository

Поисковые запросы

λ

GITПреобразование GIT в объект и

наоборот

Можно реализовать схему, в которой каждый объект в GIT будет являться отдельной записью в репозитории.

Большой минус - изменения в деревьях, общие для всей системы.

Может быть это можно обойти?

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

GIT

Чему нас учит GIT?

● Хеш-функции можно доверять● Хешировать можно хеши (tree)● Можно быстро искать изменения по

контрольным суммам● Можно хранить всё● Смешивание с использованием трёх

версий

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

GIT

Кстати о 3-х стороннем смешивании

Branch Content

Branch Tree

Origin Content

Origin Tree

Remote Content

Remote Tree

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

GIT

Я добавил элемент!

Branch Content

Branch Tree Origin Tree Remote Tree

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

GIT

Кто-то добавил элемент:

Branch Tree Origin Tree

Remote Content

Remote Tree

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

GIT

Кто-то удалил элемент

Branch Tree

Origin Content

Origin Tree Remote Tree

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

GIT

Я удалил элемент!

Branch Tree

Origin Content

Origin Tree Remote Tree

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

GIT

Я и кто-то другой вместе удалили элемент

Branch Tree

Origin Content

Origin Tree Remote Tree

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

GIT

Я и кто-то другой вместе добавили один и тот-же элемент

Content

Branch Tree Origin Tree Remote Tree

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

GIT

… Или заменили старый на одинаковый новый

Content

Branch Tree

Origin Content

Origin Tree Remote Tree

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

GIT

Конфликт! Кто-то одновременно со мной поменял элемент!

Branch Content

Branch Tree

Origin Content

Origin Tree

Remote Content

Remote Tree

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

GIT

Конфликт! Я удалил элемент, а его кто-то оменял!

Branch Tree

Origin Content

Origin Tree

Remote Content

Remote Tree

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

GIT

… Или я поменял, а кто-то удалил. Конфликт!

Branch Content

Branch Tree

Origin Content

Origin Tree Remote Tree

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

GIT

И так далее, включая случаи, которые лучше избегать.

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

GIT

Паника! Я поменял файл, который кто-то заменил на папку с тем же именем!

Branch Content

Branch Tree

Origin Content

Origin Tree Remote Tree

Remote SubTree

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

Алгоритм 2. Часы Лампорта

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

Справочники

● Небольшие объекты, не имеющие сложной структуры.

● Их изменения не обязательно смешивать.

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

Справочники

Представим справочник в виде цепочки событий:

Запись 1

Значение А

Запись 2

Значение Б

Запись 1

Значение В

Запись 2

Значение удалено

1:A 1:В2:Б

1:A2:Б

1:В

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

Часы Лампорта

Часы Лампорта (Лэсли Лэмпорт, 1978)

● Синхронизировать все узлы полностью невозможно.

● Часы Лэмпорта присваивают каждому событию единственное число, монотонно увеличивая счётчик.

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

Часы Лампорта

● счётчик увеличивается перед каждым внутренним событием процесса;

● при отправке сообщения значение счётчика прикрепляется к сообщению;

● при получении сообщения значение счётчика процесса-получателя выставляется в максимум текущего и полученного значения и увеличивается на 1.

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

Векторные часы

Векторные часы — алгоритм получения частичного упорядочения событий в распределённой системе и обнаружения нарушений причинно-следственных связей.

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

Векторные часы

● изначально все значения часов равны 0;

● в случае внутреннего события счётчик текущего процесса увеличивается на 1;

● перед отправкой сообщения внутренний счётчик, соответствующий текущему процессу, увеличивается на 1, и вектор целиком прикрепляется к сообщению;

● при получении сообщения счётчик текущего процесса увеличивается на 1, далее значения в текущем векторе выставляются в максимум от текущего и полученного.

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

Справочники

Но это к нам не имеет (почти) никакого отношения.

Допустим мы создали значение на узле 1:

Запись 1.Источник 1.Версия 1.Значение: А

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

1

Справочники

Запись 1.Источник 1.Версия 1.Значение: А

Запись 1.Источник 1.Версия 1.Значение: А

Запись 1.Источник 2.Версия 2.Значение: Б

23

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

21

Справочники

Запись 1.Источник 1.Версия 1.Значение: А

Запись 1.Источник 1.Версия 1.Значение: А

Запись 1.Источник 2.Версия 2.Значение: Б

3

Запись 1.Источник 1.Версия 1.Значение: А

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

21

Справочники

Запись 1.Источник 1.Версия 1.Значение: А

Запись 1.Источник 1.Версия 1.Значение: А

Запись 1.Источник 2.Версия 2.Значение: Б

3

Запись 1.Источник 1.Версия 1.Значение: А

Запись 1.Источник 3.Версия 2.Значение: В

Запись 1.Источник 2.Версия 3.Значение: В

Запись 1.Источник 2.Версия 2.Значение: Б

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

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.Значение: В

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

Справочники

Что делать если версии совпали?

Выбираем по одинковому признаку (например по номеру источника)

Запись 1.Источник 2.Версия 2.Значение: Б

Запись 1.Источник 3.Версия 2.Значение: В

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

Алгоритм 3. Кольцевой хеш

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

Кольцевой хеш

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

Используется в rsync

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

Кольцевой хеш

Можно использовать для оптимизации блоков передаваемых данных (rsync):

Принимающий компьютер разделяет свою копию файла на неперекрывающиеся куски фиксированного размера S, и вычисляет контрольную сумму для каждого куска: MD4-хеш и более слабый rolling checksum, и отправляет их серверу, с которым синхронизируется.

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

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

Кольцевой хеш

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

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

Наибольшая общая подпоследовательность

Путь копания в алгоритмах может привести вас к очень интересным проблемам.

Но на сегодня, наверное, хватит.

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

Вопросы?(c)

2013