Введение
Zope Object Database (ZODB) — это объектно-ориентированная база данных для прозрачного и постоянного хранения объектов Python. Она входит в состав сервера веб-приложений Zope, но также может использоваться независимо от Zope. К особенностям ZODB относятся: транзакции, история изменений/отмена действий, прозрачно подключаемые хранилища, встроенная кэш-память, многоверсионное управление конкурентным доступом (MVCC) и масштабируемость в сети (с использованием).
Основы
ZODB хранит объекты Python, используя расширенную версию встроенной в Python системы сохранения объектов (pickle). База данных ZODB имеет единственный корневой объект (обычно словарь), который является единственным объектом, к которому база данных предоставляет прямой доступ. До всех остальных объектов, хранящихся в базе данных, можно добраться, начиная с корневого объекта. Объекты, на которые ссылаются объекты, хранящиеся в базе данных, также автоматически сохраняются в базе данных. ZODB поддерживает конкурентные транзакции, используя MVCC, и отслеживает изменения объектов по каждому объекту в отдельности. В базу данных записываются только измененные объекты. Транзакции по умолчанию являются недеструктивными и могут быть отменены.
Хранилище
Для того, чтобы обеспечить сохранение данных, класс Python `Car` должен быть унаследован от класса `persistence.Persistent`. Этот класс содержит данные, необходимые для работы механизма сохранения, такие как внутренний идентификатор объекта, состояние объекта и так далее, а также определяет границы сохранения в следующем смысле: каждый объект, класс которого унаследован от `Persistent`, является неделимой единицей хранения (весь объект копируется в хранилище при изменении любого поля). В приведенном выше примере, если `Car` – единственный класс, унаследованный от `Persistent`, то при добавлении `wheel3` к `car`, все объекты должны быть перезаписаны в хранилище. Напротив, если `Wheel` также унаследован от `Persistent`, то при выполнении `carzz.wheel3 = Wheel`, в хранилище будет записана новая запись, содержащая новое значение для `Car`, но существующий объект `Wheel` останется неизменным, а новая запись для `Car` будет указывать на уже существующую запись `Wheel` в хранилище. Механизм ZODB не отслеживает изменения, распространяющиеся по графу ссылок. В приведенном выше примере, `carzz.wheel3 = something` – это изменение, которое автоматически отслеживается механизмом ZODB, поскольку `carzz` является экземпляром класса `Car` (унаследованного от `Persistent`). Механизм ZODB делает это, помечая запись как "измененную". Однако, если присутствует список, любые изменения внутри списка не обнаруживаются механизмом ZODB, и программисту необходимо вручную указать, что `carzz.p изменилось = 1`, тем самым уведомив ZODB о том, что запись действительно была изменена. Таким образом, в определенной степени программист должен понимать принципы работы механизма сохранения данных.
Атомность
Единицей хранения (то есть объект, класс которого наследуется от Persistent) является также и единица атомарности. В приведенном выше примере, если Cars – единственный класс, производный от Persistent, одна нить изменяет колесо (запись Car должна быть оповещена), а другая нить изменяет другое колесо в рамках другой транзакции, то вторая фиксация изменений завершится неудачно. Если Wheel также является Persistent, оба колеса могут быть изменены независимо двумя разными потоками в двух разных транзакциях.
Пребывание в классе
Персистентность класса, то есть запись класса конкретного объекта в хранилище, достигается путем записи своеобразного "полностью квалифицированного" имени класса в каждую запись на диске. В Python имя класса включает в себя иерархию каталогов, в котором расположен исходный файл класса. Из этого следует, что исходный файл объекта, подлежащего сохранению, нельзя перемещать. В противном случае механизм ZODB не сможет определить класс объекта при его извлечении из хранилища, что приведет к повреждению объекта.
ЗЕО
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 Распределенная реализация хранилища (с отказоустойчивостью и балансировкой нагрузки).