CodernityDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:46, 30 января 2019.
CodernityDB
CodernityDB.png
Разработчики: codernity.com
Выпущена: 2011; 9 years ago (2011)
Состояние разработки: Активное
Написана на: Python
Операционная система: Кросс-платформенная
Тип ПО: NoSQL БД
Лицензия: Apache License 2.0
Веб-сайт CodernityDB

CodernityDB - это кросс-платформенная, NoSQL, написанная на Python база данных с открытым исходным кодом. Можно назвать ее более продвинутой базой данных ключей-значений с несколькими индексами значений ключей в одном и том же движке. А именно под продвинутой базой данных ключ-значение подразумевается следующее: представьте себе несколько «стандартных» баз данных ключ-значение в одной базе данных.

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

Описание

CodernityDB - это быстрая, мультиплатформенная, без схемы, база данных NoSQL с открытым исходным кодом на чистом Python (без сторонней зависимости). Она имеет дополнительную поддержку версии HTTP-сервера (CodernityDB-HTTP-link), а также клиентской библиотеки Python (CodernityDB-PyClient-link), которая на 100% совместима со встраиваемой версией. Это можно назвать более продвинутой базой данных ключ-значение. С несколькими индексами ключ-значение в одном движке. Также CodernityDB поддерживает функции, которые выполняются внутри базы данных[Источник 1].

Устройство БД

CodernityDB состоит из 3 важных частей[Источник 2].

База данных

База данных содержит информацию об индексах и в основном работает с этими индексами. Это видимый объект для конечного пользователя. В настоящее время внедрены 4 разные базы данных:

  • Database - база данных для использования в среде с одним процессом/потоком
  • DatabaseTreadSafe - база данных для использования с потоками
  • DatabaseSuperThreadSafe - база данных, которая также может использоваться с потоками, но операции с базой данных ограничены только одним действием в заданное время
  • CodernityDB-HTTP - версия базы данных HTTP-сервера для многопоточных и многопроцессорных сред.

Индекс

Во-первых, надо знать, что существует один основной индекс с именем id. Объект CodernityDB является своего рода «умной оболочкой» для разных индексов. CodernityDB не может работать без индекса id. Это единственное требование. Можно рассматривать этот загадочный индекс как базу данных ключ-значение (ну, на самом деле это хранилище ключей / значений). Каждый индекс будет индексировать данные по ключу и связывать их значение. Когда вы вставляете данные в базу данных, вы всегда вставляете их в основной индекс, называемый id. Затем база данных передает ваши данные всем остальным индексам. Вы не можете вставить прямо в индекс. Данные внутри вторичных индексов связаны с первичными. Таким образом, нет необходимости дублировать хранимые данные внутри индекса (with_doc = True при запросе индекса). Исключением из этого правила является то, что когда вы действительно заботитесь о производительности, наличие данных также во вторичных индексах не требует фонового запроса к индексу индекса для получения данных из него. Это также причина, по которой нужно иметь индекс в вашей базе данных с самого начала, в противном случае нужно будет переиндексировать новый или измененный индекс, когда уже есть записи в базе данных[Источник 3].

По индексу мы вызываем класс на языке Python, который был добавлен в базу данных. Его можно сравнить с таблицей [SQL (Structured Query Language)|SQL] (только для чтения), для обновления вам всегда нужно передать полный объект в базу данных, наши индексы можно сравнить также с механизмом просмотра [Apache CouchDB|CouchDB]. Можно иметь столько индексов, сколько хотите, и одна запись в базе данных может «существовать» более чем в одном индексе.

Сам индекс не хранит никакой информации, кроме метаданных. Вам не нужно копировать полные данные каждый раз в индексы, потому что все индексы, отличные от первого id, привязаны к нему значением _id, и вы можете легко получить данные из этого идентификационного индекса, добавив with_doc = True в ваши запросы на получение.

 1 class Md5Index(HashIndex):
 2 
 3     def __init__(self, *args, **kwargs):
 4         kwargs['key_format'] = '16s'
 5         super(Md5Index, self).__init__(*args, **kwargs)
 6 
 7     def make_key_value(self, data):
 8         return md5(data['name']).digest(), None
 9 
10     def make_key(self, key):
11         return md5(key).digest()

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

1 [...]
2 john = db.get('md5', 'John', with_doc=True)
3 [...]

В настоящее время доступны индексы на основе хэша (отдельная цепочечная версия хэш-таблицы) и B+ дерева.

Оба индекса используют огромные разрежённые файлы.

Также помните, что больше индексов влияет на производительность записи.

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

Хранилище

Хранилище используется индексом для хранения собственных значений (посмотрите на второй параметр возврата в примере выше).

Если индекс возвращает None как значение, операция хранения не выполняется.

Хранилище должно сохранять python-значение на диске и возвращать позицию и размер, чтобы позволить индексу сохранять эти данные. В реализации по умолчанию используется маршал Python для сериализации и десериализации объектов Python, переданных в него как ценность. Таким образом, вы сможете хранить те объекты, которые могут быть сериализованы модулем маршала.

ACID

CodernityDB никогда не перезаписывает существующие данные. Индекс id всегда согласован. И другие индексы могут быть всегда восстановлены, обновлены (CodernityDB.database.Database.reindex_index()) из него.

В заданное время одному писателю разрешается записывать в один индекс (операции обновления/удаления). Читатели никогда не блокируются.

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

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

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

Существует также не что иное, как замедленная запись в реализации CodernityDB по умолчанию. После каждой записи внутренние и файловые буферы очищаются, а затем подтверждение записи возвращается пользователю.

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

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

Из-за того, что хранилище никогда не обновляется, в нем тратится много места. Чтобы оптимизировать использование диска, используйте CodernityDB.database.Database.compact() или CodernityDB.index.Index.compact ().

Потоковые операции

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

Вставка

Входящие данные сначала обрабатываются в индексе id. Затем он проходит метод make_key_value, на следующем этапе значение сохраняется в хранилище, и, наконец, метаданные хранятся в индексе. Затем процедура повторяется для других индексов.

Обновление

Работает так же, как и операция вставки. Но вы должны указать поля _rev и _id. Поле _rev сравнивается с текущим хранением в базе данных. Если они совпадают, операция продолжается, в другой ситуации создается DatabaseConflict.

Также нет возможности обновлять отдельный атрибут объекта в базе данных. Вы должны всегда делать полное обновление. Поэтому даже для обновления одного атрибута вам нужно выполнить get + update для всего объекта из базы данных.

Удаление

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

Для реального удаления данных из базы данных необходимо сначала удалить его, затем запустить CodernityDB.index.Index.compact () или CodernityDB.database.Database.reindex ().

Ключевые особенности

CodernityDB имеет ряд ключевых особенностей:

  • Написана на "чистом" Python.
  • Множественные индексы.
  • Быстрая (100 000 операций вставки и более 100 000 операций чтения в секунду)[Источник 4].
  • Встроенный режим (по умолчанию) и сервер CodernityDB-HTTP, с клиентской библиотекой CodernityDB-PyClient, которая стремится быть на 100% совместимой со встроенным.
  • Простой способ реализации пользовательского хранилища.
  • Поддержка Коллекций/таблиц.
  • Шардирование.

Установка

CodernityDB полностью написан на Python 2.x. Сборка не нужна вообще. Он протестирован и совместим с:

  • CPython 2.6, 2.7;
  • PyPy 1.6+ (и, возможно, старше);
  • Jython 2.7a2 +.

Необходимо выполнить стандартную установку для приложений Python:

pip install CodernityDB

или использовать easy_install:

easy_install CodernityDB

или из источника:

hg clone ssh://hg@bitbucket.org/codernity/codernitydb
cd codernitydb
python setup.py install

Источники

  1. PURE PYTHON, FAST, SCHEMA-LESS, NOSQL DATABASE // ActiveState. [2013—2019]. Дата обновления: 21.09.2018. URL:http://code.activestate.com/pypm/codernitydb/ (дата обращения: 20.01.2019)
  2. Design CodernityDB // Codernity. [2011—2014]. Дата обновления: 10.01.2019. URL:http://labs.codernity.com/codernitydb/design.html (дата обращения: 08.10.2018)
  3. CodernityDB - a Fast Pure Python NoSQL Database // Methodsandtools. [1995—2019]. Дата обновления: 08.11.2018. URL:http://www.methodsandtools.com/tools/codernitydb.php (дата обращения: 20.01.2019)
  4. Speed CodernityDB // Сodernity. [2011—2014]. Дата обновления: 11.02.2014. URL:http://labs.codernity.com/codernitydb/speed.html#speed/ (дата обращения: 08.10.2018)