LINUX.ORG.RU
решено ФорумAdmin

[PostgreSQL][pgpool2] 1c кластер

 


0

1

Здравствуйте!

Собираю такую схему:


                           pgpool2 

                          .       .
                         .         .
                        .           .

                      node1        node2 


Тип - Master/slave
pgpool2 - pgpool2 v3.1
node* - pgsql@etersoft v9.0.4
клиент - 1с v7.7 под wine@etersoft + selta@etersoft
stream репликация между нодами.

Клиент 1с не может установить соединение с базой, ошибка базы:

ERROR:  cannot execute LOCK TABLE during recovery
STATEMENT:  BEGIN;LOCK TABLE _1SCONNECT IN EXCLUSIVE MODE;

Ошибка 1с клиента:

"Доступ к базе данных на сервере возможен только из одного каталога информационной базы!"
Это возникает на node2, которая в read-only (slave)
При обычном положении вещей, такая ошибка клиента возникает, когда он видит более одного соединения к базе из одного каталога информационной базы.
Напрямую к node1 подключается. То есть грабли в pgpool2. По докумантации он не должен посылать на slave некоторые запросы, в том числе, BEGIN.

Знаю, что в конфиге pgpool2 можно выставить black_function_list, тогда на slave не будут посылаться запросы в списке. Пробовал различные варианты. Может, каким-то образом запретить pgpool2 сообщать клиенту об ошибке?

Единственное, когда работает, если исключить node2 из pgpool.
Что можете подсказать, какие решения можете предложить и, возможно, поделитесь вашими решениями подобного рода?

★★★★★

никогда такое не трогал, но чисто логически

LOCK TABLE
+
node2, которая в read-only
=
как-то это странно пытаться залочить то, во что нельзя писать

dimon555 ★★★★★
()

Вот решение, кому нужно.
Написал разработчикам. Вот ответ:

It's a know limitation of pgpool-II.

From:
http://pgpool.projects.postgresql.org/pgpool-II/doc/pgpool-en.html#restriction

pgpool-II cannot process multi-statement queries.

BEGIN;LOCK TABLE _1SCONNECT IN EXCLUSIVE MODE; is recognized as «BEGIN;» statement by pgpool-II and it thinks that it needed to sent to both master and slave.

The solution is to avoid multi-statement queries like BEGIN;LOCK TABLE_1SCONNECT IN EXCLUSIVE MODE;

Instead:

BEGIN; LOCK TABLE _1SCONNECT IN EXCLUSIVE MODE;

uspen ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.