我想使用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
文件夹。blobstorage
文件夹,但将辅助Zope客户端指向具有blobstorage-zeocache
的单独shared-blob = off
文件夹我错过了一个非常简单的ZRS概念或配置吗?这完全有可能!
答案 0 :(得分:1)
辅助服务器需要是只读的,并且写入仅发生在主服务器上。 ZRS不执行MASTER-MASTER复制。
也许您可以路由进入主服务器zeoclients的POST请求,因为它们可能会写入数据库。
查看https://pypi.python.org/pypi/wildcard.readonly以了解处理读写问题。