跳转到主要内容

RelStorage和ZEO的zc.buildout配方

项目描述

针对创建RelStorage和ZEO配置的具有观点的配方,特别是针对多数据库量身定制。

https://travis-ci.org/NextThought/nti.recipes.zodb.svg?branch=master https://coveralls.io/repos/github/NextThought/nti.recipes.zodb/badge.svg?branch=master

限制

单个buildout可以使用一个 RelStorage配方或一个 ZEO配方。它不能同时使用两者,或每个各超过一个。这是因为这两个配方都会写入相同的配置文件

依赖关系

这里定义的配方使用 collective.recipe.template 输出配置文件,并使用 z3c.recipe.mkdir 创建隐式定义的目录。使用 zc.zodbrecipes 创建 ZEO 服务器。不需要手动安装这些,因为 buildout 将在需要时负责使它们可用。

目录和文件

这里定义的配方使用由 zc.recipe.deployment 定义的目录结构和变量。应该有一个名为 deployment 的 buildout 部分,它使用此配方。或者(当从多个配置中组合 buildout 时特别有用),可以定义一个 deployment 部分,手动列出这些目录。还需要包含应拥有创建的文件和目录的用户名。

[deployment]
bin-directory = ${buildout:bin-directory}
cache-directory = ${:run-directory}/caches
crontab-directory = ${:root-directory}/etc/cron.d
data-directory = ${:root-directory}/data
etc-directory = ${:root-directory}/etc
log-directory = ${:root-directory}/var/log
logrotate-directory = ${:root-directory}/etc/logrotate.d
rc-directory = ${:root-directory}/bin/rc
root-directory = ${buildout:root-directory}
run-directory = ${:root-directory}/var

部署配方负责创建所需的目录,但在这里我们将手动创建。我们将定义一个通用的配置片段,将其包含在未来的示例中。

>>> write(sample_buildout, 'deployment.cfg',
... """
... [deployment]
... root-directory = ${buildout:directory}
... data-directory = ${:root-directory}/data
... etc-directory = ${:root-directory}/etc
... log-directory = ${:root-directory}/var/log
... run-directory = ${:root-directory}/var
... rc-directory = ${:root-directory}/bin/rc
... cache-directory = ${:run-directory}/caches
... logrotate-directory = ${:root-directory}/etc/logrotate.d
... crontab-directory = ${:root-directory}/etc/cron.d
... user = user
...
... [directories]
... recipe = z3c.recipe.mkdir
... create-intermediate = true
... mode = 0700
... paths =
...    ${deployment:etc-directory}
...    ${deployment:run-directory}
...    ${deployment:cache-directory}
...    ${deployment:data-directory}
...    ${deployment:log-directory}
...    ${deployment:rc-directory}
...    ${deployment:logrotate-directory}
...    ${deployment:crontab-directory}
... """)

这两个配方都在 etc-directory 中创建两个文件。

zodb_conf.xml

此文件旨在使用 ZODB.config.databaseFromFiledatabaseFromURL 读取。如果指定了多个存储,它们将按提供的顺序列出,创建一个多数据库,其中第一个列出的存储作为“根”数据库。

zeo_uris.ini

此文件提供与 zodb_conf.xml 相同的数据库配置(实际上,它引用了该文件),但它以单个 URL 字符串的形式提供,可以使用 zodburi 读取。这可以方便地以字符串的形式传递。

配方选项

这里定义的两个配方都接受一些通用选项。

storages

必需。由空格分隔的存储名称列表。这些中的每一个都将添加到生成的配置文件中,以便客户端使用(以及对于 ZEO,服务器提供)。

这只能在配方部分中直接定义。

compress

如果设置为“decompress”(默认值),则每个存储将用 zc.zlibstorage 包装,该包装仅压缩现有记录。如果设置为“compress”,则新记录也将被压缩。

设置为“none”以完全禁用包装器。

可以在配方部分中设置。如果没有在那里定义,则将使用 environment 部分中定义的值,然后再回退到默认值。

存储和数据库选项

一些选项可用于配置 ZODB 数据库。这些由两个配方使用,可以在每个数据库级别定义(参见每个配方的说明)。默认值是内置的,但在配方部分设置值将为所有存储提供一个新默认值。此外,为了向后兼容和组合 buildout 配置,如果存在名为 <part>_opts 的部分,其中 <part> 是配方部分的名称,则在那里定义的选项将覆盖配方部分中定义的选项,但将被为单个存储定义的选项覆盖。

这些配置选项与 ZODB 连接池及其缓存有关。

[zeo]
recipe = nti.recipes.zodb:zeo
storages = users
cache_size = 50
[zeo]
recipe = nti.recipes.zodb:zeo
storages = users

[zeo_opts]
cache_size = 50
cache_size

控制 ZODB 每个连接的对象缓存。将此设置为足够大以包含应用程序的工作集可能非常重要,特别是在读密集型工作负载中。设置过大可能会浪费内存。

pool_size

控制ZODB池中保留的ZODB连接数。设置足够大以适应应用程序将处理的并发活动(请求)数量非常重要。池中的每个连接都持有资源,如其缓存,在RelStorage的情况下,还有RDBMS套接字和可能的memcache套接字。设置过大可能会浪费内存和文件描述符。

通常,打开数据库并关闭连接将创建连接(如果需要),然后将其返回到池中(如果池未满)。然而,在多数据库的情况下,当需要从辅助数据库加载对象时,活动连接将请求与该数据库的连接,当活动连接关闭时,辅助连接也会关闭但不会返回到池中。相反,活动(主)连接保留对其的引用,将来将使用它。这会导致所有辅助池基于主池的效率。因此,除了主数据库之外的所有内容的池大小实际上是没有意义的(如果应用程序总是从打开该主数据库开始),但这个池大小控制着一切。

调用DB.connectionDebugInfo()可以显示不正确大小的池:池中的连接有‘opened’为None,而正在使用的连接有一个时间戳和打开的时间长度。

pool_timeout

一个时间间隔值(接受一个整数秒数或以字符's'、'm'、'h'、'd'结尾的整数,分别表示秒、分钟、小时或天),指定空闲连接在关闭之前允许在池中保持多长时间。实际上,没有默认值,因此连接永远不会超时。

RelStorage

relstorage配方创建配置以在历史免费模式下连接到MySQL、PostgreSQL或SQLite3 RelStorage数据库。(Oracle不受支持。)

有几种不同的配置存储的方式。如果您有多个存储位于同一个数据库服务器上,并且该服务器上还有其他数据库(SQLAlchemy等),您可能对使用共享的环境部分来包含服务器位置和账户凭证感兴趣。

默认情况下,数据库的名称与存储名称相同。保留存储名称的大小写(这对于跨数据库引用很重要。)

>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... extends = deployment.cfg
... parts = directories relstorage
...
... [environment]
... sql_user = the_user
... sql_host = the_server
... sql_passwd = the_passwd
...
... [relstorage]
... recipe = nti.recipes.zodb:relstorage
... storages = Users Sessions
... compress = none
... """)
>>> print_(system(buildout), end='')
Installing...
Installing relstorage.
>>> ls(sample_buildout, 'etc')
d  cron.d
d  logrotate.d
-  zeo_uris.ini
-  zodb_conf.xml
>>> cat(sample_buildout, 'etc', 'zodb_conf.xml')
%import relstorage
<zodb Users>
  cache-size 100000
  database-name Users
  pool-size 60
  <relstorage Users>
    <mysql>
      # This comment preserves whitespace
          db Users
          host the_server
          passwd the_passwd
          user the_user
    </mysql>
  blob-dir /sample-buildout/data/Users.blobs
  cache-local-dir /sample-buildout/var/caches/data_cache/Users.cache
  cache-local-mb 300
  cache-prefix Users
  commit-lock-timeout 60
  keep-history false
  name Users
  pack-gc false
  shared-blob-dir false
</relstorage>
</zodb>
<zodb Sessions>
  cache-size 100000
  database-name Sessions
  pool-size 60
  <relstorage Sessions>
    <mysql>
      # This comment preserves whitespace
          db Sessions
          host the_server
          passwd the_passwd
          user the_user
    </mysql>
  blob-dir /sample-buildout/data/Sessions.blobs
  cache-local-dir /sample-buildout/var/caches/data_cache/Sessions.cache
  cache-local-mb 300
  cache-prefix Sessions
  commit-lock-timeout 60
  keep-history false
  name Sessions
  pack-gc false
  shared-blob-dir false
</relstorage>
</zodb>
>>> cat(sample_buildout, 'etc', 'zeo_uris.ini')
[ZODB]
uris = /sample-buildout/etc/zodb_conf.xml#users /sample-buildout/etc/zodb_conf.xml#sessions

可以在配方级别和以存储名称命名的部分中进行许多配置(与zeo配方不同,前面有配方名称,后面有'_storage_opts'后缀),但一些设置只能在配方或环境部分进行配置。

enable-persistent-cache

默认为true。

cache-servers

已弃用。要使用的memcache服务器的列表。可以在配方或环境级别进行配置。

blob-cache-size

默认为无大小限制。

>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... extends = deployment.cfg
... parts = directories relstorage
...
... [environment]
... sql_user = the_user
... sql_host = the_server
... sql_passwd = the_passwd
...
... [relstorage]
... recipe = nti.recipes.zodb:relstorage
... storages = users sessions
... compress = none
... pack_gc = true
... commit_lock_timeout = 10
... pool_timeout = 42s
...
... [relstorage_users_storage_opts]
... cache_size = 42
... cache_local_mb = 2
... sql_user = custom_user
... """)
>>> print_(system(buildout), end='')
Uninstalling relstorage...
Installing relstorage.
>>> ls(sample_buildout, 'etc')
d  cron.d
d  logrotate.d
-  zeo_uris.ini
-  zodb_conf.xml
>>> cat(sample_buildout, 'etc', 'zodb_conf.xml')
%import relstorage
<zodb users>
  cache-size 42
  database-name users
  pool-size 60
  pool-timeout 42s
  <relstorage users>
    <mysql>
      # This comment preserves whitespace
          db users
          host the_server
          passwd the_passwd
          user custom_user
    </mysql>
  blob-dir /sample-buildout/data/users.blobs
  cache-local-dir /sample-buildout/var/caches/data_cache/users.cache
  cache-local-mb 2
  cache-prefix users
  commit-lock-timeout 10
  keep-history false
  name users
  pack-gc true
  shared-blob-dir false
</relstorage>
</zodb>
<zodb sessions>
  cache-size 100000
  database-name sessions
  pool-size 60
  pool-timeout 42s
  <relstorage sessions>
    <mysql>
      # This comment preserves whitespace
          db sessions
          host the_server
          passwd the_passwd
          user the_user
    </mysql>
  blob-dir /sample-buildout/data/sessions.blobs
  cache-local-dir /sample-buildout/var/caches/data_cache/sessions.cache
  cache-local-mb 300
  cache-prefix sessions
  commit-lock-timeout 10
  keep-history false
  name sessions
  pack-gc true
  shared-blob-dir false
</relstorage>
</zodb>

配置适配器

默认假设MySQL适配器。使用配方或存储级别的sql_adapter设置来更改此设置。

可以使用sql_adapter_extra_args<adapter>部分添加额外的配置。这通常用于选择驱动程序。

如果将其更改为postgresql,则将根据sql_*设置构建DSN。可以将sql_adapter_args设置为完全指定<adapter>部分的内容(这将禁用sql_adapter_extra_args)。

>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... extends = deployment.cfg
... parts = directories relstorage
...
... [environment]
... sql_user = the_user
... sql_host = the_server
... sql_passwd = the_passwd
...
... [relstorage]
... recipe = nti.recipes.zodb:relstorage
... storages = users sessions
... compress = none
... sql_adapter = postgresql
... sql_adapter_extra_args =
...     driver gevent psycopg2
...
... [relstorage_users_storage_opts]
... sql_adapter = sqlite3
... sql_adapter_extra_args =
...     driver gevent sqlite3
... """)
>>> print_(system(buildout), end='')
Uninstalling relstorage...
Installing relstorage.
>>> ls(sample_buildout, 'etc')
d  cron.d
d  logrotate.d
-  zeo_uris.ini
-  zodb_conf.xml
>>> cat(sample_buildout, 'etc', 'zodb_conf.xml')
%import relstorage
<zodb users>
  cache-size 100000
  database-name users
  pool-size 60
  <relstorage users>
    <sqlite3>
      # This comment preserves whitespace
          data-dir /sample-buildout/data/relstorage_users_storage
          driver gevent sqlite3
    </sqlite3>
  blob-dir /sample-buildout/data/users.blobs
  cache-local-dir /sample-buildout/var/caches/data_cache/users.cache
  cache-local-mb 300
  cache-prefix users
  commit-lock-timeout 60
  keep-history false
  name users
  pack-gc false
  shared-blob-dir true
</relstorage>
</zodb>
<zodb sessions>
  cache-size 100000
  database-name sessions
  pool-size 60
  <relstorage sessions>
    <postgresql>
      # This comment preserves whitespace
          driver gevent psycopg2
          dsn dbname='sessions' user='the_user' password='the_passwd' host='the_server'
    </postgresql>
  blob-dir /sample-buildout/data/sessions.blobs
  cache-local-dir /sample-buildout/var/caches/data_cache/sessions.cache
  cache-local-mb 300
  cache-prefix sessions
  commit-lock-timeout 60
  keep-history false
  name sessions
  pack-gc false
  shared-blob-dir false
</relstorage>
</zodb>

其他文件

如果将配方中的 write-zodbconvert 设置为 true,则将生成一组配置文件,用于使用 zodbconvert 将 RelStorage 和 FileStorage 之间的转换。

>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... extends = deployment.cfg
... parts = directories relstorage
...
... [environment]
... sql_user = the_user
... sql_host = the_server
... sql_passwd = the_passwd
...
... [relstorage]
... recipe = nti.recipes.zodb:relstorage
... storages = users
... compress = none
... write-zodbconvert = true
... """)
>>> print_(system(buildout), end='')
Uninstalling relstorage...
Installing relstorage.
>>> ls(sample_buildout, 'etc')
d  cron.d
d  logrotate.d
d  relstorage
-  zeo_uris.ini
-  zodb_conf.xml
>>> ls(sample_buildout, 'etc', 'relstorage')
-  users_from_relstorage_conf.xml
-  users_to_relstorage_conf.xml

ZEO

可以使用 zeo 配方来创建 ZEO 客户端和 ZEO 服务器的配置。这仅适用于个人或测试环境。

选项

relstorage 配方一样,它需要一个或多个存储。可以在 zeo 部分设置选项,以便应用于所有存储,在以存储命名的部分中配置服务器,或在以客户端命名的部分中配置客户端。请注意,客户端也会从服务器继承配置选项。

pack-gc

默认为 false。这只能在配方部分设置。

>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... extends = deployment.cfg
... parts = directories zeo
...
... [zeo]
... recipe = nti.recipes.zodb:zeo
... storages = Users Sessions
... compress = none
... pack-gc = true
...
... [users_storage_opts]
... pack-gc = true
... pool_size = 25
...
... [sessions_client_opts]
... cache-size = 42
... """)

并且它创建几个配置文件

>>> print_(system(buildout), end='')
Uninstalling relstorage...
Installing zeo.
>>> ls(sample_buildout, 'etc')
d  cron.d
d  logrotate.d
-  zeo-zdaemon.conf
-  zeo-zeo.conf
-  zeo_uris.ini
-  zodb_conf.xml
-  zodb_file_uris.ini

标准文件

与 RelStorage 一样,创建了 zodb_conf.xmlzeo_uris.ini 文件(由于测试中的一个问题,URI 中缺少了 zconfig:// 前缀)

>>> cat(sample_buildout, 'etc', 'zodb_conf.xml')
<zodb Users>
  cache-size 100000
  database-name Users
  pool-size 25
  <zeoclient>
    blob-dir /sample-buildout/data/Users.blobs
    name Users
    server /sample-buildout/var/zeosocket
    shared-blob-dir true
    storage 1
  </zeoclient>
</zodb>
<zodb Sessions>
  cache-size 42
  database-name Sessions
  pool-size 60
  <zeoclient>
    blob-dir /sample-buildout/data/Sessions.blobs
    name Sessions
    server /sample-buildout/var/zeosocket
    shared-blob-dir true
    storage 2
  </zeoclient>
</zodb>
>>> cat(sample_buildout, 'etc', 'zeo_uris.ini')
[ZODB]
uris = /sample-buildout/etc/zodb_conf.xml#users /sample-buildout/etc/zodb_conf.xml#sessions

zdaemon.conf

此文件以构建出部分的名称为前缀,是使用 zdaemon 命令的 -C 选项运行的 ZEO 服务器的配置。

>>> cat(sample_buildout, 'etc', 'zeo-zdaemon.conf')
<runner>
  daemon on
  directory /sample-buildout/var
  program /sample-buildout/bin/runzeo -C /sample-buildout/etc/zeo-zeo.conf
  socket-name /sample-buildout/var/zeo-zdaemon.sock
  transcript /sample-buildout/var/log/zeo-zeo.log
  user user
</runner>
<BLANKLINE>
<eventlog>
  <logfile>
    path /sample-buildout/var/log/zeo-zeo.log
  </logfile>
</eventlog>

zeo-conf.conf

这是实际的 ZEO 服务器配置,同样以前缀为部分名称。

>>> cat(sample_buildout, 'etc', 'zeo-zeo.conf')
<zeo>
  address /sample-buildout/var/zeosocket
</zeo>
<BLANKLINE>
<filestorage 1>
  blob-dir /sample-buildout/data/Users.blobs
  pack-gc true
  path /sample-buildout/data/Users.fs
</filestorage>
<BLANKLINE>
<filestorage 2>
  blob-dir /sample-buildout/data/Sessions.blobs
  pack-gc true
  path /sample-buildout/data/Sessions.fs
</filestorage>
<BLANKLINE>
<eventlog>
  <logfile>
    format %(asctime)s %(message)s
    level DEBUG
    path /sample-buildout/var/log/zeo.log
  </logfile>
</eventlog>

zodb_file_uris.ini

有意未记录。仅限专家使用。

项目详情


下载文件

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

源分发

nti.recipes.zodb-1.1.0.tar.gz (33.4 kB 查看哈希值

上传时间

构建分发

nti.recipes.zodb-1.1.0-py2.py3-none-any.whl (28.7 kB 查看哈希值

上传时间 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面