Исходные данные
Три сервера:
s1. Pgpool-II 3.0.1 + PostgreSQL 8.4
s2. PostgreSQL 8.4
s3. PostgreSQL 8.4
В Pgpool-II включен режим репликации и балансировки, при этом в балансировку посредством выставления весов включены только сервера s1 и s2.
Настроена online-recovery типа PITR по оф. мануалу (
goo.gl/RC2WG).Описание проблемы
На разных нодах при инсерте через Pgpool-II в поле с modifier nextval() получаю разные значения.
Подробнее
Таблица, интересуемая колонка:
<br/>
Table "auth.user_temp"<br/>
| Column | Type | Modifiers | Storage | <br/>
| id | integer | not null default nextval('"auth".user_temp_id_seq'::regclass) | plain |<br/>
...<br/>
Запрос:
db=# INSERT INTO "auth"."user_temp" (name, password, last_ip, activation_key, contact_person, id_country, telephone, email, created) VALUES ('user1', '247bad9c4eb5', '127.0.0.1', '228bdcf1', 'FIO', '643', '09090909', 'user1@email.ru', '2011-06-18 01:57:38')<br/>
Изначально в Pgpool-II включена только первая нода, запрос на INSERT отрабатывает, в поле id с каждым запросом увеличивающееся на еденицу число.
Далее вызывается pcp_recovery_node для подключения второй ноды(s2) в pgpool. Выполняю INSERT на Pgpool-е, получаю идентичные id = 15(для примера) в auth.user_temp, все ок.
Но как только я подключаю через recovery третью ноду(s3), результат INSERT-а таков:
s1. id = 17
s2. id = 16
s3. id = 17
По факту получается, что данные идентичны лишь на Primary(s1) и ноде, которую синхронизировал последний раз, будь то s2 или s3, одна из них постоянно отстает по id в зависимости от порядка восстановления.
Это является критичным, так как далее внешние ключи фейлятся и ноды отключаюстя из pgpool.
Что пробовал:
1. Пробовал для s2 и s3 выставить вес = «0», чтобы отключить балансировку SELECT-ов. Не помогло.
2. Почитал, что в pgpool.conf: black_function_list = 'nextval,setval' желательно еще 'lastval,currval' добавлять, сделал, не помогло.