8. GIT: Структура истории
Добавляем дерево:
Но как понять, какое дерево корневое?
SHA1(Содержимое)
blob
Содержимое
SHA1(Дерево)
Tree
Дерево
file.txt
9. GIT: Структура истории
Добавляем коммит:
Но как понять, какой коммит последний?
SHA1(Содержимое)
blob
Содержимое
SHA1(Дерево)
Tree
Дерево
file.txtSHA1(Commit)
Commit
13. GIT как хранилище документа
Возьмём для примера текстовый документ,
похожий на docx или odt.
Оригинальное
содержимое
Tree 1
content
Commit 1
HEAD
14. GIT как хранилище документа
Добавим в него изображение
Содержимое с
картинкой
Tree 2
content
Commit 2
HEAD
Оригинальное
содержимое
Tree 1
content
Commit 1
Картинка1.png
15. GIT как хранилище документа
Исправим текст
Содержимое с
картинкой
Tree 2
content
Commit 2
HEAD
Оригинальное
содержимое
Tree 1
content
Commit 1
Картинка1.png
Новое содержимое с
картинкой
Tree 3
content
Commit 3
16. GIT
Можно использовать GIT:
● Документ должен быть разбит на мелкие,
атомарные, несвязанные блоки разумного
размера.
● Изменения каждого блока могут быть
смешаны (merge) независимо.
18. GIT в общей схеме БД
Serializer
Key → Value
Document
Converter
Lucene
Repository
Поисковые
запросы
λ
GIT
Преобразование
GIT в объект и
наоборот
19. GIT в общей схеме БД
Document
Converter
Lucene
Repository
Поисковые
запросы
λ
GIT
Преобразование
GIT в объект и
наоборот
Можно реализовать схему, в
которой каждый объект в GIT
будет являться отдельной
записью в репозитории.
Большой минус - изменения в
деревьях, общие для всей
системы.
Может быть это можно
обойти?
20. GIT
Чему нас учит GIT?
● Хеш-функции можно доверять
● Хешировать можно хеши (tree)
● Можно быстро искать изменения по
контрольным суммам
● Можно хранить всё
● Смешивание с использованием трёх
версий
21. GIT
Кстати о 3-х стороннем смешивании
Branch Content
Branch Tree
Origin Content
Origin Tree
Remote Content
Remote Tree
33. GIT
Паника! Я поменял файл, который кто-то
заменил на папку с тем же именем!
Branch Content
Branch Tree
Origin Content
Origin Tree Remote Tree
Remote SubTree
36. Справочники
Представим справочник в виде цепочки
событий:
Запись 1
Значение А
Запись 2
Значение Б
Запись 1
Значение В
Запись 2
Значение удалено
1:A 1:В
2:Б
1:A
2:Б
1:В
37. Часы Лампорта
Часы Лампорта (Лэсли Лэмпорт, 1978)
● Синхронизировать все узлы полностью
невозможно.
● Часы Лэмпорта присваивают каждому
событию единственное число, монотонно
увеличивая счётчик.
38. Часы Лампорта
● счётчик увеличивается перед каждым внутренним
событием процесса;
● при отправке сообщения значение счётчика
прикрепляется к сообщению;
● при получении сообщения значение счётчика
процесса-получателя выставляется в максимум
текущего и полученного значения и увеличивается
на 1.
39. Векторные часы
Векторные часы — алгоритм получения
частичного упорядочения событий в
распределённой системе и обнаружения
нарушений причинно-следственных связей.
40. Векторные часы
● изначально все значения часов равны 0;
● в случае внутреннего события счётчик текущего процесса
увеличивается на 1;
● перед отправкой сообщения внутренний счётчик, соответствующий
текущему процессу, увеличивается на 1, и вектор целиком
прикрепляется к сообщению;
● при получении сообщения счётчик текущего процесса увеличивается
на 1, далее значения в текущем векторе выставляются в максимум от
текущего и полученного.
41. Справочники
Но это к нам не имеет (почти) никакого
отношения.
Допустим мы создали значение на узле 1:
Запись 1.
Источник 1.
Версия 1.
Значение: А
43. 21
Справочники
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник 1.
Версия 1.
Значение: А
Запись 1.
Источник 2.
Версия 2.
Значение: Б
3
Запись 1.
Источник 1.
Версия 1.
Значение: А
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. 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. Справочники
Что делать если версии совпали?
Выбираем по одинковому признаку
(например по номеру источника)
Запись 1.
Источник 2.
Версия 2.
Значение: Б
Запись 1.
Источник 3.
Версия 2.
Значение: В
48. Кольцевой хеш
Позволяет найти положение участка
известных данных в произвольном блоке
данных за один проход.
Используется в rsync
49. Кольцевой хеш
Можно использовать для оптимизации
блоков передаваемых данных (rsync):
Принимающий компьютер разделяет свою копию файла на
неперекрывающиеся куски фиксированного размера S, и вычисляет
контрольную сумму для каждого куска: MD4-хеш и более слабый rolling
checksum, и отправляет их серверу, с которым синхронизируется.
Cервер, с которым синхронизируются, вычисляет контрольные суммы для
каждого кусочка размера S в своей версии файла, в том числе
перекрывающиеся куски.