Как выполнить инкрементное / непрерывное резервное копирование пула zfs?

25

Как можно непрерывно / постепенно создавать резервные копии пулов zfs вне офиса?

Я признаю, что send/receiveover ssh - это один из методов, который включает в себя необходимость управлять моментальными снимками вручную.

Я нашел некоторые инструменты, но большинство из них больше не поддерживаются.

Один инструмент, который выглядит многообещающим, это https://github.com/jimsalterjrs/sanoid, однако меня беспокоит то, что малоизвестный инструмент может принести больше вреда, чем пользы, поскольку он может повредить / удалить данные.

Как выполняются непрерывные / инкрементные резервные копии zfs?

Greg
источник
2
Я отвечу чуть позже, но у меня есть решение, которое выполняет этот тип репликации каждые 15 секунд с основного ZFS-сервера на дополнительный.
ewwhite

Ответы:

33

ZFS - невероятная файловая система, которая решает многие из моих локальных и общих потребностей хранения данных.

Хотя мне нравится идея кластеризованной ZFS везде, где это возможно, иногда она не практична, или мне нужно географическое разделение узлов хранения.

Один из вариантов использования, который у меня есть, - высокопроизводительное реплицированное хранилище на серверах приложений Linux. Например, я поддерживаю устаревший программный продукт, который использует SSD-диски с низкой задержкой для своих данных. В приложении есть опция зеркального отображения на уровне приложения, которая может реплицироваться на вторичный сервер, но зачастую она неточна и представляет собой 10-минутный RPO .

Я решил эту проблему, имея дополнительный сервер (также работающий с ZFS на аналогичном или отличающемся оборудовании), который может быть локальным, удаленным или и тем, и другим. Объединив три утилиты, подробно описанные ниже, я создал решение для репликации, которое дает мне непрерывную репликацию, глубокое сохранение моментальных снимков и гибкие опции отработки отказа.

zfs-auto-snapshot - https://github.com/zfsonlinux/zfs-auto-snapshot

Просто удобный инструмент для периодических снимков уровня файловой системы ZFS. Я обычно работаю со следующим графиком по объемам производства:

# /etc/cron.d/zfs-auto-snapshot

PATH="/usr/bin:/bin:/usr/sbin:/sbin"

*/5 * * * * root /sbin/zfs-auto-snapshot -q -g --label=frequent --keep=24 //
00 * * * * root /sbin/zfs-auto-snapshot -q -g --label=hourly --keep=24 //
59 23 * * * root /sbin/zfs-auto-snapshot -q -g --label=daily --keep=14 //
59 23 * * 0 root /sbin/zfs-auto-snapshot -q -g --label=weekly --keep=4 //
00 00 1 * * root /sbin/zfs-auto-snapshot -q -g --label=monthly --keep=4 //

Синкоид (Саноид) - https://github.com/jimsalterjrs/sanoid

Эта программа может запускать произвольную привязку / репликацию файловой системы ZFS к вторичной цели. Я использую только синкоидную часть продукта.

Предполагая, что server1 и server2 , простая команда запускается с server2 для извлечения данных с server1 :

#!/bin/bash

/usr/local/bin/syncoid root@server1:vol1/data vol2/data

exit $?

Monit - https://mmonit.com/monit/

Monit - чрезвычайно гибкий планировщик заданий и менеджер исполнения. По умолчанию он работает с 30-секундным интервалом, но я изменяю конфигурацию, чтобы использовать 15-секундный базовый временной цикл.

Пример конфигурации, которая запускает указанный выше сценарий репликации каждые 15 секунд (1 цикл)

check program storagesync with path /usr/local/bin/run_storagesync.sh
        every 1 cycles
        if status != 0 then alert

Это просто автоматизировать и добавить с помощью управления конфигурацией. Оборачивая выполнение снимка / репликации в Monit, вы получаете централизованный статус, управление заданиями и оповещения (электронная почта, SNMP, пользовательский сценарий).


Результатом является то, что у меня есть серверы, которые имеют несколько месяцев ежемесячных снимков и много точек отката и хранения в пределах: https://pastebin.com/zuNzgi0G - плюс непрерывная непрерывная 15-секундная атомная реплика:

# monit status

Program 'storagesync'
  status                            Status ok
  monitoring status                 Monitored
  last started                      Wed, 05 Apr 2017 05:37:59
  last exit value                   0
  data collected                    Wed, 05 Apr 2017 05:37:59
.
.
.
Program 'storagesync'
  status                            Status ok
  monitoring status                 Monitored
  last started                      Wed, 05 Apr 2017 05:38:59
  last exit value                   0
  data collected                    Wed, 05 Apr 2017 05:38:59
ewwhite
источник
4
Спасибо за публикацию, ваш ответ феноменален и именно то, что я искал (от задержки до мониторинга процесса). Также читаю github.com/ewwhite/zfs-ha/wiki, и я очень впечатлен. Еще раз спасибо :)
Грег
6

У вас есть два разных способа сделать это:

  1. Традиционный, независимый от файловой системы способ, который / использовался в течение последних десятилетий, с такими инструментами, как rsyncили Bacula. Там вы протестировали и (мы надеемся) стабильное, большое программное обеспечение, которое можно настроить для масштабных развертываний и использовать его, даже если вы переключаетесь с ZFS
  2. Один из инструментов, которые используют ZFS send/recv. Это может быть либо ваше собственное решение, либо сценарий, либо расширенный сценарий из различных приложений Github et al., Либо более многофункциональные инструменты, такие как Sanoid или ZnapZend (send / recv с поддержкой mbuffer и планами хранения). В этом случае вы, скорее всего, не найдете больших «корпоративных» (в негативном смысле) решений, но инструменты, которые выполняют только одну задачу и могут быть объединены с другими инструментами для удовлетворения ваших конкретных настроек.

В общем, я бы доверял только инструменту, исходный код которого доступен, и старался бы сделать его максимально простым. При использовании send/recvвам не нужно много управлять, вам просто нужно удалить снимок n-1 на локальной стороне, когда передача и создание снимка n на удаленной стороне были успешными.

Вы можете разделить ваш транспорт любым удобным вам способом, он может быть даже асинхронным (моментальные снимки не должны быть получены немедленно), если вы просто соблюдаете железное правило, согласно которому вы можете отправлять только разницу между локальным текущим / новым и локальным предыдущим снимком и что локальный предыдущий моментальный снимок является самым последним на удаленной стороне (до тех пор, пока резервное копирование не завершится и все не будет сброшено).

Теперь, когда я думаю об этом, вы, вероятно, могли бы закодировать это в конечном автомате, а затем быть уверенным, что никакие непредвиденные случаи не могут ускользнуть.

user121391
источник
Я не вижу, как rsyncмасштабируемое решение будет масштабироваться для непрерывной репликации большой файловой системы масштаба предприятия. Изменения могут произойти быстрее, чем rsyncих обнаружить.
Эндрю Хенле
2
@AndrewHenle Я бы тоже не стал пропагандировать это, я просто хотел представить это, потому что вопрос не определял объем / размер данных или временные рамки. Так что в случае нечастого действия это может быть вероятностью, если это должно быть независимым от файловой системы. Конечно, вы потеряли бы хорошие дельты на уровне блоков ...
user121391
@ user121391 Полностью согласен с вами относительно того, как открыть исходный код. Спасибо за ваш подробный ответ.
Грег
@ Dave так же , как я печатаю ...
ewwhite
1
очень рекомендую znapzend
Трент Ллойд