跳转到主要内容

打包History Free PostgreSQL RelStorage for ZODB。

项目描述

relstorage_packer

使用文件系统中的blob打包ZODB,且不保留历史记录。

概述

此脚本也适用于非常大的Relstorage ZODB,包含数百万个对象。原始打包脚本需要几天时间,消耗大量RAM。因此,需要加快打包过程。

此脚本不会消耗大量RAM,运行速度比原始脚本快得多。原来的脚本仅分析就需3.5天,现在仅需大约6小时。在后续运行中,它仅处理上一次运行后的更改:它仅考虑比前一次运行中处理的上一个事务更新的事务。

撰写本文时,处理4400万个对象需要约3-6小时,具体取决于硬件和Postgresql的配置。

脚本创建一个反向对象图,这会在数据库中占用很少的空间。

限制

在开发过程中,关键的生产环境是一个运行着relstorage的postgresql数据库,在历史自由模式下将blob存储在文件服务器上。因此,这是已经实现的。

我相信使其在MySQL和Oracle上运行也是很容易的。同时,在数据库内部存储blob当然也是可能的。

我不确定这种清理方式是否适用于非历史自由模式。至少,它需要大量的关爱和对ZODB的理解才能进行重构和实现。

欢迎贡献!

用法

创建一个配置文件。它与Relstorage部署的经典打包脚本中使用的配置文件相同。

<relstorage>
    create-schema false
    keep-history false
    shared-blob-dir true
    blob-dir var/blobstorage
    commit-lock-timeout 600
    <postgresql>
        dsn dbname='test_site' host='127.0.0.1' user='zodb' password='secret'
    </postgresql>
</relstorage>

安装后,一个名为relstorage_pack的脚本可用。

Usage: relstorage_pack config_file

Fast ZODB Relstorage Packer for history free PostgreSQL

Options:
  -h, --help     show this help message and exit
  -i, --init     Removes all reference counts and starts from scratch.
  -v, --verbose  More verbose output, includes debug messages.

第一次运行时,使用数据库,将--init作为参数传递。这将删除并重新创建打包表。

它的工作原理

首先运行时,它创建了一个名为object_inrefs的表,用于反向引用计数。该表有

zoid BIGINT NOT NULL,

这是 incoming references 计数的对象 id。

tid BIGINT NOT NULL CHECK (tid > 0)

zoid 的交易 id。

inref BIGINT,

incoming reference 的对象 id 或与 zoid 相同。

numinrefs BIGINT NOT NULL DEFAULT 0,

如果 zoid==inref,这是计数字段,否则它是不相关的。

因此,此表用于两件事

  1. 跟踪 incoming references。

  2. 计数 incoming references。

代码运行在三个主要阶段

初始准备阶段

创建缺失的表,清理 object_inrefs 表,并按顺序运行所有交易以计数和记录所有交易。

后续运行准备阶段
  1. 从最后已知的 tid 开始,然后运行所有新交易以计数和记录新交易的更改。

  2. 对于每个新交易 zoid(当前),还要检查是否有引用丢失。因此获取当前的所有先前字段引用并删除任何不再有效的引用。对于每个删除的引用,减少在 object_inrefs 中 zoid=reference 和 inref=reference 的计数。

清理阶段
  1. 选择一个孤儿,即没有 incoming refs 的 zoid。

  2. 获取由该孤儿引用的所有 zoid。

  3. 对于这些引用中的每一个,从 object_inrefs 中删除 inref=orphan 和 zoid=reference 的条目。

  4. 在 zoid=reference 和 inref=reference 的条目上减少计数。

  5. object_state(真实数据)中删除带有孤儿 zoid 的条目。

  6. 从(1)开始,除非不再有孤儿。

源代码

源代码位于一个GIT DVCS中,其主要分支位于github

我们很高兴看到许多分叉和pull-requests,使此包变得更好。

使用集成 buildout 和测试

测试此代码并不容易,编写好的测试是一个需要完成的任务。目前,您可以在本地主机上运行一个postgres数据库(除非您想更改 buildout.cfg)。然后以数据库用户(在debian上名为 postgres)的身份运行以下命令

psql -c "CREATE USER zope WITH PASSWORD 'secret';"
psql -c "CREATE DATABASE relstorage_packer_test OWNER zope;"
psql -c "REVOKE connect ON DATABASE relstorage_packer_test FROM PUBLIC;"
psql -c "GRANT connect ON DATABASE relstorage_packer_test TO zope;"

接下来(因为我的懒惰),运行 ./bin/instance start,它启动了一个 Plone。添加一个 Plone 网站,添加和删除一些内容以将一些东西填充到数据库中以便打包。

接下来运行打包程序。

如果您不喜欢这种方式:pull requests 总是受欢迎的。

贡献者

感谢Robert Penz在我们的Linux User Group Tirol会议上的好主意。还要感谢Shane Hathaway的 Relstorage 和 Jim Fulton 的 ZODB 和 zc.zodbdgc(不幸的是,它不与Relstorage一起工作)。

历史

2.1 (2014-02-19)

  • 重构了日志记录,因为每次更改代码的其他部分时,它总是在我的路上。[jensens, 2014-02-19]

  • 长时间运行的连接会导致postgresql占用大量RAM。因此,我们每5000次循环(TID分析或ZOID删除)重新连接。[jensens, 2014-02-18]

  • 打包后,我们有一堆空闲事务(已中止)的postgresql进程正在运行。这导致了一个OperationalError: out of shared memory HINT: You might need to increase max_pred_locks_per_transaction. 错误。因此,我重构了事务处理和回滚,并使用显式提交而不是使用relstorage storage._with_store。现在这部分非常受控,不是悬挂连接不回滚的原因。[jensens, 2014-02-18]

2.0.2 (2014-02-05)

  • 还支持没有blobstorage的存储。[jensens, 2014-02-05]

2.0.1 (2014-02-03)

  • 在finally中解锁,以真正解锁一个失败。[jensens, 2014-02-03]

  • 如果无法获得锁,则使用非零退出代码。[saily]

2.0

  • 重构了收集和使用引用计数的方法。现在更快。[jensens, 2014-01-11]

1.0

  • 开始打包[jensens, 2013-11-23]

许可证

版权所有 (c) 2013, BlueDynamics Alliance, 奥地利,德国,瑞士。保留所有权利。

在满足以下条件的情况下,允许重新分配和使用源代码和二进制形式,无论是修改还是未修改:

  • 源代码的重新分配必须保留上述版权声明、本条件列表和以下免责声明。

  • 二进制形式的重新分配必须复制上述版权声明、本条件列表和以下免责声明在文档和/或其他与重新分配一起提供的材料中。

  • 未经BlueDynamics Alliance事先书面许可,不得使用BlueDynamics Alliance的名称或其贡献者的名称来认可或推广由此软件派生出的产品。[jensens, 2014-02-18]

本软件由BlueDynamics Alliance按原样提供,不提供任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性的暗示保证。在任何情况下,BlueDynamics Alliance均不对任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论这些损害是由于何种原因引起的,无论是在合同、严格责任还是侵权(包括疏忽或不计后果)中,即使BlueDynamics Alliance已被告知此类损害的可能性。[jensens, 2014-02-18]

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

relstorage_packer-2.1.tar.gz (11.2 kB 查看散列)

上传时间:

由以下支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面