я использую ЗРЭП для репликации двух серверов друг с другом, и каждый сервер содержит один ZFS-пул, содержащий два набора данных в качестве главного сервера репликации и два набора в качестве цели репликации. Мастер-наборы содержат систему и виртуальные машины VirtualBox на локальном сервере, репликация нацелена на то же самое с другого.
Кроме того, я создаю резервные копии всех основных наборов для каждого сервера на некотором NAS, используя rsync
. NAS работает довольно медленно, и для успешного резервного копирования требуются часы, поэтому реализованный подход заключается в приостановке виртуальных машин, создании одного моментального снимка, восстановлении виртуальных машин и разрешении rsync
запускаем из созданного снимка. Важно то, что созданный вручную снимок не соответствовал соглашению об именах ZREP и был уничтожен сразу после rsync
закончил снова. Сначала ЗРЭП продолжал работать одновременно, начатый cron
.
Но время от времени случалось, что ЗРЭП попадал в какое-то состояние. не может больше синхронизировать. Чтобы решить эту проблему, коллега сказал мне, что ему нужно удалить моментальные снимки и снова выполнить процесс инициализации ZREP. Эта проблема была решена тем, что ZREP не запускался параллельно с rsync
и нашего собственного снимка в конце концов.
К сожалению, мне не хватает конкретных деталей этой ошибки, и коллега больше не доступен, но из его описания казалось, что возникла проблема с поиском общих предков моментальных снимков между мастером репликации и целью для постепенной синхронизации. Я думаю, что сообщения об ошибках были примерно такими:
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
vs. -I
Насколько я понимаю, это либо приводит к отправке одного логического снимка, содержащего все вычисленные инкрементные данные главной стороны, либо отправляет все промежуточные снимки, содержащие их инкрементные изменения. Так, например, -i
приводит к ОДНОМУ новому снимку на цели всегда vs. -I
может привести к N дополнительным.
Создание и уничтожение промежуточных снимков между тем, что предоставляется как аргументы 1 и 2 для zfs send -i
не должно быть никаких проблем, потому что ZFS всегда вычисляет разницу только между этими двумя предоставленными аргументами и не заботится о каких-либо других промежуточных снимках. В случае ZREP это теоретически означает, что до тех пор, пока я не вмешиваюсь в снимки, управляемые ZREP, это не должно иметь никакого значения, будут ли созданы дополнительные снимки во время его работы или нет. Просто потому, что специальные снимки ZREP доступны всегда, управляются ZREP и используются для расчета различий для репликации. Так что теоретически, дополнительно создавая снимки для rsync
и резервное копирование вообще не должно быть проблемой.
Верны ли эти предположения?
Безопасно ли вообще отправлять снимки ZFS, постепенно игнорируя некоторые промежуточные? Или необходимо отправить ВСЕ промежуточные моментальные снимки, созданные когда-либо, на цель репликации, чтобы получить рассинхронизацию или что-то еще? Как все зависит от -i
vs. -I
?
Да, вы все равно получаете все промежуточные данные, но вы просто не можете перемотать их назад.
Если у вас есть снимки 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/