CouchDB
Apache CouchDB | |
---|---|
![]() | |
![]() | |
Тип | документо-ориентированная СУБД |
Автор | Дамьен Кац (Damien Katz) |
Разработчик | Apache Software Foundation |
Написана на | Erlang[2][3], JavaScript[3], C++[3] и Си[3] |
Операционные системы | Linux, Windows и macOS |
Первый выпуск | 2005 |
Последняя версия | |
Репозиторий | github.com/apache/couchdb |
Состояние | активное |
Лицензия | Apache License 2.0[4] |
Сайт | couchdb.apache.org (англ.) |
![]() |
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)[5];
- функции-валидаторы, функции-представления, функции-фильтры сохраняются в текстовом виде в самой базе данных;
- эти функции, как правило, написаны на языках JavaScript или Erlang, а для их выполнения запускается отдельный сервер запросов, взаимодействие с которым происходит посредством сокетов и текстового JSON-протокола;
- каждой базе данных в системе CouchDB соответствует единственное B-дерево (не путать с двоичным деревом);
- каждое B-дерево хранится в виде отдельного файла на диске;
- одновременно может быть запущено несколько потоков для чтения базы данных и только один — для записи;
- целостность базы данных обеспечивается только при записи данных на диск;
- представления хранятся в БД и их индексы обновляются непрерывно, однако при каждом обновлении функций представления или отображения обновляется всё B-дерево целиком;
- при обработке данных с помощью функций-представлений используется упрощённая модель технологии MapReduce, что позволяет производить параллельные вычисления, в том числе и на многоядерном процессоре;
- распределение вычислений на несколько узлов не поддерживается — вместо этого используется механизм репликации;
- обработка данных с помощью цепочки последовательных функций MapReduce не поддерживается;
- поддерживается вертикальное масштабирование;
- внешний интерфейс (API) к данной СУБД построен на основе архитектуры REST, то есть сама база данных, отдельные записи, отображения и запросы — суть ресурсы, которые имеют уникальный адрес (URL) и поддерживают операции GET, PUT, POST, DELETE;
- поэтому для взаимодействия с базой данных было написано много клиентских библиотек, в том числе на таких языках: JavaScript[6], 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[7] и 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 используется во многих программных продуктах и на множестве веб-сайтов[8], в том числе:
- UbuntuOne, Firefox, TomBoy, Akonadi, Evolution — для синхронизации адресов, заметок и закладок[9].
- Mozilla Raindrop — агрегатор сообщений электронной почты, социальных сетей, систем обмена мгновенными сообщениями (Skype, Jabber)[10].
- BBC — для динамического контента.
- Credit Suisse — для внутреннего использования в отделе товаров.
- Meebo — для социальной платформы (веб и приложений) — Meebo была приобретена Google и закрыта 12 июля 2012 г.
Больше примеров доступно на wiki проекта Apache.
Управление данными
[править | править код]CouchDB управляет коллекцией документов JSON. Документы организуются по представлениям (англ. views). Представления определяются агрегатными функциями и фильтрами, вычисленными параллельно подобно 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.
Примечания
[править | править код]- ↑ Release 3.3.3 — 2023.
- ↑ The couchdb Open Source Project on Open Hub: Languages Page — 2006.
- ↑ 1 2 3 4 https://projects.apache.org/json/projects/couchdb.json
- ↑ https://couchdb.apache.org/
- ↑ Серверы представлений: документация . Дата обращения: 12 февраля 2010. Архивировано из оригинала 20 октября 2008 года.
- ↑ [https://web.archive.org/web/20100218055610/http://plugins.jquery.com/project/jqcouch Архивная копия от 18 февраля 2010 на Wayback Machine Плагин для jQuery]
- ↑ CouchdDB: Windows binary installer . Дата обращения: 13 февраля 2010. Архивировано из оригинала 26 декабря 2011 года.
- ↑ Проекты использующие CouchDB . Дата обращения: 12 февраля 2010. Архивировано из оригинала 20 июля 2017 года.
- ↑ Integrating CouchDB with Ubuntu One: Full Specification . Дата обращения: 13 февраля 2010. Архивировано 2 марта 2021 года.
- ↑ Raindrop Software Architecture . Дата обращения: 13 февраля 2010. Архивировано 6 июля 2010 года.
Литература
[править | править код]- Anderson, J. Chris; Slater, Noah; Lehnardt, Jan (2009-11-15), CouchDB: The Definitive Guide (1st ed.), O'Reilly Media, p. 300, ISBN 0596158165 Архивная копия от 14 июля 2011 на Wayback Machine
- Lennon, Joe (2009-12-15), Beginning CouchDB (1st ed.), Apress, p. 300, ISBN 1430272376, Дата обращения: 12 февраля 2010 Архивная копия от 5 декабря 2010 на Wayback Machine
Ссылки
[править | править код]- couchdb.apache.org — официальный сайт CouchDB