
Немного предыстории.
я используюЗРЭПдля репликации двух серверов друг с другом, и каждый сервер содержит один ZFS-пул, содержащий два набора данных в качестве мастера репликации и два набора в качестве цели репликации. Мастер-наборы содержат систему и VirtualBox-VM локального сервера, цели репликации те же самые с другого.
Кроме того, я делаю резервное копирование всех основных наборов на сервере на какой-то NAS с помощью rsync
. NAS довольно медленный, и резервное копирование занимает часы, поэтому реализованный подход заключается в приостановке виртуальных машин, создании одного снимка, восстановлении виртуальных машин и запуске rsync
созданного снимка. Важно то, что созданный вручную снимок не следовал соглашению об именовании ZREP и был уничтожен сразу после rsync
завершения. Сначала ZREP продолжал работать параллельно, запущенный cron
.
Проблема.
Но время от времени случалось, что ЗРЭП приходил в какое-то состояниебольше не могу синхронизироваться. Чтобы решить эту проблему, коллега сказал мне, что ему нужно удалить снимки и следовать процессу, чтобы снова инициализировать ZREP. Эта проблема была исправлена, когда мы rsync
больше не позволяли ZREP работать параллельно с нашим собственным снимком.
К сожалению, у меня нет конкретных подробностей этой ошибки, а коллега больше не доступен, но из его описания следовало, что возникла проблема с поиском общих предков снимков между мастером репликации и целью для постепенной синхронизации. Я думаю, сообщения об ошибках были примерно такими:
cannot receive incremental stream: most recent snapshot of zfs-pool/vbox/tori does not match incremental source
cannot open 'zfs-pool/vbox/tori@zrep_0001b7': dataset does not exist
Мое понимание того, как работает инкрементальная отправка/получение.
Насколько я понимаюдокументыидругой вопросыДля успешной пошаговой отправки снимков отправляющий мастер и принимающая цель должны совместно использовать тот один снимок, который используется в качестве аргумента 1, zfs send
и этот снимок должен быть текущим на принимающей цели.
Второй аргумент — произвольный более новый снимок, используемый ZFS для вычисления различий с одним общим снимком мастера и цели и отправки этих различий цели репликации. Поскольку оба используют один и тот же снимок, указанный в качестве аргумента 1, различия имеют смысл для цели и могут быть просто применены как есть.
Аргументы -i
против. -I
из моего понимания либо приводят к одному логическому снимку, получающему отправку, содержащему все вычисленные инкрементные данные главной стороны, ЛИБО к отправке всех промежуточных снимков, содержащих их инкрементные изменения. Так, например, -i
всегда приводит к ОДНОМУ новому снимку на цели против. -I
может привести к N дополнительным.
Создание и уничтожение промежуточных снимков между тем, что предоставляется как аргументы 1 и 2, zfs send -i
не должно быть проблемой, поскольку ZFS всегда вычисляет различия только между этими двумя предоставленными аргументами и не заботится о других промежуточных снимках. В случае ZREP это означает в теории, что пока я не вмешиваюсь в снимки, управляемые ZREP, не должно иметь значения, создаются ли дополнительные снимки во время его работы или нет. Просто потому, что специальные снимки ZREP всегда доступны, управляются ZREP и используются для вычисления различий для репликации. Поэтому в теории дополнительное создание снимков для rsync
резервного копирования не должно быть проблемой вообще.
Верны ли эти предположения?
Вопросы, не связанные с ZREP.
Безопасно ли вообще отправлять снимки ZFS пошагово, игнорируя некоторые промежуточные? Или необходимо отправлять ВСЕ промежуточные снимки, когда-либо созданные, в цель репликации, чтобы net get out of sync или что-то в этом роде? Как все зависит от -i
vs. -I
?
решение1
Да, вы по-прежнему получаете все промежуточные данные, но вы просто не можете вернуться к промежуточным данным.
Если у вас есть снимки 1, 2 и 3, а в удаленном пуле есть только снимок 1, вы можете дать ему снимок 3 и пропустить 2... он просто не сможет откатиться к состоянию '2'. Но данные все еще будут там.
Снимки описывают то, что было там в то время. Так что отсутствие снимка '2' на удаленном пуле, это как будто вы никогда не делали его в тот момент времени. Он буквально не знает о снимке '2' и о том, как все выглядело тогда.
Если вы передумаете, вам придется удалить снимок «3» на удаленном пуле, и только после этого вы сможете отправить «2», а затем снова «3».
https://www.reddit.com/r/zfs/comments/cfzdb3/is_it_safe_to_send_zfssnapshots_incrementally/euensuy/