G-Counters в Riak: Разве базовые vclocks не предоставляют те же данные?
Я читал в CvRDT и я знаю, что Riak уже добавил несколько к Riak 2.
Мой вопрос: зачем Риаку реализовать gcounter
когда это звучит как основной vclock
что связано с каждым объектом записи одной и той же информации? Не будет ли результат gcounter
хранится с vclock
каждый из которых содержит одну и ту же важную информацию?
Мое единственное предположение прямо сейчас было бы, что Риак может собрать мусор vclocks
обрезка информации, которая на самом деле важна для целей gcounter
(т.е. количество приращений).
Я не могу читать Erlang особенно хорошо, поэтому, возможно, я ошибочно предположил, что Riak хранит vclocks
с этими особыми типами данных. Тем не менее, вопрос все еще относится к доморощенным решениям, которые написаны поверх стандартного Riak (и, следовательно, наследуют vclocks
с каждым объектом сохраняется).
РЕДАКТИРОВАТЬ:
С тех пор я написал следующую статью, чтобы помочь объяснить CvRDT более практичным способом. Эта статья также касается избыточности, которую я выделил выше:
2 ответа
Riak сокращает векторы версий, не имеет большого значения для причинности (ложный параллелизм, больше братьев и сестер, безопасно), но является катастрофой для счетчиков.
Поддержка CRDT в Riak носит общий характер. Мы "прячем" CRDT внутри обычного объекта riak.
Поддержка CRDT в Riak - это первая волна, и мы будем оптимизировать ее по мере выпуска новых версий.
У нас есть отличный список рассылки для таких вопросов, кстати, кстати. Переполнение стека имеет свое применение, но если вы хотите поговорить с авторами БД с открытым исходным кодом, почему бы не использовать их список? Поскольку Riak является открытым исходным кодом, вы можете отправить запрос на извлечение, мы будем рады включить ваши идеи в базу кода.
Быстрый ответ: счетчики Riak на самом деле являются PN-счетчиками, т.е. они допускают как увеличение, так и уменьшение, поэтому не могут быть реализованы как vclock, так как требуют различного отслеживания приращений и уменьшений.
Длинный ответ:
Этот вопрос говорит о том, что вы совершенно не поняли разницу между g-счетчиком и векторными часами (или вектором версии).
Векторные часы (vclock) - это система для отслеживания причин одновременного обновления фрагмента данных. Это карта {actor => логических часов}. Актеры только увеличивают свои логические часы, когда данные, с которыми они связаны, изменяются, и пытаются увеличить их как можно меньше (так, самое большее, один раз за обновление). Два vclocks могут быть либо одновременными, либо один может доминировать над другим.
G-счетчик - это CvRDT с тем же строением, что и vclock, но с существенными отличиями. Они реализованы в виде карты {actor => counter}. Актеры могут увеличивать свой счетчик столько, сколько они хотят. G-счетчик имеет концепцию "значения счетчика" и концепцию "слияния", так что когда параллельные операции выполняются разными участниками, они могут определить, каким должно быть фактическое "значение счетчика".
Важно отметить, что g-счетчики не могут отследить причинно-следственную связь, и vclocks понятия не имеют, каково их "значение счетчика".
Смешение двух в кодовой базе не только сбивает с толку, но и может привести к ошибкам.
Добавьте это к тому факту, что в riak действительно реализованы pn-счетчики. Разница в том, что g-счетчик может только увеличиваться, но pn-счетчики могут увеличиваться и уменьшаться. Счетчики Pn работают как карта {actor => (счетчик приращений, счетчик приращений)}, который, очевидно, имеет структуру, отличную от структуры vclock. Вы можете только увеличить оба этих числа, поэтому есть два, а не один.