zodb/relstorage
GitHub: zodb/relstorage
为 ZODB 对象数据库提供关系型数据库后端存储,支持多种 RDBMS,可替代 FileStorage 和 ZEO 以实现更高并发和更易管理的存储架构。
Stars: 60 | Forks: 45
此文件是 PyPI 的长描述,因此它只能使用纯 ReST,不能使用 sphinx 扩展。
RelStorage 是 ZODB 的一种存储实现,它将 pickles 存储在关系型数据库 (`RDBMS`_) 中。目前支持 PostgreSQL 10 及以上版本、MySQL 5.7.19 / 8.0、Oracle 10g 及以上版本以及 SQLite 3.8.3 及以上版本。RelStorage 取代了 PGStorage 项目。
# .. _RDBMS: https://en.wikipedia.org/wiki/Relational_database_
# 特性
* 它是 FileStorage 和 ZEO 的直接替代品,并具有多项增强功能:
* 支持撤销、打包和对象历史记录保留,就像 FileStorage 一样。
* RelStorage 可以配置为*不*保留对象历史记录,以减少磁盘空间使用并提高性能。
* 单台机器上的多个进程可以使用 SQLite 读取和写入本地 ZODB 数据库,而无需启动和管理另一个进程(即 ZEO)。
* Blobs 可以存储在共享文件系统上,或者(推荐)存储在关系型数据库中,并且仅在本地缓存。
* 同一进程中的多个线程共享一个高性能的内存 pickle 缓存,以减少对 RDBMS 的查询次数。这与 ZEO 类似,并且支持 ZEO 缓存跟踪工具。
* 内存 pickle 缓存可以保存到磁盘,并在进程启动时读取。这可以通过消除大量的 RDBMS 查询来显著加快站点预热时间。与 ZEO 不同,此缓存由机器上的所有进程自动共享(无需配置单独的客户端标识符。)
* 适用于大型、高流量的站点。
* 多台机器上的多个 Python 进程可以同时读取和写入同一个 ZODB 数据库。这与 ZEO 类似,但 RelStorage 不需要 ZEO。
* 支持 ZODB 5 的并行提交功能:数据库写入者只有在会发生冲突时才会相互阻塞(除了在两阶段提交协议结束时分配事务 ID 的一个小窗口期;该期间仍然需要全局数据库锁)。
* 根据一些测试,RelStorage 处理并发的能力优于 ZEO 和 FileStorage 的标准组合。
* 由于 FileStorage 需要在内存中建立所有对象的索引,随着数据库的增长,启动时间会变长,而 RelStorage 无论数据库大小如何,都能快速启动。
* 能够故障转移到复制的 SQL 数据库。
* 已测试与 `gevent`_ 在 PostgreSQL、MySQL 和 SQLite 上的集成。
* 有一种简单的方法 (`zodbconvert`_) 可以(增量地)将 FileStorage 转换为 RelStorage,反之亦然。您也可以将 RelStorage 实例转换为不同的关系型数据库。这是一个通用工具,可用于在任意两个 ZODB 存储实现之间进行转换。
* 有一种简单的方法 (`zodbpack`_) 来打包数据库。
* 支持 `zodburi`_。
* 免费、开源 (ZPL 2.1)
.. _gevent: http://gevent.org
.. _zodbconvert: https://relstorage.readthedocs.io/en/latest/zodbconvert.html
.. _zodbpack: https://relstorage.readthedocs.io/en/latest/zodbpack.html
.. _zodburi: https://relstorage.readthedocs.io/en/latest/zodburi.html
# 数据库支持的特性
RelStorage 的某些特性仅在特定版本的特定数据库上受支持。如果数据库不支持该特性,RelStorage 仍然可以工作,但可能会有性能损失。
.. list-table:: 支持的特性
:widths: auto
:header-rows: 1
:stub-columns: 1
* -
- 并行提交
- 共享 readCurrent 锁
- 非阻塞 readCurrent 锁
- 流式 blobs
- 集中式事务 ID 分配
- 不涉及 Python 的原子锁和提交
* - PostgreSQL
- 是
- 是
- 是
- 使用 psycopg2 驱动
- 是
- 是,除了 PG8000 驱动
* - MySQL
- 是
- 是
- MySQL 8.0 原生支持,MySQL 5.7 上模拟
- 否,通过分块模拟
- 是
- 是
* - Oracle
- 是
- 否
- 是
- 是
- 否(可能可以实现)
- 否(可能可以实现)
* - SQLite
- 否
- 否
- 不适用(锁类型没有区别)
- 否,考虑使用 shared-blob-dir
- 不适用(本质上是的,因为它发生在单台机器上)
# - 否
# 文档
包含 `安装说明`_ 的文档托管在 `readthedocs`_ 上。
完整的 `更新日志`_ 也在那里。
.. image:: https://readthedocs.org/projects/relstorage/badge/?version=latest
:target: http://relstorage.readthedocs.io/en/latest/?badge=latest
.. _`installation instructions`: http://relstorage.readthedocs.io/en/latest/install.html
.. _`readthedocs`: http://relstorage.readthedocs.io/en/latest/
# .. _`changelog`: http://relstorage.readthedocs.io/en/latest/changelog.html
# 开发
RelStorage 托管在 GitHub 上:
```
https://github.com/zodb/relstorage
```
# 持续集成
每次提交推送和拉取请求都会运行测试套件。Linux 和 macOS 上的测试使用 GitHub Actions,而 Windows 上的构建由 AppVeyor 运行。
.. image:: https://github.com/zodb/relstorage/workflows/tests/badge.svg
:target: https://github.com/zodb/relstorage/actions
.. image:: https://ci.appveyor.com/api/projects/status/pccddlgujdoqvl83?svg=true
:target: https://ci.appveyor.com/project/jamadden/relstorage/branch/master
CI 上的构建会自动向 `coveralls.io`_ 提交更新以监控测试覆盖率。
.. image:: https://coveralls.io/repos/zodb/relstorage/badge.svg?branch=master&service=github
:target: https://coveralls.io/github/zodb/relstorage?branch=master
.. _coveralls.io: https://coveralls.io/github/zodb/relstorage
标签:Oracle, PostgreSQL, Python, RelStorage, SQLite, Syscall, Web开发, ZEO替代, ZODB, 关系型数据库, 分布式存储, 后端存储, 对象数据库, 并发控制, 序列化, 数据持久层, 无后门, 测试用例, 缓存, 逆向工具