G-Counters в Riak: Разве базовые vclocks не предоставляют те же данные?

Я читал в CvRDT и я знаю, что Riak уже добавил несколько к Riak 2.

Мой вопрос: зачем Риаку реализовать gcounter когда это звучит как основной vclock что связано с каждым объектом записи одной и той же информации? Не будет ли результат gcounter хранится с vclock каждый из которых содержит одну и ту же важную информацию?

Мое единственное предположение прямо сейчас было бы, что Риак может собрать мусор vclocks обрезка информации, которая на самом деле важна для целей gcounter (т.е. количество приращений).

Я не могу читать Erlang особенно хорошо, поэтому, возможно, я ошибочно предположил, что Riak хранит vclocks с этими особыми типами данных. Тем не менее, вопрос все еще относится к доморощенным решениям, которые написаны поверх стандартного Riak (и, следовательно, наследуют vclocks с каждым объектом сохраняется).

РЕДАКТИРОВАТЬ:

С тех пор я написал следующую статью, чтобы помочь объяснить CvRDT более практичным способом. Эта статья также касается избыточности, которую я выделил выше:

Бесконфликтные реплицированные типы данных (CRDT) - удобочитаемое объяснение с меньшим количеством математики.

2 ответа

Решение
  1. Riak сокращает векторы версий, не имеет большого значения для причинности (ложный параллелизм, больше братьев и сестер, безопасно), но является катастрофой для счетчиков.

  2. Поддержка CRDT в Riak носит общий характер. Мы "прячем" CRDT внутри обычного объекта riak.

  3. Поддержка 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. Вы можете только увеличить оба этих числа, поэтому есть два, а не один.

Другие вопросы по тегам