Я хотел бы использовать ZRS для репликации данных между двумя серверами (zopeserver-1 и zopeserver-2), при этом ZEO на zopeserver-1 является основным и реплицируется на вторичный ZEO на zopeserver-2. На каждом сервере будет два клиента Zope, каждый из которых указывает на основной ZEO на zopeserver-1.
Столкнувшись с проблемами с большими двоичными объектами при попытке заставить нашу существующую конфигурацию работать с ZRS, я создал экземпляры vanilla Plone 4.3.2 на двух серверах, чтобы убедиться, что у меня возникли те же проблемы. Неванильные части buildout.cfg:
Начальный
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:
[versions]
Twisted = 13.2.0
zc.zrs = 2.4.4
Когда я пытаюсь создать объекты Plone File с помощью клиентов Zope на вторичном сервере. Трассировка, которую я получаю:
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-
создается в хранилище BLOB-объектов на вторичном сервере, а не на первичном сервере.
Похоже, что большие двоичные объекты правильно реплицируются на вторичный ZEO при создании клиентом Zope на первичном сервере, но невозможно создать файл с помощью клиента Zope на вторичном сервере, потому что ZEO на первичном сервере не может найти файл .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. Насколько я понимаю, это снижает производительность и не реплицирует blobstorage
основного сервера, что наполовину снижает цель репликации.
Я вижу примечание в этом вопросе:
Plone Переключение на ZRS с помощью plone .recipe.zeoserver на Plone 4.3.1
о настройке клиентов Zope только для чтения, а также вторичного сервера ZEO, но, к сожалению, это не позволяет нам использовать адаптер сохранения данных PloneFormGen, который мы широко используем в наших общедоступных места.
Основываясь на этом опыте, я думаю о подходе к этой проблеме:
- NFS монтирует
blobstorage
из первичного на вторичный, а вторичный ZEO записывает в параллельную папкуblobstorage-replicated
, которую можно переименовать для отработки отказа. - Пусть вторичный ZEO реплицирует большие двоичные объекты в папку
blobstorage
, но указывает вторичным клиентам Zope на отдельную папкуblobstorage-zeocache
сshared-blob = off
Я пропустил действительно простую концепцию или конфигурацию ZRS? Что вполне возможно!