在Plone 4.3.2上实现Zope复制服务(ZRS)时出现Blobstorage错误

时间:2014-02-11 15:58:47

标签: plone zope buildout

我想使用ZRS在两个服务器(zopeserver-1和zopeserver-2)之间复制数据,zopeserver-1上的ZEO是主服务器,并且复制到zopeserver-2上的辅助ZEO。每个服务器都有两个Zope客户端,都指向zopeserver-1上的主ZEO。

在尝试使用ZRS使我们的现有配置工作时遇到blob问题后,我在两台服务器上创建了vanilla Plone 4.3.2实例,以验证我遇到了同样的问题。 buildout.cfg的非vanilla部分是:

主要

eggs =
    ...
    zc.zrs

[zeoserver]
<= zeoserver_base
recipe = plone.recipe.zeoserver[zrs]
zeo-address = 8100
replicate-to = 5000

[client1]
<= client_base
recipe = plone.recipe.zope2instance
zeo-address = zopeserver-1:${zeoserver:zeo-address}
http-address = 8081

[client2]
<= client_base
recipe = plone.recipe.zope2instance
zeo-address = zopeserver-1:${zeoserver:zeo-address}
http-address = 8082

二次

eggs =
    ...
    zc.zrs

[zeoserver]
<= zeoserver_base
recipe = plone.recipe.zeoserver[zrs]
replicate-from = zopeserver-1:5000
keep-alive-delay = 60
zeo-address = 8100
read-only = on

[client1]
<= client_base
recipe = plone.recipe.zope2instance
zeo-address = zopeserver-1:${zeoserver:zeo-address}
http-address = 8081

[client2]
<= client_base
recipe = plone.recipe.zope2instance
zeo-address = zopeserver-1:${zeoserver:zeo-address}
http-address = 8082

buildout中的“Picked Versions”是:

[versions]
Twisted = 13.2.0
zc.zrs = 2.4.4

当我尝试使用辅助服务器上的Zope客户端创建Plone File对象时。我收到的追溯是:

Traceback (innermost last):
  Module ZPublisher.Publish, line 146, in publish
  Module Zope2.App.startup, line 301, in commit
  Module transaction._manager, line 89, in commit
  Module transaction._transaction, line 329, in commit
  Module transaction._transaction, line 446, in _commitResources
  Module ZODB.Connection, line 781, in tpc_vote
  Module ZEO.ClientStorage, line 1098, in tpc_vote
  Module ZEO.ClientStorage, line 929, in _check_serials
IOError: [Errno 2] No such file or directory: '/usr/local/plone/zeocluster/var/blobstorage/0x00/0x00/0x00/0x00/0x00/0x00/0x00/0xea/0x006ObqSw.tmp-'

因为此0x006ObqSw.tmp-文件是在辅助服务器上的blobstorage上创建的,而不是在主服务器上创建的。

当主服务器上的Zope客户端创建blob时,看起来blob会正确复制到辅助ZEO,但是由于主服务器上的ZEO可以使用辅助服务器上的Zope客户端,因此无法创建文件找不到.tmp文件。

如果我在辅助字词shared-blob = off[client 1]下添加了[client 2],则会收到错误消息:

ValueError: Directory layout `zeocache` selected for blob directory /usr/local/plone/zeocluster/var/blobstorage/, but marker found for layout `bushy`

删除/usr/local/plone/zeocluster/var/blobstorage的内容以允许它创建zeocache布局允许创建文件,但这会通过ZEO流式传输所有blob。我的理解是,这会降低性能,并且不会复制主要的blobstorage,这会使复制目的失败一半。

我在这个问题中看到了这个注释:

Plone Switching to ZRS using plone.recipe.zeoserver on Plone 4.3.1

关于将 Zope客户端设置为只读以及辅助 ZEO服务器,但不幸的是,这阻止我们使用PloneFormGen的Save Data适配器,我们广泛使用我们的公共网站。

根据这些经验,我对这个问题的看法是:

  • 从辅助服务器上的主服务器挂载blobstorage,并将辅助ZEO写入可以重命名以进行故障转移的并行blobstorage-replicated文件夹。
  • 让辅助ZEO将blob复制到blobstorage文件夹,但将辅助Zope客户端指向具有blobstorage-zeocache的单独shared-blob = off文件夹

我错过了一个非常简单的ZRS概念或配置吗?这完全有可能!

1 个答案:

答案 0 :(得分:1)

辅助服务器需要是只读的,并且写入仅发生在主服务器上。 ZRS不执行MASTER-MASTER复制。

也许您可以路由进入主服务器zeoclients的POST请求,因为它们可能会写入数据库。

查看https://pypi.python.org/pypi/wildcard.readonly以了解处理读写问题。