Banco de dados de objetos zope

Content

História

Created by Jim Fulton of Zope Corporation in the late 90s.Started as simple Persistent Object System (POS) during Principia development (which later became Zope)ZODB 3 was renamed when a significant architecture change was landed.ZODB 4 was a short lived project to re-implement the entire ZODB 3 package using 100% Python.

Implementação

Fundamentos

O Zodb armazena objetos Python usando uma versão estendida da persistência de objeto interno do Python (Pickle). Um banco de dados ZODB possui um único objeto root (normalmente um dicionário), que é o único objeto diretamente acessível pelo banco de dados. Todos os outros objetos armazenados no banco de dados são alcançados através do objeto raiz. Os objetos referenciados por um objeto armazenados no banco de dados também são armazenados automaticamente no banco de dados.

O ZODB suporta transações simultâneas usando o MVCC e rastreia alterações nos objetos por objeto. Apenas objetos alterados são comprometidos. As transações não são destrutivas por padrão e podem ser revertidas.

Exemplo

Por exemplo, digamos que tenhamos um carro descrito usando 3 aulas de carro, roda e parafuso. Em Python, isso pode ser representado da seguinte maneira:

Classe Car: [...] Roda de aula: [...] parafuso de classe: [...] mycar = car () mycar.wheel 1 = roda () mycar.wheel 2 = roda () para roda (meu Car.wheel 1, mycar.wheel2): wheel.screws = [sche (), sche ()]

Se a variável mycar for a raiz da persistência, então:

zodb ['mycar'] = mycar

Isso coloca todas as instâncias do objeto (carro, roda, parafusos etc.) em armazenamento, que podem ser recuperadas posteriormente. Se outro programa recebe uma conexão com o banco de dados através do objeto MyCar, executando:

carro = zodb ['mycar']

E recupera todos os objetos, o ponteiro para o carro que está sendo mantido na variável do carro. Então, em algum estágio posterior, esse objeto pode ser alterado com um código Python como:

car.wheel 3 = wheel () car.wheel.screws = [Screw ()]

O armazenamento é alterado para refletir a mudança de dados (após a ordem de uma confirmação).

Não há declaração da estrutura de dados em Python ou Zodb, para que novos campos possam ser adicionados livremente a qualquer objeto existente.

Unidade de armazenamento

Para que a persistência ocorra, a aula de carro Python deve ser derivada da persistência. Classe persistente - Esta classe mantém os dados necessários para que a maquinaria de persistência funcione, como o ID do objeto interno, o estado do objeto e assim por diante, mas também define o limite da persistência no seguinte sentido: todo objeto cuja classe Deriva de persistente é a unidade atômica de armazenamento (todo o objeto é copiado para o armazenamento quando um campo é modificado).

No exemplo acima, se o carro é a única classe derivada de persistente, quando o Wheel3 é adicionado ao carro, todos os objetos devem ser gravados no armazenamento. Por outro lado, se a roda também deriva de persistente, então quando carzz.wheel3 = roda é executada, um novo registro é escrito no armazenamento para manter o novo valor do carro, mas a roda existente é mantida e o novo registro para o O carro aponta para o registro de roda já existente dentro do armazenamento.

A maquinaria ZODB não persegue a modificação através do gráfico de ponteiros. No exemplo acima, carzz.wheel3 = algo é uma modificação rastreada automaticamente pela maquinaria Zodb, porque o Carzz é do carro (persistente). A maquinaria Zodb faz isso marcando o registro como sujo. No entanto, se houver uma lista, qualquer alteração dentro da lista não será notada pelas máquinas do Zodb, e o programador deve ajudar adicionando manualmente carzz._p_changed = 1, notificando o Zodb que o registro realmente mudou. Assim, até certo ponto, o programador deve estar ciente do funcionamento das máquinas de persistência.

Atomicidade

A unidade de armazenamento (ou seja, um objeto cuja classe deriva de persistente) também é a unidade de atomicidade. No exemplo acima, se os carros são a única classe persistente, um encadeamento modifica uma roda (o registro do carro deve ser notificado) e outro encadeamento modifica outra roda dentro de outra transação, a segunda confirmação falhará. Se a roda também for persistente, ambas as rodas podem ser modificadas de forma independente por dois roscas diferentes em duas transações diferentes.

Persistência de classe

A persistência da classe - escrevendo a classe de um objeto específico no armazenamento - é obtido escrevendo um tipo de nome "totalmente qualificado" da classe em cada registro no disco. No Python, o nome da classe envolve a hierarquia do diretório que o arquivo de origem da classe reside. Uma conseqüência é que o arquivo de origem do objeto persistente não pode ser movido. Se for, a maquinaria ZODB não consegue localizar a classe de um objeto ao recuperá -lo do armazenamento, resultando em um objeto quebrado.

Zeo

O Zope Enterprise Objects (ZEO) é uma implementação de armazenamento do ZODB que permite que vários processos do cliente persistam objetos em um único servidor Zeo. Isso permite escala transparente.

Armazenamentos flasgáveis

Network Storage (aka ZEO) - Enables multiple python processes load and store persistent instances concurrently.File Storage - Enables a single python process to talk to a file on disk.relstorage - Enables the persistence backing store to be a RDBMS.Directory Storage - Each persistent data is stored as a separate file on the filesystem. Similar to FSFS in Subversion.Demo Storage - An in-memory back end for the persistent store.BDBStorage - Which uses Berkeley DB back end. Now abandoned.

Tecnologias de failover

Zope Replication Services (ZRS) - A commercial add-on (open-source since May 2013) that removes the single point of failure, providing hot backup for writes and load-balancing for reads.zeoraid - An open source solution that provides a proxy Network Server that distributes object stores and recovery across a series of Network Servers.relstorage - since RDBMS technologies are used this obviates need for ZEO server.NEO - Distributed (fault tolerance, load-balancing) storage implementation.