Что такое протокол репликации CouchDB? Это как Git?

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

каков основной обзор репликации CouchDB? Что в нем примечательного?

5 ответов


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

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

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

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

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

  • забавный факт 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, находится в и и график "Б". Таким образом, а не эволюционировало из в. б не эволюционировало из А. а скорее, А и В имеют общего предка С. В Git, то есть "вилку"."В CouchDB это" конфликт."

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

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

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

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

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


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

В итоге действия он отметил:

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

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


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

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


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


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