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

Подход Реализована в рамках подхода NoSQL. Для хранения данных используется JSON, для реализации MapReduce-запросов — JavaScript. Возможно написание любой логики на Erlang. Одной из особенностей СУБД является поддержка репликации с несколькими ведущими узлами.

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

Следуя подходу NoSQL, CouchDB не хранит данные и связи в таблицах. Вместо этого каждая база данных — набор независимых документов. Каждый документ содержит свои собственные данные и независимую схему. Приложение может получить доступ к нескольким базам данных, например, хранящейся на мобильном телефоне пользователя и на сервере. Метаданные документа содержат информацию о версии, позволяя объединять данные и разрешать любые противоречия, которые могли появиться в момент, когда базы данных были разъединены.

Для управления конкурентным доступом используется механизм MVCC, благодаря чему возможно избежать необходимости блокировки файла базы данных во время записи. Разрешение конфликтов относится к сфере ответственности логики приложения, разрешение конфликта обычно включает в себя объединение данных в один документ, а затем старый документ удаляется.

Архитектура системы Подобно иным документно-ориентированным СУБД (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 Плагин для jQuery, PHP, Ruby, Python и Erlang; взаимодействие между отдельными компонентами СУБД, то есть с серверами представлений осуществляется опять-таки с помощью текстового протокола, а данные передаются в формате JSON; это позволило использовать различные языки программирования для написания этих компонентов — Java, Python, JavaScript и пр.

История Проект CouchDB создал бывший работник Lotus Notes в IBM Дамьен Кац (Damien Katz) в апреле 2005 года, автор определил проект как «систему хранения для крупномасштабной объектной базы данных». Его идеей для базы данных была база данных для интернета, которая должна была быть написана с нуля до сервера веб-приложений. Он самофинансировал проект в течение почти двух лет и выпустил его как проект с открытым исходным кодом под лицензией GNU GPL.

Проект CouchDB был принят в инкубатор Apache в феврале 2008 года. Несколькими месяцами позже проект перешёл в статус проекта верхнего уровня, что привело к появлению стабильной версии в июле 2010 года. Несмотря на то, что CouchDB изначально предназначался для работы в операционной системе Linux, также разработаны варианты этой системы для операционных систем Microsoft Windows и Mac OS. Более того, дистрибутив Linux Ubuntu с 9.10 (Karmic Koala) поставляется с системой CouchDB.

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

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

Использование CouchDB CouchDB используется во многих программных продуктах и на множестве веб-сайтов, в том числе: UbuntuOne, Firefox, TomBoy, Akonadi, Evolution — для синхронизации адресов, заметок и закладок. Mozilla Raindrop — агрегатор сообщений электронной почты, социальных сетей, систем обмена мгновенными сообщениями (Skype, Jabber). BBC — для динамического контента. Credit Suisse — для внутреннего использования в отделе товаров. Meebo — для социальной платформы (веб и приложений) — Meebo была приобретена Google и закрыта 12 июля 2012 г. Больше примеров доступно на wiki проекта Apache.

Управление данными CouchDB управляет коллекцией документов JSON. Документы организуются по представлениям (). Представления определяются агрегатными функциями и фильтрами, вычисленными параллельно подобно MapReduce.

Представления хранятся в базе данных, и их индексы обновляются непрерывно. CouchDB поддерживает систему представления, которая использует внешние сокет-серверы и протокол, основанный на JSON. Как следствие, серверы представления были разработаны на множестве языков (JavaScript — по умолчанию, но есть также PHP, Ruby, Python и Erlang).

Доступ по HTTP Приложения взаимодействуют с CouchDB через HTTP. Ниже представлено несколько примеров с использованием утилиты командной строки cURL. Эти примеры предполагают, что CouchDB работает на localhost (127.0.0.1) на порту 5984.

Действие Запрос Ответ Доступ к информации о сервере curl http://127.0.0.1:5984/ { "couchdb": "Welcome", "version":"1.1.0" } Создание базы данных под именем wiki curl -X PUT http://127.0.0.1:5984/wiki {"ok": true} Попытка создать вторую базу данных под названием wiki curl -X PUT http://127.0.0.1:5984/wiki { "error":"file_exists", "reason":"The database could not be created, the file already exists." } Получаем информацию о базе данных wiki curl http://127.0.0.1:5984/wiki { "db_name": "wiki", "doc_count": 0, "doc_del_count": 0, "update_seq": 0, "purge_seq": 0, "compact_running": false, "disk_size": 79, "instance_start_time": "1272453873691070", "disk_format_version": 5 } Удаление базы данных wiki curl -X DELETE http://127.0.0.1:5984/wiki {"ok": true} Создаем документ, прося CouchDB, чтобы предоставил id документа curl -X POST -H "Content-Type: application/json" --data \ '{ "text" : "Wikipedia on CouchDB", "rating": 5 }' \ http://127.0.0.1:5984/wiki { "ok": true, "id": "123BAC", "rev": "946B7D1C" }

Компоненты с открытым исходным кодом CouchDB включает много дополнительных компонентов с открытым исходным кодом как часть его пакета по умолчанию, в частности, в пакет входят JavaScript-движок SpiderMonkey, кроссбраузерная JavaScript-библиотека jQuery, библиотека поддержки Юникода ICU, OpenSSL, дистрибутив языка программирования Erlang.

Примечания

Литература

Ссылки

Категория:Документоориентированные СУБД Категория:Свободные СУБД Категория:Свободное программное обеспечение, написанное на Erlang Категория:Программное обеспечение с лицензией Apache Категория:NoSQL