Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
Добрый день, уважаемые форумчане!

Столкнулся со странной проблемой. Имеем два одинаковых PostgreSQL 9.2.7 - один мастер, второй Hot StandBy.
Всё работает давно, пережило несколько обновлений в рамках 9.2, всё хорошо. Размер БД - около 50 ГБ.
Но недавно столкнулся с одной проблемой, исследование которой привело вот к чему.

Имеем табличку в БД:

[root@master ~]# psql -U mybase
psql (9.2.7)
Type "help" for help.

mybase=# \d+ subscriptions
Table "public.subscriptions"
Column | Type | Modifiers | Storage | Stats target | Description
---------------- +---------+-----------+----------+-------------+------------------
subscription_id | integer | not null | plain | | Service ID
............
codeword | text | | extended | | Code word for this service
............

Indexes:
"subscriptions_pkey" PRIMARY KEY, btree (subscription_id)
"subscriptions_subscription_id_key" UNIQUE CONSTRAINT, btree (subscription_id)
.............
Has OIDs: no

Это сейчас я убрал индекс по полю codeword. В этом варианте всё работает и на мастере, и на слейве:

[root@slave]# psql -U mybase
psql (9.2.7)
Type "help" for help.

mybase=# select count(*) from subscriptions where codeword like 'ausyes';
count
-------
1
(1 row)

Стоит мне создать на мастере индекс по этому полю:

mybase=# create index subscriptions_codeword_idx on subscriptions using btree ( codeword );
CREATE INDEX

как тут же имеем на слейве:

mybase=# select count(*) from subscriptions where codeword like 'ausyes';
count
-------
0
(1 row)

На мастере всё продолжает чудесно работать. Удаляю индекс - всё восстанавливается и на слейве. Пробовал делать vacuum full, пробовал reindex table - не помогает.

Если индекс есть - то имеем на слейве:

mybase=# explain select count(*) from subscriptions where codeword like 'ausyes';
QUERY PLAN
-----------------------------------------------------------------------------------------------
Aggregate (cost=11.14..11.15 rows=1 width=0)
-> Bitmap Heap Scan on subscriptions (cost=4.27..11.14 rows=2 width=0)
Filter: (codeword ~~ 'ausyes'::text)
-> Bitmap Index Scan on subscriptions_codeword_idx (cost=0.00..4.27 rows=2 width=0)
Index Cond: (codeword = 'ausyes'::text)
(5 rows)

Если индекса нет - то:

mybase=# explain select count(*) from subscriptions where codeword like 'ausyes';
QUERY PLAN
--------------------------------------------------------------------
Aggregate (cost=61.66..61.66 rows=1 width=0)
-> Seq Scan on subscriptions (cost=0.00..61.65 rows=2 width=0)
Filter: (codeword ~~ 'ausyes'::text)
(3 rows)

Проблема обнаружилась ещё до обновления до 9.2.7. Обновился, отключил слейв, полностью переиндексировал и отвакуумировал мастер, сделал начальную копию master-> slave, включил репликацию, всё догналось... а проблема осталась.

Сами данные при этом на слейве присутствуют - стоит сделать условие, при котором индекс не будет использоваться, например, codeword like '%ausyes' - и эта запись находится. Т.е. проблема именно в индексе - вероятнее всего, он неправильно реплицируется.

Какие будут идеи?
28 фев 14, 17:58    [15648356]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Гость_0
Guest
mark_78843,

Вы видимо не внимательно читали или совсем не читал информацию о выпуске, и соответствено не делали vacuum с vacuum_freeze_table_age = 0
28 фев 14, 23:11    [15650057]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
laanet
Member

Откуда:
Сообщений: 36
У меня подобная ситуация. https://www.sql.ru/forum/1078090/potokovaya-replikaciya
4 мар 14, 16:34    [15671014]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
Не помогло, увы. Установил vacuum_freeze_table_age=0, делал vacuum, делал vacuum full, делал reindex - ничего не меняется.
На мастере запрос, который ищет эту запись, находит её как при наличии, так и при отсутствии индекса. На slave - если индекса нет, то запись находится. Но стоит только на мастере создать индекс по этому полю - как тут же слейв перестаёт находить эту запись. Удаляешь индекс - снова находит. Причём, зависит от значения поля, по которому ищу. Стоит поменять 'ausyes' на что-то другое (пробовал несколько вариантов) - всё работает. На железо тоже не думаю - одинаковая ситуация на разных компах. Похоже, что что-то с самой базой. Видимо, надо таки остановить всё (ох, как не хочется...), сделать дамп, убить каталог БД и восстановить всё из дампа.
10 мар 14, 12:25    [15698561]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3984
mark_78843,

а у вас случайно индекс не hash часом ???
10 мар 14, 13:56    [15698928]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Гость_0
Guest
mark_78843,

http://www.postgresql.org/docs/9.2/static/release-9-2-6.html

It's recommended that standby servers that have ever run any of the buggy releases be re-cloned from the primary (e.g., with a new base backup) after upgrading.
10 мар 14, 15:44    [15699207]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
Maxim,

нет, индекс btree. То, что hash не реплицируется - я в курсе )
10 мар 14, 19:08    [15700067]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
Именно так и делалось. Я отключал репликацию, вакуумировал базу с vacuum_freeze_table_age=0, реиндексил, делал vacuum full, удалял на слейве всё, делал начальное копирование БД и запускал репликацию.

Непонятно другое. По идее, после начального копирования БД (если исключить те изменения, которые за это время произошли на мастере), мы имеем точную бинарную копию каталога с БД. Изменения, которые происходят, потом накатываются из WAL на неё, но та таблица, о которой идёт речь, не изменяется - она по сути справочник. Т.е. у нас есть мастер и, на момент завершения начального копирования, - его ТОЧНАЯ копия. Т.е. одна и та же программа postgres работает с одними и теми же файлами на разных компах. И при этом мы получаем разные результаты. Вот это непонятно, ну не должно такого быть. Получается, что данные таки не совсем одинаковые? Сам перенос я делаю командой

# pg_basebackup -D data -F t -z -h node2 -U repl -P

после чего распаковываю получившийся .tgz
10 мар 14, 19:17    [15700119]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3984
mark_78843
Именно так и делалось. Я отключал репликацию, вакуумировал базу с vacuum_freeze_table_age=0, реиндексил, делал vacuum full, удалял на слейве всё, делал начальное копирование БД и запускал репликацию.

Непонятно другое. По идее, после начального копирования БД (если исключить те изменения, которые за это время произошли на мастере), мы имеем точную бинарную копию каталога с БД. Изменения, которые происходят, потом накатываются из WAL на неё, но та таблица, о которой идёт речь, не изменяется - она по сути справочник. Т.е. у нас есть мастер и, на момент завершения начального копирования, - его ТОЧНАЯ копия. Т.е. одна и та же программа postgres работает с одними и теми же файлами на разных компах. И при этом мы получаем разные результаты. Вот это непонятно, ну не должно такого быть. Получается, что данные таки не совсем одинаковые? Сам перенос я делаю командой

# pg_basebackup -D data -F t -z -h node2 -U repl -P

после чего распаковываю получившийся .tgz


а если запрос не like делать а
select count(*) from subscriptions where codeword='ausyes';

проблема остается?

можете воспроизвести на другой специально сделанной таблице?
(т.е. сделать минимальный test case который я смогу у себя проверить)?
11 мар 14, 03:29    [15702094]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
buddy_ekb
Member

Откуда:
Сообщений: 33
mark_78843,

проверьте, что на master и slave совпадают локали у пользователя, от имени которого запускается postmaster.
11 мар 14, 12:19    [15703460]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
Maxim Boguk,

вот как раз если like, то проблемы и нет. Но, насколько я понимаю, при этом индексы и не используются. проблема есть, когда сравниваешь на равенство.
12 мар 14, 15:28    [15711165]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
Maxim Boguk,

я попробую выбрать минимум, при котором проблема имеет место быть. Боюсь только, что это будет завязано на хранение остальных таблиц, что в "чистом виде" одна табличка глючить не будет.

Что уже пробовал - так это убирать записи в этой таблице все, кроме этой единственной - проблема воспроизводится даже в этом случае.
12 мар 14, 15:31    [15711200]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
А, я вопрос не понял сразу. При чётком сравнении - хоть like 'ausyes', хоть ='ausyes' - проблема остаётся.
А вот если, например, like '%ausyes' - то проблемы нет (других записей, которые под шаблон подходят, в таблице нет). Просто она в этом случае не пользуется индексами.
12 мар 14, 15:35    [15711225]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
buddy_ekb,

совпадают. Да и слово там чисто латиницей. А ещё, даже если бы и не совпадали - я бы поверил, что она может не находить то, что ищем, но по идее, это бы никак не зависело от индекса.
12 мар 14, 18:34    [15712661]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
buddy_ekb
Member

Откуда:
Сообщений: 33
mark_78843,

а с таким индексом можете протестировать вашу ситуацию?

create index subscriptions_codeword_idx on subscriptions ( codeword text_pattern_ops );
13 мар 14, 09:15    [15714943]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
buddy_ekb,

а вот в таком варианте - работает!

"subscriptions_codeword_idx" btree (codeword text_pattern_ops)

Сейчас ещё раз погляжу локали на обоих серверах...
13 мар 14, 12:30    [15716388]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Гость_0
Guest
mark_78843,

а какая ОС на обоих серверах?
13 мар 14, 14:57    [15717982]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
[mark@node2 ~]$ uname -a
FreeBSD node2 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Thu Feb 17 02:41:51 UTC 2011 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64

[mark@node1 ~]$ uname -a
FreeBSD node1 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:46:30 UTC 2012 root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
13 мар 14, 17:13    [15719169]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3984
mark_78843
[mark@node2 ~]$ uname -a
FreeBSD node2 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Thu Feb 17 02:41:51 UTC 2011 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64

[mark@node1 ~]$ uname -a
FreeBSD node1 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:46:30 UTC 2012 root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64


Случайно у вас не установлена одна база с ICU а другая без нее?
(ICU - внешняя библиотека реализации работы с UTF используемая на freebsd инсталяциях postgresql изза убогой нативной реализации UTF на FreeBSD).
14 мар 14, 01:37    [15721266]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
Maxim Boguk,

Точно! На node1 когда-то диски навернулись, я систему переустанавливал и, видимо, поставил PostgreSQL без ICU.
А на node2 - ставил ещё не я, и там с ICU. А при обновлении на 9.2.7 на обеих нодах конфиги были взяты старые.

Как следствие, сейчас node1 без ICU, node2 - с ICU. Как лучше поступить - чтобы оба были без, или оба с ICU?
14 мар 14, 17:27    [15725931]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
mark_78843
Member

Откуда:
Сообщений: 20
Maxim Boguk,

Перестроил с ICU. ВСЁ РАБОТАЕТ!!! С индексами, как положено. СПАСИБО огромное за помощь!

Блин, тупейшая ситуация... Грабли, замаскированные искуснейшим образом :/ Моё мнение - использование ICU сделать обязательным, а не опциональным. Либо, как минимум, не давать работать репликации, если сервера по-разному собраны - ведь ругается, когда на мастере и слейве конфиги разные, а тут, по сути, ситуация похожая.
14 мар 14, 18:31    [15726313]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Shab
Member

Откуда: Moscow
Сообщений: 207
Коллеги, добрый день!

Тоже имею проблемы с ICU. Боевая база 10.6.1-1.el6 на rhel6. icu 4.2.1.0.
При попытке поднять бекап кластера, сделанного probackup-ом, на rhel7 и софтом 10.6.1-1.el7 имеем:

2019-07-25 14:20:38.479 MSK [2450] FATAL: database files are incompatible with server
2019-07-25 14:20:38.479 MSK [2450] DETAIL: The database cluster was initialized with the ICU library of version 4.2.1.0, but the server was compiled with the ICU library of version 50.1.2.0.
2019-07-25 14:20:38.479 MSK [2450] HINT: It looks like you need to recompile or initdb.

Я так понимаю, что в датафайлах прописана версия ICU. Получается переносимость постгреса сильно-сильно ограничена.
В текущем кластере база делается так.
initdb -D $PGDATA --locale=en_US.UTF-8 --lc-collate=C --data-checksums

Может скомпилить софт без ICU и сделать бекап боевой, если это поможет?

Разжевывать не надо, дайте направление куда копать.

Спасибо.
25 июл 19, 18:26    [21934701]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 860
Shab,

честно говоря, такой ошибки вовсе не существует: https://github.com/postgres/postgres/blob/REL_10_STABLE/src/backend/access/transam/xlog.c#L4583
Особо коса смотря на упоминание probackup - у вас вообще postgresql? Или форк посторонний?

Ну и да, переносимость датафайлов сильно ограничена архитектурно.
25 июл 19, 20:08    [21934788]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
kira ivanov
Member

Откуда: питер
Сообщений: 140
Shab
Коллеги, добрый день!
Разжевывать не надо, дайте направление куда копать.
Спасибо.


версии операционок сводите к одинаковым
и говорите, что это postgrepro
25 июл 19, 20:36    [21934808]     Ответить | Цитировать Сообщить модератору
 Re: PostgreSQL - проблема с индексами при репликации  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 620
Shab,

Напишите о проблеме сюда: https://github.com/postgrespro/pg_probackup/issues
26 июл 19, 08:09    [21934962]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить