Что такое протокол репликации CouchDB? Это как Git? - PullRequest
64 голосов
/ 22 января 2011

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

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

Ответы [ 5 ]

131 голосов
/ 22 января 2011

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

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

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

Если вы знаете Git, то знаете, как работает репликация Couch. Репликация очень похожа на передачу или извлечение с распределенными менеджерами исходного кода, такими как Git.

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

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

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

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

  1. Каждая запись в CouchDB полностью независима от всех остальных.Это отстой, если вы хотите сделать JOIN или транзакцию, но это здорово, если вы хотите написать репликатор.Просто выясните, как реплицировать одну запись, а затем повторите это для каждой записи.
  2. Как и в Git, записи имеют историю изменений связанного списка.ID ревизии записи - это контрольная сумма ее собственных данных.Последующие идентификаторы редакции представляют собой контрольные суммы: новых данных плюс идентификатор редакции предыдущего.
  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 "конфликты".Конфликт Couch - это расходящаяся история ревизий, которую Git называет «форком».По этой причине сообщество CouchDB объявляет «конфликт» с тихим n : «co-flicked».
  5. Git также имеет слияния, когда один ребенокимеет несколько родителей.CouchDB вроде также имеет это.

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

Заключительные замечания

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

9 голосов
/ 25 декабря 2012

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

Подводя итог изложенным шагам:

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

Я здесь упущу многие детали и рекомендую прочитать оригинальное объяснение.

4 голосов
/ 21 января 2016

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

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

1 голос
/ 16 декабря 2013

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

0 голосов
/ 30 марта 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...