Объекты база данных Zope ( ZODB ) является объектно-ориентированной базой данных для прозрачно и постоянно хранить Python объекты. Он включен как часть сервера веб- приложений Zope , но также может использоваться независимо от Zope.
Разработчики) | Фонд Zope |
---|---|
Стабильный выпуск | 5.6.0 [1] / 11 июня 2020 г . |
Репозиторий | github |
Написано в | Python |
Операционная система | Кроссплатформенность |
Тип | База данных объектов |
Лицензия | Общественная лицензия Zope |
Веб-сайт | www |
Функции 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 классов Car
, Wheel
и Screw
. В Python это можно представить следующим образом:
класс Автомобиль : [ ... ] класс Колесо : [ ... ] класс Винт : [ ... ]myCar = Автомобиль () myCar . wheel1 = Колесо () myCar . wheel2 = Колесо () для колеса в ( MyCar . колесо1 , MyCar . wheel2 ): колеса . винты = [ Винт (), Винт ()]
Если переменная mycar является корнем настойчивости, то:
zodb [ 'mycar' ] = myCar
Это помещает все экземпляры объекта (автомобиль, колесо, винты и т. Д.) В хранилище, которое можно будет извлечь позже. Если другая программа устанавливает соединение с базой данных через объект mycar, выполняя:
автомобиль = zodb [ 'myCar' ]
И получает все объекты, указатель на автомобиль содержится в car
переменной. Затем на более позднем этапе этот объект можно изменить с помощью кода Python, например:
машина . wheel3 = Колесо () автомобиля . колесо3 . винты = [ Винт ()]
Хранилище изменяется, чтобы отразить изменение данных (после того, как сделана фиксация).
Ни в Python, ни в ZODB нет объявления структуры данных, поэтому новые поля можно свободно добавлять к любому существующему объекту.
Единица хранения
Чтобы иметь место, класс Python Car должен быть производным от персистентности. Постоянный класс - этот класс содержит данные, необходимые для работы механизма сохранения состояния, такие как внутренний идентификатор объекта, состояние объекта и т. Д., Но также определяет границу устойчивости в следующем смысле: каждый объект, чей класс происходит от Persistent - это атомарная единица хранения (весь объект копируется в хранилище при изменении поля).
В приведенном выше примере, если Car
это единственный класс, производный от Persistent, при wheel3
добавлении в car все объекты должны быть записаны в хранилище. Напротив, если Wheel
также происходит от Persistent, то при carzz.wheel3 = Wheel
выполнении новая запись записывается в хранилище для хранения нового значения Car
, но существующие Wheel
сохраняются, а новая запись для Car
точек указывает на уже существующую Wheel
запись внутри место хранения.
Механизм ZODB не гонится за модификациями через граф указателей. В приведенном выше примере carzz.wheel3 = something
это модификация, автоматически отслеживаемая механизмом ZODB, потому что она carzz
относится к классу (Persistent) Car
. Механизм ZODB делает это, помечая запись как грязную . Однако, если есть список, любое изменение внутри списка не замечается механизмом ZODB, и программист должен помочь, добавив вручную carzz._p_changed = 1
, уведомив ZODB о том, что запись действительно изменилась. Таким образом, до некоторой степени программист должен знать о работе механизма персистентности.
Атомарность
Единица хранения (то есть объект, класс которого является производным от Persistent) также является единицей атомарности . В приведенном выше примере, если Cars
это единственный постоянный класс, поток изменяет Wheel ( Car
запись должна быть уведомлена), а другой поток изменяет другой Wheel
внутри другой транзакции, вторая фиксация завершится ошибкой. Если Wheel
также является Persistent, оба Wheels
могут быть изменены независимо двумя разными потоками в двух разных транзакциях.
Сохранение класса
Постоянство класса - запись класса конкретного объекта в хранилище - достигается записью своего рода «полностью определенное» имя класса в каждую запись на диске. В 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 - поскольку используются технологии РСУБД, это устраняет необходимость в сервере ZEO.
- NEO - Распределенная (отказоустойчивость, балансировка нагрузки) реализация хранилища.