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

在Plone 4.3.2上实现Zope复制服务(ZRS)时发生Blobstorage错误,plone,zope,buildout,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的非常规部分包括: 主要的,重要的 当我尝试使用辅助服务器上的Z

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

在尝试使用ZRS进行现有配置时遇到BLOB问题后,我在两台服务器上创建了vanilla Plone 4.3.2实例,以验证我是否遇到了相同的问题。buildout.cfg的非常规部分包括:

主要的,重要的 当我尝试使用辅助服务器上的Zope客户端创建Plone文件对象时。我收到的回溯是:

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似乎已正确复制到辅助ZEO,但无法在辅助服务器上使用Zope客户端创建文件,因为主服务器上的ZEO找不到
.tmp
文件

如果我在辅助服务器上的
[client 1]
[client 2]
下添加
共享blob=off
,我将收到错误:

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
,这会破坏复制的一半目的

我看到这个问题的说明:

关于将Zope客户端设置为只读以及将辅助ZEO服务器设置为只读,但不幸的是,这使我们无法使用PloneFormGen的Save Data adapter,我们在公共站点上广泛使用该适配器

根据这一经验,我对处理这一问题的想法是:

  • NFS从主服务器装载
    blobstorage
    ,并将辅助ZEO写入到并行
    blobstorage复制的
    文件夹中,该文件夹可以重命名以进行故障切换
  • 让辅助ZEO将blob复制到
    blobstorage
    文件夹,但将辅助Zope客户端指向一个单独的
    blobstorage zeocache
    文件夹,并关闭
    shared blob

我是否缺少一个真正简单的ZRS概念或配置?这是完全可能的

辅助服务器需要是只读的,并且只对主服务器进行写操作。ZRS不进行主-主复制

也许您可以将POST请求路由到主服务器ZeoClient,因为它们可能会写入数据库


查看如何处理读写问题。

想法:如果能够设置多个ZeoServer,并让它在需要写入数据库时明智地决定使用读写(主)。需要有时间/金钱和用例的人来实现它。读写的可能性更大,例如按需创建图像缩略图或AutoRole缓存,因此很难判断请求是否真的不会写入数据库。的确,我使用部署我的RO服务器,这样所有事务都会中止,并且不会出现读写错误。这听起来像是你的应用程序很容易欺骗你的用户:他们看到一个“这个工作”屏幕,可能会收到指向例如在事务期间创建但随后回滚的对象的链接。@Theuni-huh?只有当你不告诉你的用户应该在哪里编辑内容时,这种情况才会发生。关键是在RO服务器上生成图像缩放之类的内容时不要出错。显然,你不想在这里出错。此外,您还可以轻松地将管理站点和公共站点分开,从而提供更高的安全性——对不应该修改站点的用户禁用事务。
[versions]
Twisted = 13.2.0
zc.zrs = 2.4.4
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-'
ValueError: Directory layout `zeocache` selected for blob directory /usr/local/plone/zeocluster/var/blobstorage/, but marker found for layout `bushy`