Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

zfs-auto-снимок - 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 $?

Монит - 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

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

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

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

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

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