|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
Имеется 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() и прочих низкоуровневых структур данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 18:02 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 18:49 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
dbms_developer В голове есть идея как сделать 2 метки checkpoint - "checkpoint start", "checkpoint end" и выкидывать журнал можно до "checkpoint start" только при наличии метки "checkpoint end"... Этот момент вы предположили совершенно верно. Так и есть (c мелкими деталями). ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 19:14 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
vyegorov, 2. Насчёт "дублирования смысла нет": предположим размер блока 16 КБ. Мы прочитали чистый блок, потом пришла пара модификаций в этот блок. Две эти модификации легли последовательно в WAL как XLOG-записи. Теперь мы решили перезаписать перезаписать чистый блок прямо там откуда его прочитали грязным - перезаписали половину блока и всё упало. В WAL осталось 2 XLOG записи, говорящие о том, как модифицировать чистый блок, но чистого блока уже нет - на его месте лежит половина непонятно чего и половина нормального блока, т.е. по-сути мусор. При попытке накатить 2 наших XLOG изменения из WAL на чистый блок мы не сможем поднять этот чистый блок - неоткуда. Конец. Поэтому как можно не дублировать блок не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 19:17 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
dbms_developervyegorov, 2. Насчёт "дублирования смысла нет": предположим размер блока 16 КБ. Мы прочитали чистый блок, потом пришла пара модификаций в этот блок. Две эти модификации легли последовательно в WAL как XLOG-записи. Теперь мы решили перезаписать перезаписать чистый блок прямо там откуда его прочитали грязным - перезаписали половину блока и всё упало. В WAL осталось 2 XLOG записи, говорящие о том, как модифицировать чистый блок, но чистого блока уже нет - на его месте лежит половина непонятно чего и половина нормального блока, т.е. по-сути мусор. При попытке накатить 2 наших XLOG изменения из WAL на чистый блок мы не сможем поднять этот чистый блок - неоткуда. Конец. Поэтому как можно не дублировать блок не понятно. Вот по этому ПЕРВАЯ запись WAL для изменненого блока после checkpoint содержит ПОЛНЫЙ измененный БЛОК (full_page_writes как раз этим управляет). И как раз чтобы не возникало ситуации 'перезаписали половину блока и всё упало' ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 19:27 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
vyegorov, Видимо история тут не про checkpoint как точку, а про redo_point + checkpoint про пару. Правильно я понимаю, что местом, перед которым WAL может быть физически выкинут - это именно redo_point, а не checkpoint, который идёт после и ссылается на redo_point? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 19:28 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
dbms_developer, Контрольная точка (checkpoint) — процесс, который синхронизирует грязные страницы и добавляет в WAL (redo) помету (точку, point) о том, что в этот момент времени все изменения были на диски и можно предыдущий WAL отрезать. Т.е. одно есть часть другого и рассматривать их в отдельности смысла не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 19:48 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
vyegorov, читал такое: "checkpoint" - точка, до которой можно невозбранно выкинуть WAL. Это бред? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 19:55 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
vyegorov, правильно я понимаю, что выкидывать WAL предполагается до REDO точки, а оставленный WAL должен содержать минимум REDO point и следующий за ней checkpoint? Пространство WAL между REDO точки и CHECKPOINT точки - не выкидываемо. Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 19:57 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
dbms_developer, Это корректно. На то она и “контрольная точка”. Но тут нужно сделать оговорку о том, насколько глубоко мы погружаемся в детали. На самом верхнем уровне — так обычно говорят. Если мы погружаемся ниже, то чекпойнт становится гораздо сложнее и мы уже говорим о разных компонентах, одна из которых — запись в REDO о состоявшейся контрольной точке. Чекпойнт делает много чего в базе, и поведение отличается для мастера и для реплики. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 19:59 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
dbms_developer, Я не понимаю, что вы понимаете под CHECKPOINT точкой. Все точки — суть позиции в WAL (redo) потоке и регистрируются в контрольном файле. В частности: Код: plaintext 1. 2.
Т.е. всё что случилось до этого момента нам не важно, т.к. данные были синхронизированы и можно удалить WAL. Всё что после — требуется для восстановления и удаление приведёт к потере данных. И понятно какой файл хватать и проигрывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 20:07 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 20:11 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
vyegorovdbms_developer, Я не понимаю, что вы понимаете под CHECKPOINT точкой. Все точки — суть позиции в WAL (redo) потоке и регистрируются в контрольном файле. В частности: Код: plaintext 1. 2.
Т.е. всё что случилось до этого момента нам не важно, т.к. данные были синхронизированы и можно удалить WAL. Всё что после — требуется для восстановления и удаление приведёт к потере данных. И понятно какой файл хватать и проигрывать. checkpoint я называю некую одну точку в WAL (смещение в байтах от абсолютного нуля WAL). Пытаюсь понять, действительно ли этим словом называется некая такая точка и какие у неё свойства. Могу ли я в любой момент времени невозбранно выкинуть все байты из WAL до этой точки? Понимаю, что словом checkpoint кто-то называет ещё и длинный ПРОЦЕСС. Вы говорите, что все, что случилось до REDO location можно выкинуть? То есть, всё-таки не до CHECKPOINT, а именно до REDO точки (а CHECKPOINT идёт в WAL-файле после REDO)? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 20:25 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
dbms_developer, Самому ничего выкидывать не надо, может быть очень больно! Пример с продукции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
При восстановлении нужно проиграть с Latest checkpoint's REDO location до Minimum recovery ending location. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 20:49 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 22:25 |
|
Как устроен checkpoint алгоритм в PostgreSQL на низком уровне?
|
|||
---|---|---|---|
#18+
Поизучал доку http://www.interdb.jp/pg/pgsql09.html Попробовал просуммировать текущее понимание вопроса: https://telegra.ph/postgreSQL-checkpoint-logic-11-14 Просьба сюда не копипастить целиком, я может ещё отредактирую детали или читабельность. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2018, 18:43 |
|
|
start [/forum/topic.php?fid=53&fpage=48&tid=1995498]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 154ms |
0 / 0 |