172 похожих чатов

Всем привет ) занимаюсь различными тестами, и заметил вот такой финт имеется

кластер патрони из двух нод, в нем табличка:

CREATE TABLE test(
id serial PRIMARY KEY,
text VARCHAR (255) NOT NULL
);

сделано было следующее :
- инсерт одной записи (insert into test (text) values ('some text');)
- смена мастера, посредством выключения юнита патрони
- инсерт одной записи
- смена мастера
- инсерт одной записи

в результате вот такая картина :

postgres=# select * from test;
id | text
----+-----------
1 | some text
34 | some text
67 | some text

при этом

postgres=# \d test_id_seq
Sequence "public.test_id_seq"
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
---------+-------+---------+------------+-----------+---------+-------
integer | 1 | 1 | 2147483647 | 1 | no | 1

вопрос, если для сиквенса не задан кеш (кеш = 1),
почему при смене мастера ( смена таймлинии), значение сиквенса убегает вперед ? (на 32 записи насколько могу судить)

пример простой, реально выполненный, интересна механика происходящего, и можно ли (нужно ли) с этим что-то делать ?

5 ответов

13 просмотров

Где-то писали, что при репликации сиквенсы передаются наперёд, т.к. передача сиквенса на каждый nextval - слишком большой оверхед.

Сергей-Кравчук Автор вопроса
Сергей Кравчук
хм, интересно, возможно, хочу пруфы )

По моему, вы только что этот пруф получили, когда эксперимент провели

> почему при смене мастера ( смена таймлинии), значение сиквенса убегает вперед ? Потому что выполняется recovery. > (на 32 записи насколько могу судить) Да, максимум на 32. > интересна механика происходящего Суть в предназначении sequence (быстрой генерации гарантированно уникальных значений). И эта гарантия должна быть durable, т.е. и в случае "падения" сервера PostgreSQL sequences тоже не должны выдавать дубликатов. Чтобы этого добиться, их изменения нужно писать в WAL. Но если писать каждое изменение, то быстрой генерации уже не получается. Поэтому пишется только каждое 32-ое изменение, причём пишется "заранее", т.е. в WAL записывается состояние, как если бы сервер уже использовал будущие 32 значения, естественно. Отсюда и "прыжки" sequences при recovery (другие СУБД, кстати, ведут себя так же и по тем же причинам). Что касается реализации — см. https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/commands/sequence.c;h=72bfdc07a49e83fcb720ed39b90d5405bd5c2ad9;hb=HEAD#l661 (код nextval_internal(), определение SEQ_LOG_VALS). > и можно ли (нужно ли) с этим что-то делать ? Соответственно, нет и нет.

Сергей-Кравчук Автор вопроса
Yaroslav Schekin
> почему при смене мастера ( смена таймлинии), зна...

примерно такого ответа и я ждал, большое спасибо )

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

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
читать файл максимально быстро? странный вопрос))
zamtmn
53
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
2
Кто создает тут ботов для телеграмм групп ?
Antskup
8
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
Карта сайта