Что такое протокол репликации CouchDB? Это как ГИТ?


есть ли техническая документация, описывающая, как работает репликация между двумя диванами?

каков основной обзор репликации CouchDB? Какие примечательные характеристики об этом?

5 63

5 ответов:

к сожалению, нет подробной документации, описывающей протокол репликации. Существует только эталонная реализация, встроенная в CouchDB, и переписывание Филипа Мананы того же самого, которое, вероятно, станет новой импликацией в будущем.

однако, это общая идея:

ключевые моменты

если вы знаете Git, то вы знаете, как работает репликация дивана. репликация-это очень подобный нажимать или вытягивание с распределенными исходными менеджерами, такими как Git.

репликация CouchDB не имеет собственного протокола. репликатор просто подключается к двум базам данных в качестве клиента, затем читает с одного и записывает в другой. Принудительная репликация считывает локальные данные и обновляет удаленную БД; репликация по запросу-наоборот.

  • забавный факт 1: репликатор на самом деле является независимым приложением Erlang, в своем собственном процессе. Он подключается к оба дивана, затем считывает записи с одного и записывает их на другой.
  • забавный факт 2: в CouchDB имеет не знал кто является обычным клиентом и кто является репликатором (не говоря уже о том, является ли репликация push или pull). Все это выглядит как клиентские соединения. Некоторые из них читали записи. Некоторые из них пишут отчеты.

все вытекает из модели данных

алгоритм репликации тривиален, неинтересен. Один дрессированная обезьяна могла бы его спроектировать. Это просто, потому что ум-это модель данных, которая имеет следующие полезные характеристики:

  1. каждая запись в CouchDB полностью независима от всех остальных. Это отстой, если вы хотите сделать JOIN или транзакция, но это потрясающе, если вы хотите написать репликатор. Просто выяснить, как реплицировать один и повторить для каждой записи.
  2. как и Git, записи имеют история изменений связанного списка. Идентификатор ревизии записи - это контрольная сумма ее собственных данных. Последующие идентификаторы ревизий представляют собой контрольные суммы: новых данных плюс идентификатор предыдущей ревизии.
  3. В дополнение к данным приложения ({"name": "Jason", "awesome": true}), каждая запись хранит эволюционную шкалу всех предыдущих идентификаторов версий, ведущих к себе.

    • упражнение: возьмите момент Тихого размышления. Рассмотрим любые две разные записи, A и B. Если A идентификатор ревизии появляется на временной шкале B,затем B определенно эволюционировал от A. Теперь рассмотрим быстрые слияния Git. Ты слышишь это? Это звук того, как ваш ум взрывается.
  4. Git на самом деле не линейный список. Он имеет вилки, когда один родитель имеет несколько детей. У CouchDB это тоже есть.

    • упражнение: сравните две разные записи, A и B. идентификатор ревизии A не отображается на временной шкале B; однако один идентификатор редакции, C, находится в и временная шкала A и B. Таким образом, A не эволюционировал от B. B не эволюционировал от A. Но, скорее, A и B имеют общего предка C. В Git это "вилка"."В CouchDB, это "конфликт."

    • в Git, если оба ребенка продолжают развивать свои временные рамки независимо, это круто. Форкс полностью поддерживает это.

    • в CouchDB, если оба ребенка продолжают развивать свои временные рамки независимо, это тоже круто. Рознь полностью поддерживаю.
    • забавный факт 3: CouchDB " конфликты "не соответствуют git" конфликты."Диван конфликт-это различные пересмотр истории, что в Git "вилка."По этой причине сообщество CouchDB произносит "конфликт" с тихим n: "со-щелкнул."
  5. Git также имеет слияния, когда у одного ребенка есть несколько родителей. CouchDB вроде есть что тоже.

    • в модели данных, нет слияния. клиент просто отмечает одну временную шкалу как удаленную и продолжает работать с единственной существующей временной шкалой.
    • в приложения, это похоже на слияние. как правило, клиент сливает сведения из каждой шкале в зависимости от приложения. Затем он пишет Новое сведения к временной шкале. В Git это похоже на копирование и вставку изменений из ответвление A в ветвь B, затем фиксация на ветви B и удаление ветви A. сведения был слит, но не было git merge.
    • эти поведения различны, потому что в Git важна сама временная шкала; но в CouchDB данные важны, а временная шкала случайна-она просто поддерживает репликацию. Это одна из причин, по которой встроенный пересмотр CouchDB не подходит для хранения данных ревизии, таких как wiki страница.

конечные ноты

по крайней мере одно предложение в этой записи (возможно, это одно) является полным BS.

спасибо Джейсон за отличный обзор! Йенс Alfke, кто работает на TouchDB и его репликации информационная, и (неофициально) описано алгоритм репликации CouchDB сам, если вас интересуют технические детали того, как работает "стандартный" протокол репликатора CouchDB.

чтобы суммировать шаги, которые он изложил:

  1. выяснить, как далеко любая предыдущая репликация получила
  2. получить исходную базу данных _changes после этого
  3. использовать revs_diff на пакет изменений, чтобы увидеть, какие необходимы на цели
  4. скопируйте все отсутствующие метаданные ревизии и текущие данные документа + вложения из источника в цель, разместив в bulk_docs как для оптимизации, так и для хранения документов иначе, чем обычная обработка MVCC более высокого уровня делает на PUT.

Я замалчивал здесь многие детали и рекомендовал бы прочитать оригинальное объяснение также.

The документация для CouchDB v2.0. 0 охватывает алгоритм репликации гораздо более широко. У них есть диаграммы, пример промежуточных ответов и пример ошибок. Они используют "должен", "Должен" и т. д. язык IETF RFC.

специфика для 2.0.0 (все еще не выпущена по состоянию на январь 2016 года) немного отличается от 1.x, но основы все еще как описал @natevw.

At Apache CouchDB Conf 2013, Бенджамин Янг представил replication.io в его репликация, FTW! говорить. Это постоянная попытка определить, и в конечном итоге mint, спецификацию для репликации на основе HTTP master-master.

Это также задокументировано здесь:http://www.dataprotocols.org/en/latest/couchdb_replication.html, Ну, вроде того.