Задать вопрос
kav
@kav

Pgpool-II. После failback-а на нодах разные nextval()?

Исходные данные

Три сервера:

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 &quot;auth.user_temp&quot;<br/>
 | Column | Type | Modifiers | Storage | <br/>
 | id | integer | not null default nextval('&quot;auth&quot;.user_temp_id_seq'::regclass) | plain |<br/>
...<br/>



Запрос:
db=# INSERT INTO &quot;auth&quot;.&quot;user_temp&quot; (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' добавлять, сделал, не помогло.
  • Вопрос задан
  • 3130 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Albertum
@Albertum
Последовательности в PostgreSQL не транзакционны, т.е. после отката транзакции значение последовательности останется увеличенным.

www.postgresql.org/docs/8.4/static/functions-sequence.html
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы