Ошибки хранилища BLOB-объектов при внедрении служб репликации Zope (ZRS) на Plone 4.3.2

Я хотел бы использовать 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? Что вполне возможно!


person tsimkins    schedule 11.02.2014    source источник


Ответы (1)


Вторичные серверы должны быть доступны только для чтения, а запись происходит только на первичный сервер. ZRS не выполняет репликацию MASTER-MASTER.

Возможно, вы можете направлять POST-запросы, поступающие на zeoclients основного сервера, поскольку они потенциально могут записывать в базу данных.

Проверьте https://pypi.python.org/pypi/wildcard.readonly для обработки проблемы с записью при чтении.

person vangheem    schedule 12.02.2014
comment
Идея: было бы неплохо иметь возможность настроить несколько zeoservers и разумно решить использовать чтение-запись (основной) при необходимости записи в базу данных. Нужен кто-то со временем/деньгами и прецедентом для его реализации. - person vangheem; 12.02.2014
comment
Существует больше возможностей для записи при чтении, таких как создание эскизов изображений по запросу или кэширование AutoRole, поэтому было бы трудно сказать, действительно ли запрос не будет записываться в базу данных. - person Ulrich Schwarz; 13.02.2014
comment
действительно, я развертываю свои серверы RO с помощью pypi.python.org/pypi/wildcard.readonly поэтому все транзакции прерываются, и вы не получаете ошибок записи при чтении. - person vangheem; 17.02.2014
comment
Похоже, ваше приложение может легко лгать вашим пользователям: они видят этот рабочий экран и могут получать ссылки, например, на объекты, которые были созданы во время транзакции, но затем отменены. - person Theuni; 14.07.2014
comment
@ Теуни, а? Это произойдет только в том случае, если вы не проинструктируете своих пользователей, где они должны редактировать контент. Дело в том, чтобы не ошибиться, когда такие вещи, как масштаб изображения, генерируются на сервере RO. Очевидно, вы не хотите ошибиться там. Кроме того, у вас есть дополнительное преимущество, состоящее в том, что вы можете легко разделить административные и общедоступные сайты, чтобы вы могли обеспечить большую безопасность - транзакции отключены для людей, которым не следует изменять сайт. - person vangheem; 16.07.2014