|
Логическая репликация
|
|||
---|---|---|---|
#18+
Настроена логическая репликация на таблицу только на вставку. В таблице-источнике данные только добавляются в таблицу. Опытным путем выясняется, что при активации подписки при первичном заполнении таблицы-приемника записи заполняются не последовательно, как были вставлены в таблицы источнике, а в некоторых случаях в перемешку. Проверялось следующим образом: 1.вешался триггер на вставку в таблице-приемнике с пометкой timestamp'а 2. достоверно известно, что некоторые записи точно записывались с разницей в несколько часов При неоднократном повторении эксперимента, результат был идентичен. Это штатное поведение? Я считал, что данные поступают в приемник из wal'a последовательно, как и были записаны на источнике. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2019, 20:53 |
|
Логическая репликация
|
|||
---|---|---|---|
#18+
TrogloditНастроена логическая репликация на таблицу только на вставку. В таблице-источнике данные только добавляются в таблицу. Опытным путем выясняется, что при активации подписки при первичном заполнении таблицы-приемника записи заполняются не последовательно, как были вставлены в таблицы источнике, а в некоторых случаях в перемешку. Проверялось следующим образом: 1.вешался триггер на вставку в таблице-приемнике с пометкой timestamp'а 2. достоверно известно, что некоторые записи точно записывались с разницей в несколько часов При неоднократном повторении эксперимента, результат был идентичен. Это штатное поведение? Я считал, что данные поступают в приемник из wal'a последовательно, как и были записаны на источнике. Не путайте первичное заполнение и дальнейшую работу. Первичное заполнение вообще не использует wal из источника а переливает табицу как есть (потому что этот wal мог быть удален много лет назад например). 30.5.1. Initial Snapshot The initial data in existing subscribed tables are snapshotted and copied in a parallel instance of a special kind of apply process. This process will create its own temporary replication slot and copy the existing data. Once existing data is copied, the worker enters synchronization mode, which ensures that the table is brought up to a synchronized state with the main apply process by streaming any changes that happened during the initial data copy using standard logical replication. Once the synchronization is done, the control of the replication of the table is given back to the main apply process where the replication continues as normal. https://www.postgresql.org/docs/12/logical-replication-architecture.html#LOGICAL-REPLICATION-SNAPSHOT ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2019, 21:03 |
|
Логическая репликация
|
|||
---|---|---|---|
#18+
Maxim Boguk,спасибо за ответ. А что значит как есть. "Начальные данные существующих таблиц в подписке помещаются в снимок и копируются в параллельном экземпляре процесса применения особого вида. " Т.е. последовательность будет аналогична если на источнике сделать дамп? В таблице pk int с автоинкрементом и вставка происходит по увеличению ключа в таблице-источнике, т.е. сортировка по pk и физическая вставка совпадают, но на приемнике вставляется в 90% случаев как и на источнике, остальное в разнобой, но перемешанные записи всегда одни и те же, я несколько раз проверял. Просто для меня в этом случае важна последовательность обработки записей. Я, конечно, костыли, написал, но хотелось бы понимать почему так происходит, и можно ли этого избежать. И вдогонку, т.е. на момент " Этот процесс создаёт собственный слот репликации и производит копирование существующих данных." нужно чтобы был свободный дополнительный replication_worker на приемнике? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2019, 22:00 |
|
Логическая репликация
|
|||
---|---|---|---|
#18+
Troglodit...данные поступают в приемник из wal'a последовательно, как и были записаны на источнике. Про начальную синхронизацию не скажу, а вот последующая работа выполняется не совсем так. Данные на приемник будут отправляться по мере фиксации транзакций, а не записи в wal. Поэтому если одна транзакция вставит запись с id=100, а вторая с id=101 и при этом вторая будет зафиксирована раньше первой, то id=101 на приемнике появится раньше. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 12:20 |
|
Логическая репликация
|
|||
---|---|---|---|
#18+
Павел ЛузановПро начальную синхронизацию не скажу, а вот последующая работа выполняется не совсем так. Данные на приемник будут отправляться по мере фиксации транзакций, а не записи в wal. Поэтому если одна транзакция вставит запись с id=100, а вторая с id=101 и при этом вторая будет зафиксирована раньше первой, то id=101 на приемнике появится раньше. А разве в wal помещаются незафиксированные транзакции? Я всегда считал, что по сути проигрыш wal'a это повтор всех завершенных транзакций. В моем случае всего один producer, но даже если и не так было бы id-значение автоинкрементное, это не изменяет вопроса, я просто пишу из фактов, один писатель только добавляет одну или несколько записей в таблицу приемник. При первоначальной заливке данных на приемник и возникает данная ситуация, дальше такого эффекта не наблюдалось. Я и не сразу заметил, так как при разработке не заливал данные в начале. При неоднократном создании подписки, строго определенные записи вставляются в таблицу приемник, но не по порядку их фактической вставки по времени, но порядок все же какой то есть, т.к. порядок записей пусть и не правильный не меняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 22:26 |
|
Логическая репликация
|
|||
---|---|---|---|
#18+
TrogloditТ.е. последовательность будет аналогична если на источнике сделать дамп? Да аналогична/совпадать. Что совсем не гарантирует что она будет равна последовательности вставки... а только физическому порядку записей на диске (причем не обязательно с начала таблицы а может и с какого то другого места из-за synchronize_seqscans (boolean) This allows sequential scans of large tables to synchronize with each other, so that concurrent scans read the same block at about the same time and hence share the I/O workload. When this is enabled, a scan might start in the middle of the table and then “wrap around” the end to cover all rows, so as to synchronize with the activity of scans already in progress. This can result in unpredictable changes in the row ordering returned by queries that have no ORDER BY clause. Setting this parameter to off ensures the pre-8.3 behavior in which a sequential scan always starts from the beginning of the table. The default is on. ). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 23:00 |
|
Логическая репликация
|
|||
---|---|---|---|
#18+
Maxim Boguk,спасибо за ответ. теперь все точки расставлены. Огромное спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 23:24 |
|
|
start [/forum/search_topic.php?author=Catarina&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
get settings: |
10ms |
get forum list: |
13ms |
get settings: |
11ms |
get forum list: |
14ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 1560ms |
total: | 1775ms |
0 / 0 |