База данных объектов Zope - Википедия - Zope Object Database

База данных объектов Zope
Разработчики)Фонд Zope
Стабильный выпуск
5.6.0[1] / 11 июня 2020 г.; 6 месяцев назад (2020-06-11)
Репозиторийgithub.com/ zopefoundation/ ZODB
Написано вPython
Операционная системаКроссплатформенность
ТипБаза данных объектов
ЛицензияОбщественная лицензия Zope
Интернет сайтwww.zodb.org

В База данных объектов Zope (ЗОДБ) является объектно-ориентированная база данных для прозрачного и постоянного хранения Python объекты. Он входит в состав Zope сеть сервер приложений, но также может использоваться независимо от Zope.

Функции ZODB включают в себя: транзакции, историю / отмену, прозрачно подключаемое хранилище, встроенное кэширование, мультиверсионный контроль параллелизма (MVCC) и масштабируемость по сети (с использованием ZEO).

История

  • Создан Джимом Фултоном из Zope Corporation в конце 90-х.
  • Начиналась как простая система постоянных объектов (POS) во время разработки Principia (которая позже стала Zope)
  • ZODB 3 был переименован после значительного изменения архитектуры.
  • ZODB 4 был недолгим проектом по повторной реализации всего пакета ZODB 3 с использованием 100% Python.

Выполнение

Основы

ZODB хранит объекты Python, используя расширенную версию встроенного в Python сохранения объектов (pickle). База данных ZODB имеет единственный корневой объект (обычно словарь), который является единственным объектом, напрямую доступным из базы данных. Доступ ко всем другим объектам, хранящимся в базе данных, осуществляется через корневой объект. Объекты, на которые ссылается объект, хранящийся в базе данных, также автоматически сохраняются в базе данных.

ZODB поддерживает одновременные транзакции с использованием MVCC и отслеживает изменения объектов для каждого объекта. Только измененные объекты фиксируются. По умолчанию транзакции являются неразрушающими и могут быть отменены.

Пример

Например, скажем, у нас есть машина, описанная с помощью 3 классов Машина, Колесо и Винт. В Python это можно представить следующим образом:

учебный класс Машина: [...]учебный класс Колесо: [...]учебный класс Винт: [...]моя машина = Машина()моя машина.колесо1 = Колесо()моя машина.колесо2 = Колесо()за колесо в (моя машина.колесо1, моя машина.колесо2):    колесо.винты = [Винт(), Винт()]

Если переменная mycar является корнем настойчивости, то:

Zodb['моя машина'] = моя машина

Это помещает все экземпляры объекта (автомобиль, колесо, винты и т. Д.) В хранилище, которое можно будет извлечь позже. Если другая программа устанавливает соединение с базой данных через объект mycar, выполняя:

машина = Zodb['моя машина']

И получает все объекты, указатель на автомобиль находится в машина Переменная. Затем на более позднем этапе этот объект можно изменить с помощью кода Python, например:

машина.колесо3 = Колесо()машина.колесо3.винты = [Винт()]

Хранилище изменяется, чтобы отразить изменение данных (после того, как сделана фиксация).

Ни в Python, ни в ZODB нет объявления структуры данных, поэтому новые поля можно свободно добавлять к любому существующему объекту.

Единица хранения

Чтобы иметь место, класс Python Car должен быть производным от персистентности. Постоянный класс - этот класс хранит данные, необходимые для работы механизма сохранения состояния, такие как внутренний идентификатор объекта, состояние объекта и т. Д., Но также определяет границу устойчивости в следующем смысле: каждый объект, чей класс происходит от Persistent - это атомарная единица хранения (весь объект копируется в хранилище при изменении поля).

В приведенном выше примере, если Машина - единственный класс, производный от Persistent, когда колесо3 добавлен в автомобиль, все объекты должны быть записаны в хранилище. Напротив, если Колесо также происходит от Persistent, тогда, когда carzz.wheel3 = Колесо выполняется, новая запись записывается в хранилище для хранения нового значения Машина, но существующие Колесо сохранены, а новый рекорд Машина указывает на уже существующие Колесо запись внутри хранилища.

Механизм ZODB не гонится за модификациями через граф указателей. В приведенном выше примере carzz.wheel3 = что-то это модификация, автоматически отслеживаемая механизмами ZODB, потому что Carzz относится к классу (постоянный) Машина. Механизм ZODB делает это, помечая запись как грязный. Однако, если есть список, любое изменение внутри списка не замечается механизмом ZODB, и программист должен помочь, добавив вручную carzz._p_changed = 1, уведомляя ZODB о том, что запись действительно изменилась. Таким образом, в определенной степени программист должен знать о работе механизма сохранения состояния.

Атомарность

Единица хранения (то есть объект, класс которого является производным от Persistent) также является атомарность единица. В приведенном выше примере, если Легковые автомобили является единственным постоянным классом, поток изменяет Wheel ( Машина запись должна быть уведомлена), а другой поток изменяет другой Колесо внутри другой транзакции вторая фиксация завершится ошибкой. Если Колесо также постоянный, оба Колеса могут быть изменены независимо двумя разными потоками в двух разных транзакциях.

Сохранение класса

Постоянство класса - запись класса определенного объекта в хранилище - достигается записью своего рода «полностью определенное» имя класса в каждую запись на диске. В Python имя класса включает иерархию каталогов, в которых находится исходный файл класса. Следствием этого является то, что источник файл сохраняющегося объекта не может быть перемещен. Если это так, машина ZODB не может определить местонахождение класса объекта при извлечении его из хранилища, что приводит к поломке объекта.

ZEO

Zope Enterprise Objects (ZEO) - это реализация хранилища ZODB, которая позволяет нескольким клиентским процессам сохранять объекты на одном сервере ZEO. Это позволяет прозрачное масштабирование.

Сменные хранилища

  • Сетевое хранилище (также известное как ZEO) - позволяет нескольким процессам Python загружать и хранить постоянные экземпляры одновременно.
  • Хранилище файлов - позволяет одному процессу Python взаимодействовать с файлом на диске.
  • relstorage - позволяет поддерживать постоянное хранилище в качестве СУБД.
  • Хранилище каталогов - все постоянные данные хранятся в виде отдельного файла в файловой системе. Аналогично FSFS в Subversion.
  • Демонстрационное хранилище - внутренняя часть постоянного хранилища в памяти.
  • BDBStorage - который использует Berkeley DB задний конец. Сейчас заброшен.

Отказоустойчивый технологии

  • Zope Replication Services (ZRS) - коммерческое дополнение (с открытым исходным кодом с мая 2013 года), которое устраняет единую точку отказа, обеспечивая горячее резервное копирование для записи и балансировку нагрузки для чтения.
  • zeoraid - решение с открытым исходным кодом, которое предоставляет сетевой прокси-сервер, который распределяет хранилища объектов и восстановление по ряду сетевых серверов.
  • relstorage - поскольку используются технологии RDBMS, это устраняет необходимость в сервере ZEO.
  • NEO - Распределенная (отказоустойчивость, балансировка нагрузки) реализация хранилища.

Рекомендации

внешняя ссылка