Изменения

Перейти к: навигация, поиск

CRDT

941 байт добавлено, 19:44, 4 сентября 2022
м
rollbackEdits.php mass rollback
Нам требуется, чтобы операции образовывали '''полурешётку''' (semilattice) — полугруппа с коммутативной и идемпотентной операцией объединения (merge) операций.
Более формально: для любых двух операций $a$, $b$, $c$ верно:
# $a \wedge sqcup a = a$# $(a \wedge sqcup b) \wedge sqcup c = a \wedge sqcup (b \wedge sqcup c)$# $a \wedge sqcup b = b \wedge sqcup a$
Это позволяет нам очень просто реплицировать состояния: каждый узел при получении нового состояния от соседа объединяет его со своим состоянием.
А вот как построить такую полурешётку, чтобы было не больно пересылать — интересный вопрос, см. ниже.
== Репликация на основе состояния (CRDT) операций ==
Получив обновление от клиента, реплика сперва обновляет локальное состояние, затем отправляет это состояние другой реплике. Та применяет функцию merge, чтобы объединить свое состояние с полученным и отправляет его еще одной реплике, и т. д.Данные: целочисленный счётчик.
Достаточные условия согласованностиОперация:добавить $x$ к значению счётчика.
1. Множество возможных состояний образует полурешеткуЭта операция коммутативна, тно не идемпотентна.еПоэтому добавим в каждой операции уникальный идентификатор. частично упорядоченное множество с операцией наименьшей верхней грани, причем merge реализует эту операцию;
2. Обновления возрастаютПолучили полурешётку, но разрослись данные: не только счётчик, но и все идентификаторы операций.
Это обобщается: просто говорим, что операция — это множество операций, которые надо применить. У каждой операции есть время: пара из логических часов и номера процесса. Тогда, конечно, тяжёлое состояние и сложно получать реальные данные, зато работает. == Репликация на основе операций состояния == Теперь данные хранятся как $n$ независимых счётчиков: по одному на каждый процесс. Операция: установить компоненты в такие-то значения. Объединение операций: покомпонентный максимум (коммутативно и идемпотентно).
Реплика посылает Теперь у нас состояние не все состояниерастёт со временем, а только обновление инкремент всё ещё можно делать: процесс увеличивает свой локальный счётчик и рассылает своё новое состояние всем репликам. Согласованность можно гарантировать, если обновления коммутативны. Кроме того, требуется чтобы каждая операция была доставлена ровно один раз.
== $\delta$-CRDT ==
 
Оптимизация CRDT: отсылаем не весь вектор, а только изменения в этом векторе: установить такую-то компоненту в такое-то значение.
 
То есть у нас теперь есть не только операции, но и "кусочки операций", которые надо не только уметь применять, но ещё и склеивать между собой.
 
Относится к обоим видам CRDT.
1632
правки

Навигация