Русская Википедия:CouchDB
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)[1];
- функции-валидаторы, функции-представления, функции-фильтры сохраняются в текстовом виде в самой базе данных;
- эти функции, как правило, написаны на языках JavaScript или Erlang, а для их выполнения запускается отдельный сервер запросов, взаимодействие с которым происходит посредством сокетов и текстового JSON-протокола;
- каждой базе данных в системе CouchDB соответствует единственное B-дерево (не путать с двоичным деревом);
- каждое B-дерево хранится в виде отдельного файла на диске;
- одновременно может быть запущено несколько потоков для чтения базы данных и только один — для записи;
- целостность базы данных обеспечивается только при записи данных на диск;
- представления хранятся в БД и их индексы обновляются непрерывно, однако при каждом обновлении функций представления или отображения обновляется всё B-дерево целиком;
- при обработке данных с помощью функций-представлений используется упрощённая модель технологии MapReduce, что позволяет производить параллельные вычисления, в том числе и на многоядерном процессоре;
- распределение вычислений на несколько узлов не поддерживается — вместо этого используется механизм репликации;
- обработка данных с помощью цепочки последовательных функций MapReduce не поддерживается;
- поддерживается вертикальное масштабирование;
- внешний интерфейс (API) к данной СУБД построен на основе архитектуры REST, то есть сама база данных, отдельные записи, отображения и запросы — суть ресурсы, которые имеют уникальный адрес (URL) и поддерживают операции GET, PUT, POST, DELETE;
- поэтому для взаимодействия с базой данных было написано много клиентских библиотек, в том числе на таких языках: JavaScript[2], 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[3] и 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 используется во многих программных продуктах и на множестве веб-сайтов[4], в том числе:
- UbuntuOne, Firefox, TomBoy, Akonadi, Evolution — для синхронизации адресов, заметок и закладок[5].
- Mozilla Raindrop — агрегатор сообщений электронной почты, социальных сетей, систем обмена мгновенными сообщениями (Skype, Jabber)[6].
- BBC — для динамического контента.
- Credit Suisse — для внутреннего использования в отделе товаров.
- Meebo — для социальной платформы (веб и приложений) — Meebo была приобретена Google и закрыта 12 июля 2012 г.
Больше примеров доступно на wiki проекта Apache.
Управление данными
CouchDB управляет коллекцией документов JSON. Документы организуются по представлениям (Шаблон:Lang-en). Представления определяются агрегатными функциями и фильтрами, вычисленными параллельно подобно 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.
Примечания
Литература
Ссылки
Шаблон:Apache Шаблон:СУБД Шаблон:Databases
- Страницы с устаревшим атрибутом подсветки синтаксиса «enclose»
- Русская Википедия
- Документоориентированные СУБД
- Свободные СУБД
- Свободное программное обеспечение, написанное на Erlang
- Программное обеспечение с лицензией Apache Software License
- NoSQL
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Википедия
- Статья из Википедии
- Статья из Русской Википедии