Apache CouchDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:20, 5 июня 2018.
Apache CouchDB
CouchDB logo.png
CouchDB screenshot.png
База данных пользователя в продукте CouchDB
Создатели: Дамиен Кац, Джен Ленард, Ноа Слэйтер, Кристофер Ленц, Дж. Крис Андерсон, Пол Дэвис, Адам Коколоски, Джейсон Дэвис, Бенуа Шено, Филипп Манана, Роберт Ньюсен.
Разработчики: Apache Software Foundation
Выпущена: 2005
Постоянный выпуск: 2.1.1/ ноябрь 7, 2017.
Состояние разработки: Активный
Написана на: Erlang
Операционная система: Кросс-платформенная
Тип ПО: Документно-ориентированная база данных
Лицензия: Apache license 2.0
Веб-сайт couchdb.apache.org

CouchDB — документоориентированная система управления базами данных с открытым исходным кодом, не требующая описания схемы данных. Данный продукт написан на языке Erlang и распространяется свободно. Первый релиз состоялся в 2005 году. В 2008 CouchDB стал проектом фонда Apache Software Foundation.

История

Couch – это сокращение от «Сluster Of Unreliable Commodity Hardware». Проект CouchDB был создан в апреле 2005 года Дэмиеном Кацем, бывшим разработчиком Lotus Notes в IBM. Он сам финансировал проект в течение почти двух лет и выпустил его как проект с открытым исходным кодом по стандартной общественной лицензии GNU.[Источник 1]

В феврале 2008 года данный продукт стал проектом Apache Incubator и был предложен по лицензии Apache. Через несколько месяцев он приобрел статус проекта верхнего уровня. Первая стабильная версия продукта была выпущена в июле 2010 года.

В начале 2012 года Кац покинул проект, чтобы сосредоточиться на проекте Couchbase Server.

После ухода Каца работа над проектом Apache CouchDB продолжилась, в апреле 2012 года была выпущена версия 1.2, а в апреле 2013 - версия 1.3. В июле 2013, сообщество СouchDB совместило его кодовую базу с BigCouch, и с кластерной версией СouchDB Сloudant в рамках проекта Apache. Кластерная платформа BigCouch включена в текущую версию продукта.

Встроенная кластеризация поддерживается в версии 2.0.0., а новый сервер запросов Mango предоставляет простой способ выполнения запросов CouchDB без JavaScript или MapReduce.

Общее

Доступ к БД производится при помощи протокола HTTP с использованием RESTful JSON API, что позволяет обращаться к данным в том числе из выполняемых в браузере web-приложений. В качестве единицы хранения данных выступает документ, имеющий уникальный идентификатор, версию, и содержащий произвольный набор именованных полей в формате ключ/значение. Для организации псевдо-структурированного набора данных из произвольных документов (агрегирования и формирования выборок) применяется концепция формирования представлений (view), для определения которых используется язык JavaScript. На JavaScript также можно определять функции для проверки корректности данных при добавлении новых документов в рамках определенного представления. [Источник 2]

В отличие от других подобных продуктов, CouchDB хранит данные не в таблицах, а в формате упорядоченного списка. Он способен производить частичную репликацию данных между несколькими БД в режиме «мастер-мастер» с одновременным обнаружением и разрешением конфликтных ситуаций. Каждый сервер хранит свой локальный набор данных, синхронизированный с другими серверами, которые могут переводиться в offline-режим и периодически реплицировать изменения. В частности, данная возможность делает CouchDB привлекательным решением для организации синхронизации настроек программ между разными компьютерами. Решения на базе CouchDB внедрены в таких компаниях как BBC, Apple и CERN.

Особенности

  • ACID – семантика.

CouchDB поддерживает ACID–семантику (модель построения языка, обладающую совокупностью свойств и функций, обеспечивающих корректность работы системы даже в случае ошибок, сбоев питания и т.п.). [Источник 3]

  • Работа в offline

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

  • Распределенная архитектура с репликацией

CouchDB был cконструирован с возможностью двунаправленной репликации (или синхронизацией). Это означает, что несколько копий одних и тех же данных могут иметь собственные копии, изменять их, а потом синхронизировать эти изменения.

  • Хранение документов

CouchDB хранит документы, как одну или несколько пар полей/значений, представленных как коллекция документов JSON. Значения полей могут быть простыми элементами (такими как строки, числа или даты), но также могут использоваться упорядоченные списки и ассоциативные массивы. В базе данных CouchDB не требуется схема описания данных, а каждый документ имеет уникальный идентификатор.

Все элементы имеют уникальный URI, доступ к которому предоставляется через HTTP. Он использует методы HTTP POST, GET, PUT и DELETE для четырех основных операций CRUD (Create, Read, Update, Delete) на всех ресурсах. CouchDB также предлагает встроенный интерфейс администрации, доступный через вызываемую сеть Futon.

Архитектура

Подобно иным документно-ориентированным СУБД (Mnesia, Lotus Notes, MongoDB) и в отличие от реляционных СУБД, CouchDB предназначена для работы с полуструктурированной информацией и имеет следующие особенности:

  • данные сохраняются не в строках и колонках, а в виде JSON-подобных документов, моделью которых является не таблицы, а деревья;
  • типизация элементов данных, то есть сопоставление отдельным полям документов типов INTEGER, DATE и пр., не поддерживается — вместо этого пользователь может написать функцию-валидатор;
  • целостность базы данных обеспечивается исключительно на уровне отдельных записей (но не на уровне связей между ними);
  • связи между таблицами или записями принципиально не поддерживаются, соответственно операция объединения (JOIN) между таблицами не определена;
  • для построения индексов и выполнения запросов используются функции представления (view);
  • функции-валидаторы, функции-представления, функции-фильтры сохраняются в текстовом виде в самой базе данных;
  • эти функции, как правило, написаны на языках JavaScript или Erlang, а для их выполнения запускается отдельный сервер запросов, взаимодействие с которым происходит посредством сокетов и текстового JSON-протокола;
  • каждой базе данных в системе CouchDB соответствует единственное B-дерево (не путать с двоичным деревом);
  • каждое B-дерево хранится в виде отдельного файла на диске;
  • одновременно может быть запущено несколько потоков для чтения базы данных и только один — для записи;
  • целостность базы данных обеспечивается только при записи данных на диск;
  • представления хранятся в БД и их индексы обновляются непрерывно, однако при каждом обновлении функций представления или отображения обновляется всё B-дерево целиком;
  • при обработке данных с помощью функций-представлений используется упрощённая модель технологии MapReduce, что позволяет производить параллельные вычисления, в том числе и на многоядерном процессоре;
  • распределение вычислений на несколько узлов не поддерживается — вместо этого используется механизм репликации;
  • обработка данных с помощью цепочки последовательных функций MapReduce не поддерживается;
  • поддерживается вертикальное масштабирование;
  • внешний интерфейс (API) к данной СУБД построен на основе архитектуры REST, то есть сама база данных, отдельные записи, отображения и запросы — суть ресурсы, которые имеют уникальный адрес (URL) и поддерживают операции GET, PUT, POST, DELETE;
  • поэтому для взаимодействия с базой данных было написано много клиентских библиотек, в том числе на таких языках: JavaScript, PHP, Ruby, Python и Erlang;
  • взаимодействие между отдельными компонентами СУБД, то есть с серверами представлений осуществляется опять-таки с помощью текстового протокола, а данные передаются в формате JSON; это позволило использовать различные языки программирования для написания этих компонентов — Java, Python, JavaScript и пр.

Масштабирование

Одна из ключевых и самых интересных особенностей CouchDB — его репликации. CouchDB поддерживает как master/slave, так и master/master репликации.

Master-slave

Является наиболее распространенной архитектурой баз данных, когда имеется более одного cервера базы данных. В отношениях master-slave существует одна база данных, которая выполняет роль ведущего, а остальные базы данных выступают в качестве её подчиненного. Это означает, что:

  • Приложение будет подключаться к мастер для обновления данных
  • Затем данные будут пульсировать через подчиненные устройства, пока все данные не будут согласованы на серверах

В простейшей реализации эта конфигурация позволяет писать на главный сервер, а когда вы делаете запросы или читаете, вы можете подключиться к подчиненному. Эта практика помогает уменьшить нагрузку и количество подключений к любому одному серверу. На практике, здесь имеется небольшой недостаток. Если главный сервер по какой-либо причине отключится, данные по-прежнему будут доступны через slave, но обновление данных станет невозможным.

Master-master

Репликация master-master уникальна тем фактом, что не существует постоянной базы данных master; каждый сервер базы данных может выступать в роли мастера одновременно с другими серверами. В какой-то момент все ведущие синхронизируются, чтобы убедиться, что они все имеют правильные и обновленные данные. Репликация master-master позволяет:

  • В случае сбоя одного ведущего сервера другие серверы баз данных могут нормально функционировать и забирать слабину. Когда сервер базы данных снова подключится к сети, он догонит остальных, используя репликацию.
  • Мастера могут размещаться на нескольких физических серверах и ​​могут быть распределены по сети.

Проблемой такой репликации в реляционных базах данных являются потенциальные конфликты. Поэтому CouchDB (обладающий свойством MVCC (multiversion concurrency control)), при возникновении конфликта сохраняет все конфликтующие версии и умеет эти конфликты разрешать, по сконфигурированным правилам (либо отдать это дело в руки вашего приложения — как вы захотите этим воспользоваться, зависит только от вашей фантазии)

Понятие View

В CouchDB можно определять view. View — это функции, которые могут быть написаны на любом языке программирования, которые получают на вход все документы из БД по очереди и выбирают некоторые из них по какому-либо условию. По умолчанию функции пишутся на Javascript, но можно писать на PHP, Python и других языках).

View хранятся в CouchDB в виде документов, как и обычные данные. Каждый документ, хранящий view, может содержать в себе неограниченное количество view-функций, это своего рода способ группировать view-функции. Обычно в один документ помещаются функции, возвращающие похожие наборы данных.

Практический пример

Рассмотрим пример запроса, возвращающего всех пользователей из БД. Т.к. документов может быть много, чтобы их кластеризовать, целесообразно ввести свойство type в документы, которое для документов, хранящих информацию о пользователях, будет type = "user", что мы и используем при выборке:

function ( doc )
{
      if ( doc.type == 'user' )
      {
          emit( doc._id, doc._id );
      }
}

Эта простая функция, которая получает по очереди каждый из документов, и те, у которых свойство type="user" передает в специальную функцию emit(). Функция emit получает в качестве аргументов пару ключ-значение и создает индекс из полученных ключей.

Ключ может быть любого типа, не обязательно id и целое число, как здесь, об этом будет несколько слов чуть ниже. В результате данная функция возвратит ID всех пользователей, что достаточно для выборки конкретных user-документов по их ID в дальнейшем.

Возвращаемые view данные всегда сортируются по ключу.

Установка

Debian / Ubuntu

Cтавим зависимости:

sudo apt-get update
sudo apt-get --no-install-recommends -y install \
build-essential pkg-config runit erlang \
libicu-dev libmozjs185-dev libcurl4-openssl-dev

Скачиваем архив с исходным кодом:

wget http://apache-mirror.rbc.ru/pub/apache/couchdb/source/2.0.0/apache-couchdb-2.0.0.tar.gz

Распаковываем архив:

tar -xvzf apache-couchdb-2.0.0.tar.gz

Переходим в папку с исходным кодом:

 cd apache-couchdb-2.0.0/

Конфигурируем и собираем:

 ./configure && make release

Создаем пользователя couchdb:

sudo adduser --system \
        --no-create-home \
        --shell /bin/bash \
        --group --gecos \
        "CouchDB Administrator" couchdb

Копируем rel/couchdb в домашний каталог пользователя и выставляем правильные права:

    sudo cp -R rel/couchdb /home/couchdb
    sudo chown -R couchdb:couchdb /home/couchdb
    sudo find /home/couchdb -type d -exec chmod 0770 {} \;
    sudo sh -c 'chmod 0644 /home/couchdb/etc/*'

Проверяем, что все было сделано правильно:

sudo -i -u couchdb /home/couchdb/bin/couchdb

На http://localhost:5984 должно выводиться:

{
  "couchdb": "Welcome",
  "version": "2.0.0",
  "vendor": {
    "name": "The Apache Software Foundation"
  }
}

Windows

Для Windows предусмотрен инсталлер[Источник 4]

Пример настройки репликации

Cоздание docker образа

Здесь приведено описание создание docker образа с Apache CouchDB 2.0 на базе образа ubuntu:latest.

Запускаем контейнер с ubuntu:

$ docker run -i -t ubuntu 

Обновляем индекс пакетов:

# apt update

Устанавливаем couchdb, как описано выше. Затем в файле /home/couchdb/etc/default.ini в разделе [chttpd] меняем

    bind_address = 127.0.0.1

На

    bind_address = 0.0.0.0

Выходим из контейнера. Смотрим его id через docker ps. Затем создаём образ на основе этого контейнера

# docker commit   "id контейнера"  couchdb2  

Настройка нод

Запускаем образ couchdb2, привязывая порт 5984 контейнера к 8001 порту хоста:

$  docker run -i -t -p 8001:5984 couchdb2


Переходим в другой терминал, через docker ps смотрим id, только что созданного контейнера. Затем переименовываем его в node1:

$  docker rename  "id контейнера"  node1

Возвращаемся в первый терминал и запускаем couchdb:

$  /home/couchdb/bin/couchdb

Открывем в браузере localost:8001/_utils . На появившейся странице переходим по вкладке "Setup". Далее переходим на "Configure Single Node". Вводим желаемые логин и пароль и нажимаем "Configure Node".

На основе образа couchdb2 создам ещё два контейнера, у которых порт 5984 привязан к портам 8002 и 8003 хоста. Переименовываем их в node2 и node3. Далее выполняем те же действия, что и с node1.

Затем заходим на localost:8001/_utils переходим на вкладку Databases и создаём базу test_db

Настройка репликации

Выполняем

 docker network inspect bridge

чтобы узнать ip адрес контейнера node1.

Затем открываем в браузере 127.0.0.1:8002/_utils, переходим на вкалдку с базами данных и добавляем в базу _replicstor документ

{
  "_id": "rep",
  "source": "http://ip адрес node1:5984/test_db",
  "target": "http://логин:пароль@127.0.0.1:5984/test_db",
  "create_target": true,
  "continuous": true,
}

После добавления данного документа в базу replicator произойдёт синхронизация базы данных target с базой source. Параметр "continuous": true означает, что эта синхронизация будет производиться постоянно через определённые промежутки времени. Параметр create_target": true нужен чтобы база target была создана, если она не существует.

Аналогичные действия нужно сделать и на 127.0.0.1:8003/_utils.

Для проверки работы репликации можно добавить какой-либо документ в базу test_db на node1 и проверить появится ли он на остальных узлах.

Компоненты с открытым исходным кодом

CouchDB включает в себя ряд других проектов и компонентов с открытым исходным кодом.

Компонент Описание Лицензия
Erlang Erlang – это универсальный язык программирования. Последовательное подмножество Erlang - это функциональный язык с точным расчетом и динамической типизацией. Apache 2.0 (Релиз 18.0 и более поздние)
Публичная лицензия Erlang (Ранние релизы)
International Components for Unicode International Components for Unicode (ICU) - это проект с открытым исходным кодом, улучшенным кодом библиотек С++ и Java для поддержки Unicode, интернационализацией и глобализацией программного обеспечения. Лицензия Unicode
jQuery jQuery – это нетребовательная, кроссбраузерная библиотека JavaScript, которая осуществляет взаимодействие между JavaScript и HTML. Лицензия MIT
OpenSSL OpenSSL является проектом с открытым исходным кодом, реализующим протоколы SSL и TLS. Основная библиотека (написанная на языке C) реализует основные криптографические операции и предоставляет различные служебные функции. Apache 1.0 и лицензия BSD
SpiderMonkey SpiderMonkey - это JavaScript-движок, поддерживаемый Mozilla Foundation. Он содержит интерпретируемый язык программирования, jit-компилятор и сборщик мусора. MPL 2.0

Использование CouchDB

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

CouchDB хорошо подходит для приложений с накапливающимися и время от времени изменяющимися данными, на которых должны выполняться предопределенные запросы и где важно управление версиями (например для cистем управления взаимоотношениями с клиентами (CRM), сиcтем управления содержимым (CMS)).

На сегодняшний день CouchDB используют:

  • Amadeus IT Group, в некоторых серверных системах;
  • Meebo, для их социальной платформы (веб и приложения). Meebo был приобретен Google, и закрыт 12 июля 2012 г;
  • Npm, для их реестра пакетов;
  • Sophos, для некоторых серверных систем;
  • BBC, для своих динамических контентных платформ;
  • Canonical использовали CouchDB для своего сервиса "Ubuntu One", в период с 2009 по ноябрь 2011;
  • CANAL+ для своей международной портативной платформы CANAL+ Overseas;
  • Commusoft, для управления автономными мобильными данными;
  • Muzzley, для своего основного хранилища данных.

Источники

  1. Apache CouchDB // Wikipedia[2001-2018] / URL:https://en.wikipedia.org/wiki/CouchDB (дата обращения: 30.04.2018).
  2. CouchDB сегодня // habr (электронный ресурс) / URL:https://habr.com/post/101251/ (дата обращения: 30.04.2018)
  3. Apache CouchDB // Data where you need it. / URL:http://couchdb.apache.org/ (дата обращения: 30.04.2018).
  4. Installing on Windows // CouchDB wiki / URL: http://wiki.apache.org/couchdb/Installing_on_Windows?action=show&redirect=InstallingOnWindows (дата обращения: 24.05.2018)

Ссылки