Couchdb что это
Перейти к содержимому

Couchdb что это

  • автор:

Знакомство с CouchDB

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

Что такое NoSQL?

NoSQL — это специальная концепция, которая позволяет вам быть более раскрепощённым в запросах к БД.

NoSQL [не только SQL] — это концепция, предназначенная для осуществления доступа к группированным данным, не использующая реляционную модель данных. Фундаментальные различия кроются в способе осуществлении доступа и актуализации данных, а также их размещении. Например, когда вы должны были бы хранить данные о каком-то счете, то вам требовалась специальная таблица, работа с которой предусматривала знание особого серверного языка для того, чтобы преобразовать эти данные в реальные объекты. Используя NoSQL, вам нужно хранить только данные о счёте. NoSQL абсолютна не превиредлива к структуре хранения данных, что позволяет вам не заморачиваться насчёт структуры таблиц — вы можете просто начать хранить новые записи.

Продолжим приведённый выше пример. Некоторые счета могут содержать число VAT, другие нет. В обычном привычном подходе, вам необходимо сообщить таблице, что значение этого поля (VAT) может иметь значение, а также может быть равно просто null. В свою очередь, в NoSQL, вы можете сохранить как счета без числа VAT, так и счёт с этим значением — строгой схемы тут нет. Имейте в виду, что NoSQL — не совсем совершенное орудие. Если ваши данные лучше ложатся на реляционную модель, то лучше использовать SQL-ские базы данных, иначе можно потерять много времени и сил.

Запросы в базах данных NoSQL

Принцип MapReducing содержит несколько преимуществ по сравнению с SQL-скими базами данных, потому что элементарные задачи могут выполняться быстрее, чем это происходит в реляционных Системах Управления Базами Данных.

Базы данных, основанные на NoSQL используют маппинг для создания запросов и индексации баз данных. В реляционных СУБД вы выполняете запрос, который соединяет множество таблиц для того, чтобы вытащить пачку данных, а затем с помощью специальных операций преобразовать эти данные во что-то, с чем можно будет работать в дальнейшем. В NoSQL вы используете маппинг для того, чтобы сформировать ‘представление’ (другими словами, набор результатов).

Маппинг, по сути, просто производит извлечение данных, уменьшая их агрегацию. Чем больше вы привыкли к Реляционным Системам Управления Базами Данных, тем непонятней будет для вас этот урок. Ну ничего, надо же как-то освежать свои знания. MapReducing превосходит SQL-запросы, потому что различного рода задачи могут быть распределены между многократными узлами, что является невозможным в Реляционных СУБД. И так далее.

Знакомство с CouchDB

Несколько фактов о CouchDB, которые вам не помешает знать:

CouchDB — это база данных, которая ориентируется на хранение данных в формате JSON, написанная на языке программирования Erlang.

  • Это действительно сильный конкурент на своём рынке, созданный для того, чтобы упростить многие задачи, которые можно будет осуществить на различных устройствах без всяких осложнений.
  • Это очередной представитель баз данных, не базирующихся на SQL запросах.
  • Этот инструмент входит в пакет вместе с проектом Apache.
  • CouchDB позволяет приложениям хранить данные в формате JSON и осуществлять доступ к ним через особый интерфейс.
  • Это новый способ хранения, индексации и осуществления доступа к данным.

Главные преимущества CouchDB

  • JSON документы – все, что вы хотите сохранить в CouchDB должно быть преобразовано к формату JSON.
  • REST интерфейс – все операции, включая вставку данных, в CouchDB осуществляются через HTTP.
  • Множественная репликация – вы можете использовать неограниченное количество ‘устройств’, создавая особенные и неповторимые топологии репликации.
  • Пригодный для офлайнового использования – CouchDB может быть реплицирован к различным устройствам (к примеру, таким, как телефоны Android), которые могут менять данные офлайн, а в последствии, сохранять изменения при помощи специальной системы синхронизации, когда сеть будет снова доступна.
  • Фильтры репликации – вы можете фильтровать данные, которые хотите тиражировать на различные узлы.

Всё в кучу

CouchDB представляет собой следующий виток развития баз данных, разработанных для работы в сети.

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

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

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

Шаг 1 – Установка CouchDB

Самый легкий способ установки CouchDB на вашу систему заключается в том, чтобы перейти на сайт CouchOne (http://www.couchone.com/get) и загрузить установочный файл CouchDB специально для вашей операционной системы — в моём случае это OSX. Загрузите zip файл, распакуйте его и поместите CouchDBX в папку приложения.

Далее запускаем CouchDBX.

Шаг 2 – Добро пожаловать в Futon

После того, как вы запустите CouchDB, вы должны увидеть панель управления Futon. Если, по какой-либо причине, осуществить доступ к интерфейсу не удалось, то то же самое можно проделать через ваш браузер. Если вы посмотрите в логи, CouchDBX сообщит вам, что CouchDB был запущен по адресу http:// 127.0.0.1:5984/ (может отличаться на вашей системе). Откройте браузер и зайдите на адрес http://127.0.0.1:5984/_utils/, после чего вы должны увидеть Futon.

Оставшуюся часть урока я будут обращаться к панели управления Futon через Firefox. Для удобства у меня также стоит Firebug и активирована консоль, с помощью которой я могу отслеживать все HTTP запросы, которые Futon будет отправлять. Это очень хорошо, так как ваше приложение может функционировать также, как и Futon. Давайте двинемся вперёд и создадим базу данных, название которой будет mycouchshop.

jQuery плагин CouchDB

Futon фактически использует jQuery плагин, чтобы взаимодействовать с CouchDB. Вы можете найти по адресу http://127.0.0.1:5984/_utils/script/jquery.couch.js (прошу отметить тот момент, что ваш порт может отличаться). Разобрав тот код, вы сможете узнать много интересных вещей, которые позволяют скрипту взаимодействовать с CouchDB.

Шаг 3 – CouchDB и пользователи

По умолчанию CouchDB абсолютно открыт, что даёт возможность каждому пользовательскому администратору права на доступ ко всем базам данных. Это очень удобно для разработки. Давайте двинемся дальше и создадим администратора. В нижнем правом углу вы увидите следующее: «Добро пожаловать в панель администрирования! Все являются администраторами! Исправляйте положение”.

Не медлите и щёлкайте по ссылке fix this, что позволит вам указать имя пользователя и пароль. Эти действия помогут вам создать учетную запись администратора и предоставить анонимный пользовательский доступ к операциям чтения и операциям записи на всех базах данных. Внимание: это не касается операций, проводимых над конфигурацией.

Ещё немного о пользователях

Для CouchDB было бы неблагоразумным создание единственного супер пользователя и предоставление ему прав на чтение и запись.

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

В СouchDB существует встроенная система создания пользователя и авторизации. Вы можете создать пользователей при помощи jQuery плагина, используя $.couch.signup(). Таким образом, вы можете создавать пользователей вашей системы. Пользователи представляют собой те же записи в формате JSON, так что вы можете назначать им любые дополнительные атрибуты, которые вам понадобятся. Например, электронная почта. Для того, чтобы прикрепить одни и те же атрибуты к множеству пользователей, вы можете создать специальные группы в пределах CouchDB.

Шаг 4 – Создание документа

Теперь давайте создадим наш первый документ, используя Futon:

  • Откройте базу данных mycouchshop.
  • Щелкните “New Document”.
  • Щелкните, «Add Field”, чтобы начать добавлять данные к документу JSON. Заметьте, что поле ID уже предварительно создано. Я очень не советую изменять его. Добавьте ключевое «имя» со значением “Nettuts CouchDB Tutorial One”.
  • Убедитесь, что вы отметили галочкой каждый атрибут, чтобы сохранить изменения.
  • Щелкните, «Save Document”.

Теперь поднимитесь на уровень выше, к нашей базе данных.Теперь вы можете увидеть только что созданный документ с некоторыми ключами.

Шаг 5 – Обновление документа

CouchDB — это база данных, в которую можно что-то добавлять — новые обновления, добавленные к базе данных, не перезаписывают старую версию. Каждое новое обновление к документу JSON с существующим ранее ID добавит новую версию обновлённого документа. Для этого используется автоматически вставленный ключ версии:

  • При просмотре содержания базы данных mycouchshop щелкните по единственной доступной записи.
  • Добавьте другой атрибут с ключевым «type» и значением «production».
  • Нажмите “Save Document”.

После сохранения новый ключ версии должен быть равен 2. Возвращаясь к представлению базы данных mycouchshop. Вы по-прежнему должны видеть один документ, т.к. по умолчанию отображается только самая последняя версия.

Версии

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

Шаг 6 – Создание документа, используя cURL

Я уже упомянул, что CouchDB использует REST интерфейс, так что все запросы мы можем просмотреть через консоль в Firebug. Теперь давайте воспользуемся терминалом для того, чтобы создать документ, используя cURL.

Во-первых, давайте создадим документ JSON с содержанием, указанным ниже, и сохраним с именем person.json на рабочий стол.

Затем откройте терминал и выполните команду cd ~/Desktop/, а затем curl -X POST http://127.0.0.1:5984/mycouchshop/ -d @person.json -H «Content-Type: application/json». CouchDB должен был возвратить документ JSON, подобный тому, что вы можете найти ниже.

Это ID и число, представляющее версию вставленного документа. CouchDB использует седующие правила:

  • POST – создает новую запись
  • GET – извлекает записи
  • PUT – обновляет запись
  • DELETE – удаляет запись

Шаг 7 – Просмотр всех документов

Вы можете осуществить проверку вставки нового документа в базу mycouchshop следующим образом: перейдя по адресу curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs.

Шаг 8 – Создание простой функции

Теперь давайте рассмотрим другой способ просмотра всех документов:

  • В пределах Futon щелкните по выпадающему меню и выберите “Temporary View”.
  • Скопируйте код, который вы увидите.
function (doc) < if (doc.type === "product" && doc.name) < emit(doc.name, doc); >>
  • Кликните на run , и вы должны будете увидеть единственный продукт, который мы добавили ранее.
  • Вы также можете сохранить полученное представление.

После создания простой функции мы можем теперь запросить это представление и увидеть, что передаваемое содержание по HTTP, используя следующую команду: curl -X GET http://127.0.0.1:5984/mycouchshop/_design/products/_view/products.

Так мы получаем ID документа и версию по умолчанию.

Шаг 9 – Усложняем ситуацию

Давайте добавим другой продукт к нашей базе данных, предварительно внеся новый ценовой атрибут со значением 1.75 нашему первому продукту.

Для нашего нового представления мы будем использовать следующее. Во-первых:

function (doc) < if (doc.type === "product" && doc.price) < emit(doc.id, doc.price); >>

Вышеупомянутая функция просто проверяет, является ли введенный документ продуктом и есть ли у него цена. Если эти условия соблюдены, то используем следующий код.

function (keys, prices)

Вышеупомянутая функция возвращает цену, используя одну из встроенных функций в CouchDB.

Заключение

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.net.tutsplus.com/tutorials/getting-started-with-couchdb/
Перевел: Станислав Протасевич
Урок создан: 12 Июля 2011
Просмотров: 30466
Правила перепечатки

5 последних уроков рубрики «Разное»

Как выбрать хороший хостинг для своего сайта?

Выбрать хороший хостинг для своего сайта достаточно сложная задача. Особенно сейчас, когда на рынке услуг хостинга действует несколько сотен игроков с очень привлекательными предложениями. Хорошим вариантом является лидер рейтинга Хостинг Ниндзя — Макхост.

Как разместить свой сайт на хостинге? Правильно выбранный хороший хостинг — это будущее Ваших сайтов

Проект готов, Все проверено на локальном сервере OpenServer и можно переносить сайт на хостинг. Вот только какую компанию выбрать? Предлагаю рассмотреть хостинг fornex.com. Отличное место для твоего проекта с перспективами бурного роста.

Разработка веб-сайтов с помощью онлайн платформы Wrike

Создание вебсайта — процесс трудоёмкий, требующий слаженного взаимодействия между заказчиком и исполнителем, а также между всеми членами коллектива, вовлечёнными в проект. И в этом очень хорошее подспорье окажет онлайн платформа Wrike.

Основы CouchDB¶

../../../_images/couchdb.jpg

CouchDB — документо-ориентированная СУБД, в которой удобно хранить разную информацию с изменяющимся количеством параметров. Например сущность товары могут иметь бесконечное количество параметров. Создавать в РСУБД миллионы таблиц или одну огромную не вариант. В couchdb хранятся документы, т.е. простые записи. В записи может быть сколько угодно разных параметров. А для унификации записей обычно создают параметр type который заменяет имя таблицы в РСУБД.

Установка¶

Debian¶

$ sudo apt-get install couchdb

From source¶

$ wget http://erlang.org/download/otp_src_R12B-5.tar.gz $ tar -xvzf otp_src_R12B-5.tar.gz $ cd otp_src_R12B-5 $ ./configure $ sudo make && make install $ wget http://download.filehat.com/apache/incubator/couchdb/0.8.1-incubating/apache-couchdb-0.8.1-incubating.tar.gz $ tar -xvzf apache-couchdb-0.8.1-incubating.tar.gz $ cd apache-couchdb-0.8.1-incubating $ ./configure $ sudo make && make install

MacOS, Android, iOS¶

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

Futon¶

Futon это веб интерфейс для управления CouchDB, что то типа phpmyadmin. После запуска CouchDB появится доступ к Futon по http://127.0.0.1:5984/. Для того что бы увидеть инструменты Futon нужно перейти на http://127.0.0.1:5984/_utils/

../../../_images/couchdb1.png

Все манипуляции с базой происходят через http при помощи REST интерфейса. Поэтому можно пользоваться как браузером, так и curl или например модулем urllib в python. Futon использует для запросов плагин на jQuery. Посмотреть его можно здесь: http://127.0.0.1:5984/_utils/script/jquery.couch.js

Пользователи¶

По умолчанию к CouchDB открыт доступ всем, но его можно ограничить нажав на “Welcome to Admin Party! Everyone is admin. Fix this” в нижнем правом углу.

Создание документа¶

Вначале создадим базу (тоже кстати документ), нажимаем “Create Database. ” и вводим название, дальше нажимаем “New document” и заводим значения:

../../../_images/couchdb2.png

CouchDB создание документа

Для сохранения нажимаем “Save document”. Как видно можно вводить русские названия параметров. Поле _id формируется автоматически при создании. Поле _rev формируется автоматически при каждом изменении, первая цифра означает количество изменений. _rev используется для внутренних служб системы при репликации.

Создание документа с помощью cURL¶

Данные в CouchDB обрабатываются в формате JSON. Создадим документ giant.json :

 "manufacture": "Giant", "model": "REVEL 2", "цвет": "синий", "цена": 16000, "type": "bike" > 

Для вставки этого документа введем в консоле:

$ curl -X POST http://127.0.0.1:5984/test/ -d @giant.json -H "Content-Type: application/json" 

В базе появится документ типа:

"ok":true,"id":"08601f0b9d3574a116ee390bf0000f44","rev":"1-67d8f0ad3100d85952dbb17ba68b08eb"> 

Принятые правила в REST:

POST – создать новую запись
GET – получить значения
PUT – обновить записи
DELETE – удалить

Выбрать все записи¶

В CouchDB есть view которые по определенным условиям фильтруют данные. Выбор всех данных это стандартная view _all_docs .

$ curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs
"total_rows":2,"offset":0,"rows":[ "id":"08601f0b9d3574a116ee390bf0000f44","key":"08601f0b9d3574a116ee390bf0000f44","value":"rev":"1-67d8f0ad3100d85952dbb17ba68b08eb">>, "id":"2f6904cbb5d279fbdbb9e9eef40015ec","key":"2f6904cbb5d279fbdbb9e9eef40015ec","value":"rev":"3-6d0577a0a515178f0cd939b5caa19572">> ]> 

Создание представлений¶

Представления работают по принципу map/reduce :

map — это выбор и фильтрация документов
reduce — это последующая обработка данных

Простая map функция:

function (doc)  if (doc.type === "bike" && doc.manufacture)  emit(doc.manufacture, doc); > > 

Функции создаются в правом верхнем углу в Temporary View :

../../../_images/couchdb3.png

Сохраним view по нажатию “Save As. ”

../../../_images/couchdb4.png

Вызовем из консоли:

$ curl -X GET http://127.0.0.1:5984/test/_design/product/_view/bike
"total_rows":1,"offset":0,"rows":[ "id":"08601f0b9d3574a116ee390bf0000f44","key":"Giant","value":"_id":"08601f0b9d3574a116ee390bf0000f44","_rev":"1-67d8f0ad3100d85952dbb17ba68b08eb","manufacture":"Giant","model":"REVEL 2","\u0446\u0432\u0435\u0442":"\u0441\u0438\u043d\u0438\u0439","\u0446\u0435\u043d\u0430":"16000","type":"bike">> ]> 

Reduce функции¶

function (doc)  if (doc.type === "bike" && doc.цена)  emit(doc._id, doc.цена); > > 
"total_rows":2,"offset":0,"rows":[ "id":"08601f0b9d3574a116ee390bf0000f44","key":"08601f0b9d3574a116ee390bf0000f44","value":12000>, "id":"08601f0b9d3574a116ee390bf0001130","key":"08601f0b9d3574a116ee390bf0001130","value":16000> ]> 
function(keys, prices)  return sum(prices); > 
"rows":[ "key":null,"value":28000> ]> 

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

CouchDB

Apache CouchDB [1] — документо-ориентированная система управления базами данных, не требующая описания схемы данных. Эта программа является свободной, открытой, и написана на языке Erlang.

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

Архитектура системы

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

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

История развития

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

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

CouchDB используется во многих программных продуктах и на множестве веб-сайтов [5] , в том числе:

  • UbuntuOne, Firefox, TomBoy, Akonadi, Evolution — для синхронизации адресов, заметок и закладок [6] .
  • Mozilla Raindrop — агрегатор сообщений электронной почты, социальных сетей, систем обмена мгновенными сообщениями (Skype, Jabber) [7] .

Примечания

  1. Apache CouchDB™ website
  2. Серверы представлений: документация
  3. Плагин дляjQuery
  4. CouchdDB: Windows binary installer
  5. Проекты использующие CouchDB
  6. Integrating CouchDB with Ubuntu One: Full Specification
  7. Raindrop Software Architecture

Литература

  • Anderson, J. Chris; Slater, Noah & Lehnardt, Jan (November 15, 2009), «CouchDB: The Definitive Guide» (1st ed.), O’Reilly Media, сс. 300, ISBN 0596158165 ,
  • Lennon, Joe (December 15, 2009), «Beginning CouchDB» (1st ed.), Apress, сс. 300, ISBN 1430272376 ,

Ссылки

  • CouchDB: A Case Study
  • Ricky Ho. CouchDB Implementation
  • Простая библиотека для работы с CouchDB на PHP5
  • Asynchronous CouchDB client for Java

На русском языке:

  • Map/Reduce своими руками — Apache CouchDb
  • CouchDB и его применимость
  • Обзор NoSQL систем
  • CouchDB для начинающих
  • Damien Katz — ведущий программист CouchDB
  • Jan Lehnardt
  • Christopher Lenz

См. также

Caché • CouchDB • IMS • DB2 • Firebird • Informix • Ingres • InterBase • MS SQL Server • MongoDB • MySQL • mSQL • Oracle Database • Pervasive SQL • PostgreSQL • Sybase ASE • Sybase ASA • Sybase IQ • Teradata Database • ЛИНТЕР

База данных состояний на основе CouchDB¶

На данный момент базы данных глобальных состояний одноранговых узлов могут быть реализованы на основе LevelDB и CouchDB. По умолчанию для базы данных состояний используется LevelDB, которая встроена в процессы одноранговых узлов. CouchDB — это альтернативная внешняя база данных состояний. Как и хранилище пар «ключ-значение» LevelDB, база данных CouchDB может хранить любые двоичные данные, моделируемые в чейнкоде (для данных в формате, отличном от JSON, в CouchDB используются вложения). При использовании в качестве хранилища объектов типа документ, CouchDB позволяет хранить данные в формате JSON, выполнять расширенные запросы и использовать индексы в запросах.

LevelDB и CouchDB поддерживают стандартные операции чейнкода, такие как получение и установка значения ключа (актива), а также запросы на основе ключей. Ключи можно запрашивать по диапазону, причем составные ключи можно моделировать для возможности осуществления эквивалентных запросов по нескольким параметрам. Например, составной ключ owner,asset_id можно использовать запроса всех активов, принадлежащих определенному объекту. Такие запросы на основе ключей можно использовать как для чтения данных реестра, так и в транзакциях, которые обновляют реестр.

Моделирование данных в формате JSON позволяет выполнять расширенные запросы по значениям данных, а не только по ключам. Это облегчает чтение данных, хранящихся в реестре блокчейна, приложениями и чейнкодом. CouchDB позволяет обеспечить соответствие требованиям аудитов и отчетности для вариантов использования, в которых LevelDB не отвечает эти требованиям. При использовании CouchDB и моделировании данных в JSON, также можно развертывать индексы вместе с чейнкодом. Индексы повышают гибкость и эффективность запросов, позволяя обрабатывать большие наборы данных из чейнкода.

CouchDB выполняется отдельным процессом базы данных наряду с одноранговым узлом. Эта база данных имеет некоторые особенности настройки, управления и использования. Можно начать со встроенной базы данных LevelDB по умолчанию и перейти на CouchDB, если требуются дополнительные сложные расширенные запросы. Рекомендуется моделировать данные активов в формате JSON для возможности выполнять сложные расширенные запросы в будущем.

Ключ документа JSON в CouchDB может содержать только символы в кодировке UTF-8 и не может начинаться с символа подчеркивания («_»). Как в случае с CouchDB, так и в LevelDB, следует избегать использования символа U+0000 (нулевой байт) в ключах.

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

  • Любое поле, начинающееся с символа подчеркивания, «_»
  • ~version

Из-за несовместимости данных между LevelDB и CouchDB выбор базы данных должен быть сделан до развертывания промышленной сети. База данных не может быть преобразована позднее.

Использование CouchDB из чейнкода¶

Запросы чейнкода¶

Большинство функций API оболочки чейнкода можно использовать с базами данных состояний LevelDB или CouchDB, например, GetState , PutState , GetStateByRange , GetStateByPartialCompositeKey . Также, при использовании CouchDB в качестве базы данных состояний и активов в формате JSON для моделирования в чейнкоде, расширенные запросы в формате JSON к базе данных состояний можно выполнять с помощью функции API GetQueryResult , передавая в нее строку запроса CouchDB. Строка запроса соответствует синтаксису запроса CouchDB в формате JSON.

В примере чейнкода marbles02 демонстрируется использование запросов CouchDB. С помощью функции queryMarblesByOwner() осуществляются параметризованные запросы с передачей идентификатора владельца в чейнкод. Далее из базы данных состояний запрашиваются документы JSON, соответствующие типу “marble“ и указанному идентификатору владельца, с помощью синтаксиса запросов в формате JSON.

"selector":"docType":"marble","owner":OWNER_ID>>> 

Результаты расширенных запросов полезны для получения подробной информации о данных, хранящихся в реестре. Однако нет гарантии, что результаты расширенных запросов будут оставаться неизменными между выполнением чейнкода и моментом записи. То есть не следует использовать расширенный запрос и обновлять реестр канала в одной транзакции. Например, при выполнении расширенного запроса для всех активов владельца Alice и передаче их владельцу Bob , новый актив может быть передан Alice другой транзакцией в промежутке между моментами выполнения и записи чейнкода.

Разбиение на страницы результатов запросов CouchDB¶

Fabric поддерживает разбиение на страницы результатов расширенных запросов и запросов по диапазону. Функции API разбиения на страницы позволяют указывать размер страницы и закладки как для запросов по диапазону, так и для расширенных запросов. Для поддержки эффективного разбиения на страницы необходимо использовать соответствующие функции API Fabric. В частности, ключевое слово CouchDB limit не учитываться в запросах CouchDB, поскольку Fabric управляет разбивкой результатов запроса на страницы и неявно устанавливает ограничение pageSize , которое передается в CouchDB.

Если pageSize указан с помощью API разбиения на страницы ( GetStateByRangeWithPagination() , GetStateByPartialCompositeKeyWithPagination() и GetQueryResultWithPagination() ), в чейнкод возвращается набор результатов (привязанный к pageSize ) вместе с закладкой. Закладка может быть возвращена из чейнкода вызывающим клиентам, которые могут использовать закладку в последующем запросе для получения следующей «страницы» результатов.

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

Независимо от использования функций API разбивки на страницы, размеры всех запросов чейнкода ограничиваются параметром totalQueryLimit (по умолчанию имеет значение 100000) в файле core.yaml . Это максимальное количество результатов, которые чейнкод может обработать и возвратить клиенту. Такое ограничение введено, чтобы избежать случайных или злонамеренно длительных запросов.

Независимо от того, какие используются запросы, обычные или с разбиением на страницы, одноранговый узел будет запрашивать данные из CouchDB пакетами, размер которых ограничен параметром internalQueryLimit (по умолчанию 1000) в файле core.yaml . Такой механизм обеспечивает передачу результатов запросов между одноранговым узлом и CouchDB пакетами разумных размеров и является прозрачным для чейнкода и вызывающего клиента.

Пример использования разбиения на страницы приводится в разделе руководства Использование базы данных CouchDB .

Индексы в CouchDB¶

Индексы в CouchDB повышают эффективность запросов в формате JSON, а также необходимы для любых запросов в формате JSON с сортировкой. Индексы позволяют запрашивать данные из чейнкода при наличии большого объема данных в реестре. Индексы можно упаковывать вместе с чейнкодом в каталоге /META-INF/statedb/couchdb/indexes . Индексы определяются в отдельных текстовых файлах с расширением *.json , причем определение индекса должно быть в формате JSON согласно синтаксису индексов в формате JSON для CouchDB. Например, для осуществления приведенного выше запроса объектов marble используется индекс для полей docType и owner :

"index":"fields":["docType","owner"]>,"ddoc":"indexOwnerDoc", "name":"indexOwner","type":"json"> 

Пример индекса можно найти здесь.

Все индексы в каталоге чейнкода META-INF/statedb/couchdb/indexes упаковываются вместе с чейнкодом для развертывания. Индексы развертываются в канале однорангового узла и базе данных чейнкода, когда пакет чейнкода устанавливается на этот узел и определение чейнкода записывается в канал. При установке чейнкода, а затем записи определения чейнкода в канале, индексы развертываются во время записи чейнкода. Если чейнкод уже определен в канале, а пакет чейнкода впоследствии установлен на узле, присоединенном к каналу, индексы развертываются во время установки чейнкода.

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

Индекс может сохранятся в новых устанавливаемых версиях чейнкода. Для обновления определения индекса следует использовать исходное название индекса и изменять только само определение. После установки и создания экземпляра, определение индекса повторно развертывается в базе данных состояний однорангового узла.

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

Конфигурация CouchDB¶

Для использования CouchDB в качестве базы данных состояний следует изменить параметр stateDatabase конфигурации с goleveldb на CouchDB . Кроме того, в параметре couchDBAddress должна указываться база данных CouchDB, которая будет использоваться одноранговым узлом. Если доступ к базе данных CouchDB ограничен, необходимо указать имя пользователя и пароль администратора в соответствующих параметрах. Дополнительные параметры находятся в разделе couchDBConfig . Описание этих параметров приводится в комментариях непосредственно в файле конфигурации. Изменения в файле core.yaml вступают в силу сразу после перезапуска однорангового узла.

Также можно передать переменные среды Docker, например, CORE_LEDGER_STATE_STATEDATABASE и CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS , чтобы переопределить соответствующие значения в файле core.yaml .

Ниже приведен раздел stateDatabase файла core.yaml:

state: # stateDatabase - options are "goleveldb", "CouchDB" # goleveldb - default state database stored in goleveldb. # CouchDB - store state database in CouchDB stateDatabase: goleveldb # Limit on the number of records to return per query totalQueryLimit: 10000 couchDBConfig: # It is recommended to run CouchDB on the same server as the peer, and # not map the CouchDB container port to a server port in docker-compose. # Otherwise proper security must be provided on the connection between # CouchDB client (on the peer) and server. couchDBAddress: couchdb:5984 # This username must have read and write authority on CouchDB username: # The password is recommended to pass as an environment variable # during start up (e.g. LEDGER_COUCHDBCONFIG_PASSWORD). # If it is stored here, the file must be access control protected # to prevent unintended users from discovering the password. password: # Number of retries for CouchDB errors maxRetries: 3 # Number of retries for CouchDB errors during peer startup maxRetriesOnStartup: 10 # CouchDB request timeout (unit: duration, e.g. 20s) requestTimeout: 35s # Limit on the number of records per each CouchDB query # Note that chaincode queries are only bound by totalQueryLimit. # Internally the chaincode may execute multiple CouchDB queries, # each of size internalQueryLimit. internalQueryLimit: 1000 # Limit on the number of records per CouchDB bulk update batch maxBatchUpdateSize: 1000 # Warm indexes after every N blocks. # This option warms any indexes that have been # deployed to CouchDB after every N blocks. # A value of 1 will warm indexes after every block commit, # to ensure fast selector queries. # Increasing the value may improve write efficiency of peer and CouchDB, # but may degrade query response time. warmIndexesAfterNBlocks: 1 

Для баз данных CouchDB, размещенных в контейнерах Docker, поставляемых с Hyperledger Fabric, существует возможность устанавливать имя пользователя и пароль CouchDB с помощью передаваемых переменных среды COUCHDB_USER и COUCHDB_PASSWORD в сценарии Docker Compose.

При установке CouchDB вне образов Docker, поставляемых с Fabric, для установки имени пользователя и пароля администратора необходимо отредактировать файл local.ini этой установки.

Сценарии Docker compose позволяют задать только имя пользователя и пароль при создании контейнера. Файл local.ini необходимо отредактировать, если необходимо изменить имя пользователя или пароль после создания контейнера.

При необходимости привязать порт контейнера fabric-couchdb к порту хоста, важно понимать о последствиях такого действия для безопасности. Привязка порта контейнера CouchDB в среде разработки предоставляет доступ к REST API CouchDB и позволяет визуализировать базу данных через веб-интерфейс CouchDB (Fauxton). В промышленной среде следует воздержаться от привязки порта хоста, чтобы ограничить доступ к контейнеру CouchDB. Тогда только одноранговый узел будет иметь возможность доступа к контейнеру CouchDB.

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

Рекомендации по использованию запросов¶

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

    При использовании запросов JSON:

  • Создавайте индексы в пакете чейнкода.
  • В запросах избегайте таких операторов, как $or , $in и $regex , которые приводят к полному сканированию базы данных.
  • Используйте функцию разбиения на страницы вместо одного большого набора результатов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *