powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
17 сообщений из 17, страница 1 из 1
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732625
dbms_developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется WAL, куда последовательно складываются все успешно завершённые транзакции.
Имеется постоянно растущая в памяти масса грязных блоков B-Tree.
Имеется понятие checkpoint - точка в WAL, раньше которой весь журнал (WAL) можно выкинуть.

Как выглядит алгоритм процедуры checkpoint?

Хочется изложение в подобном виде:

1. Останавливаем все транзакции
2. Пишем в WAL последовательно все грязные блоки. WAL отрастает на 64 гига
3. fsync()
4. Пишем все записанные в WAL грязные блоки на их места в табличном файле на те места, откуда они были прочитаны изначально "чистыми"
5. fsync()
6. Пишем в WAL метку "checkpoint", делаем fsync()

Как на самом деле - не знаю. Это версия из головы.
Недостатки: остановка всех транзакций. Вроде бы жизни этого нет, в жизни checkpoint может быть растянут на долгие минуты (для снижения нагрузки на диск), а транзакции продолжают совершаться и записываться в WAL. То есть в WAL в течение многих минут попадают и грязные страницы и новые транзакции вперемешку. В этой ситуации в голову не приходит как можно сделать checkpoint со свойством "до меня можно выкинуть WAL". В голове есть идея как сделать 2 метки checkpoint - "checkpoint start", "checkpoint end" и выкидывать журнал можно до "checkpoint start" только при наличии метки "checkpoint end"...

Как оно на самом деле пошагово исполняется на низком уровне, на уровне write() каждой страницы, flush() и прочих низкоуровневых структур данных?
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732654
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_developer,

Вам сюда: https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlog.c#L8683

1. Транзакции не останавливаются совсем. Вместо этого берётся лок на запись в WAL на время вычисления позиции контрольной точки (начала точки).
Комментарий на #L8854 говорит о том, что позиция чекпойнта логически идёт перед последующей записью в WAL, хотя физически всё наоборот.
2. Нет, пишем на диск грязные блоки. Т.к. механизм предполагает, что любое изменение в кэше происходит строго после фиксации этих изменений в WAL, то дублировать в WAL ещё раз смысла нет.
3. Контрольная точка растянута во времени до checkpoint_timeout * checkpoint_completion_target. Если у вас точки раз в час и цель 0.9, то точка будет длится 54 минуты (При условии что всё настроено под нагрузку и нету всплесков). И там будет много fsync()-ов.
4. Это уже прошли в #2.
5. Прошли в #3.
6. Да, заканчиваем чекпойнт меткой, которую вычислили в #1. Т.е. при восстановлении мы должны прочитать эту метку, чтобы пройти контрольную точку, иначе надо читать WAL с предыдущей точки. Всё это в контрольном файле хранится, смотрится через pg_controldata утилиту.

После контрольной точки первая модификация любого блока пишет весь блок в WAL (full_page_writes). Выключать эту опцию не стоит, совсем. Но это значит, что вы не хотите! частых контрольных точек, ибо это лишняя нагрузка на WAL.
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732664
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_developer В голове есть идея как сделать 2 метки checkpoint - "checkpoint start", "checkpoint end" и выкидывать журнал можно до "checkpoint start" только при наличии метки "checkpoint end"...


Этот момент вы предположили совершенно верно. Так и есть (c мелкими деталями). ;)
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732667
dbms_developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

2. Насчёт "дублирования смысла нет": предположим размер блока 16 КБ. Мы прочитали чистый блок, потом пришла пара модификаций в этот блок. Две эти модификации легли последовательно в WAL как XLOG-записи. Теперь мы решили перезаписать перезаписать чистый блок прямо там откуда его прочитали грязным - перезаписали половину блока и всё упало. В WAL осталось 2 XLOG записи, говорящие о том, как модифицировать чистый блок, но чистого блока уже нет - на его месте лежит половина непонятно чего и половина нормального блока, т.е. по-сути мусор. При попытке накатить 2 наших XLOG изменения из WAL на чистый блок мы не сможем поднять этот чистый блок - неоткуда. Конец. Поэтому как можно не дублировать блок не понятно.
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732671
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_developervyegorov,

2. Насчёт "дублирования смысла нет": предположим размер блока 16 КБ. Мы прочитали чистый блок, потом пришла пара модификаций в этот блок. Две эти модификации легли последовательно в WAL как XLOG-записи. Теперь мы решили перезаписать перезаписать чистый блок прямо там откуда его прочитали грязным - перезаписали половину блока и всё упало. В WAL осталось 2 XLOG записи, говорящие о том, как модифицировать чистый блок, но чистого блока уже нет - на его месте лежит половина непонятно чего и половина нормального блока, т.е. по-сути мусор. При попытке накатить 2 наших XLOG изменения из WAL на чистый блок мы не сможем поднять этот чистый блок - неоткуда. Конец. Поэтому как можно не дублировать блок не понятно.

Вот по этому ПЕРВАЯ запись WAL для изменненого блока после checkpoint содержит ПОЛНЫЙ измененный БЛОК (full_page_writes как раз этим управляет).
И как раз чтобы не возникало ситуации 'перезаписали половину блока и всё упало' ;)
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732673
dbms_developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Видимо история тут не про checkpoint как точку, а про redo_point + checkpoint про пару.
Правильно я понимаю, что местом, перед которым WAL может быть физически выкинут - это именно redo_point, а не checkpoint, который идёт после и ссылается на redo_point?
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732679
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_developer,

Контрольная точка (checkpoint) — процесс, который синхронизирует грязные страницы и добавляет в WAL (redo) помету (точку, point) о том, что в этот момент времени все изменения были на диски и можно предыдущий WAL отрезать.

Т.е. одно есть часть другого и рассматривать их в отдельности смысла не вижу.
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732688
dbms_developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

читал такое: "checkpoint" - точка, до которой можно невозбранно выкинуть WAL.
Это бред?
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732689
dbms_developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

правильно я понимаю, что выкидывать WAL предполагается до REDO точки, а оставленный WAL должен содержать минимум REDO point и следующий за ней checkpoint? Пространство WAL между REDO точки и CHECKPOINT точки - не выкидываемо. Так?
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732692
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_developer,

Это корректно. На то она и “контрольная точка”.

Но тут нужно сделать оговорку о том, насколько глубоко мы погружаемся в детали. На самом верхнем уровне — так обычно говорят.
Если мы погружаемся ниже, то чекпойнт становится гораздо сложнее и мы уже говорим о разных компонентах, одна из которых — запись в REDO о состоявшейся контрольной точке.

Чекпойнт делает много чего в базе, и поведение отличается для мастера и для реплики.
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732695
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_developer,

Я не понимаю, что вы понимаете под CHECKPOINT точкой.
Все точки — суть позиции в WAL (redo) потоке и регистрируются в контрольном файле.

В частности:
Код: plaintext
1.
2.
Latest checkpoint location:           0/3020790
Latest checkpoint's REDO location:    0/3020790
Latest checkpoint's REDO WAL file:    000000010000000000000003

Т.е. всё что случилось до этого момента нам не важно, т.к. данные были синхронизированы и можно удалить WAL.
Всё что после — требуется для восстановления и удаление приведёт к потере данных. И понятно какой файл хватать и проигрывать.
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732698
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,

Ещё момент. Только начиная с 11-й версии база удалит WAL до контрольной точки.
До 11-й было иное поведение, надо было 2 контрольных точки для удаления: https://postgr.es/m/E1eC87v-0008E6-Ih@gemulon.postgresql.org]https://postgr.es/m/E1eC87v-0008E6-Ih@gemulon.postgresql.org
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732705
dbms_developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorovdbms_developer,

Я не понимаю, что вы понимаете под CHECKPOINT точкой.
Все точки — суть позиции в WAL (redo) потоке и регистрируются в контрольном файле.

В частности:
Код: plaintext
1.
2.
Latest checkpoint location:           0/3020790
Latest checkpoint's REDO location:    0/3020790
Latest checkpoint's REDO WAL file:    000000010000000000000003

Т.е. всё что случилось до этого момента нам не важно, т.к. данные были синхронизированы и можно удалить WAL.
Всё что после — требуется для восстановления и удаление приведёт к потере данных. И понятно какой файл хватать и проигрывать.

checkpoint я называю некую одну точку в WAL (смещение в байтах от абсолютного нуля WAL). Пытаюсь понять, действительно ли этим словом называется некая такая точка и какие у неё свойства. Могу ли я в любой момент времени невозбранно выкинуть все байты из WAL до этой точки? Понимаю, что словом checkpoint кто-то называет ещё и длинный ПРОЦЕСС.

Вы говорите, что все, что случилось до REDO location можно выкинуть? То есть, всё-таки не до CHECKPOINT, а именно до REDO точки (а CHECKPOINT идёт в WAL-файле после REDO)?
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732709
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_developer,

Самому ничего выкидывать не надо, может быть очень больно!

Пример с продукции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Latest checkpoint location:           6E71/C5AD2F50
Prior checkpoint location:            6E6F/370CC80
Latest checkpoint's REDO location:    6E6F/4A019638
Latest checkpoint's REDO WAL file:    0000000100006E6F0000004A
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
…
Minimum recovery ending location:     6E75/E850F6A8
Min recovery ending loc's timeline:   1

При восстановлении нужно проиграть с Latest checkpoint's REDO location до Minimum recovery ending location.
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39732728
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39733180
dbms_developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поизучал доку http://www.interdb.jp/pg/pgsql09.html
Попробовал просуммировать текущее понимание вопроса: https://telegra.ph/postgreSQL-checkpoint-logic-11-14
Просьба сюда не копипастить целиком, я может ещё отредактирую детали или читабельность.
...
Рейтинг: 0 / 0
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
    #39733527
dbms_developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё интересно: в чём разница между процессом скидывания грязных страниц в Postgres и MySQL InnoDB например. Там какие-то shadow write buffers у них.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]