@snpgg

Можно ли гарантировать надежность снапшота?

Имею большую базу в постгресе(пару терабайт), восстанавливать из бэкапа очень долго, в регламент компании не укладывается. Хочется делать снэпшоты, но вот вообще никакой нет гарантии, что, делая снэпшот базы под нагрузкой, сам снэпшот будет консистентен. Вдруг что-то из буфера в диск не успело доехать, записалось только часть файла. Хочется иметь либо 100% гарантию либо увидеть случай когда снэпшот может сломаться.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
@rPman
Создание снапшота - атомарная операция (lvm/btrfs/zfs), с точки зрения восстановления базы данных из этого снапшота, это будет то же самое, как если бы вы нажали reset на компьютере, даже лучше - сняли все процессы сервера баз данных с помощью жесткого kill -9 $pid (SIGKILL, его не отловить) ведь записи на диск не прервутся.
ВАЖНО, если база данных находится на одном томе! невозможно создать атомарно снапшот на нескольких томах. Вариант с запуском всей системы в виртуальной машине и созданием снапшотов ее средствами не рассматриваем, такой конфиг абсурден с точки зрения производительности.

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

С некоторой вероятностью, базу данных придется поднимать вручную, т.е. потребуется проверка целостности, например логи будут повреждены и их нужно будет удалять и т.п. Но обычно postgres справляется с аварийным выключением неплохо.

p.s. но я бы не рекомендовал такой способ все равно, особенно на постоянной основе.
Для создания резервной копии на живой базе я рекомендую использовать вторую машину, на которую настроена репликация базы. В этом случае эту вторую базу можно остановить, снять снапшот, возобновить работу (чтобы репликация догнала master - меньше нагрузка на диски, меньше оперативной памяти и допустим слабый процессор) а снапшот спокойно копировать, не опасаясь каких-либо проблем.
Данный способ нужно использовать на постоянной основе (мало того, требования к backup slave серверу значительно ниже чем рабочему master), и сам процесс создания копии никак не повлияет на работу исходной базы, когда как использование оригинальной базы, даже со снапшотом, значительно понизит ее производительность, так как копирование сильно нагружает дисковую подсистему.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
AshBlade
@AshBlade
Просто хочу быть счастливым
Если мы говорим про утилиты постгреса для бэкапа, то они будут согласованными, т.к. влияют на работу сервера. Например, заставляют все страницы сброситься, выполнить чек-поинт и т.д.
Например, pg_basebackup:

pg_basebackup is used to take a base backup of a running PostgreSQL database cluster


Но если речь идет об утилитах, работающих с фс напрямую (dd, cp и т.д.), то нет - гарантировать ничего нельзя. Как уже было сказано, некоторые буферы могут быть не сброшены, записана только часть страницы и т.д.
Ответ написан
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Гарантированно консистентный снимок большой базы лучше делать с помощью реплики с задержкой применения изменений и архивирования WAL. А холодный бэкап делать вдобавок.

См. напр. https://habr.com/ru/companies/slurm/articles/445446/
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Непонятно каким образом вы от проблемы PostgresQL перешли к проблеме zfs?

Мне кажется что существует только один способ проверки работоспособности снепшота.
А именно - сразу после того как он сделан - поднять на нем БД и посмотреть что в журналах
нет ошибок. Если ошибки есть - повторить снепшот еще раз.

Sad, but true.
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Когда появляются требования ко времени восстановления из бекапа - то почти наверняка уже доросли до полноценного PiTR и лучше рассматривать именно полновесный бекап postgresql, чем сооружать снэпшоты.
Берёте pgbackrest, настраиваете архив WAL, желаемую периодичность снятия basebackup и сроки удержания. Ну либо barman или wal-g, тут по вкусу, смысл тот же.

Получаете полностью корректный с точки зрения самой базы снэпшот (ака basebackup), а так же возможность восстановиться на произвольную точку времени, а не только на момент снятия слепка. Без штрафа производительности записи от снэпшота LVM, без CoW файловых систем.

Реплика - не бекап, решают разные задачи. Реплика ответит на вопрос "как быстро мы можем восстановить базу при полном отказе основного сервера", но не ответит на вопрос "как быстро можем восстановить удалённую табличку". Если у вас важная база и всё ещё нет реплики - ну, это странно =)
Ответ написан
Комментировать
@elbrus56
Рекомендуется останавливать операции в БД, делать flush cache, потом делать снапшот zfs.

Сам санпшот zfs, как и файловая система, достаточно надежен сам по себе за счет чексумм блоков.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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