Как можно непрерывно / инкрементно создавать резервные копии пулов zfs за пределами сайта?
Я понимаю, что отправка / получение
по ssh - это один из методов, однако он требует управления снимками вручную .
Я нашел некоторые инструменты, но большинство из них больше не поддерживаются.
Единственный инструмент, который выглядит многообещающим, - это https: // github. com / jimsalterjrs / sanoid , однако меня беспокоит, что малоизвестный инструмент может принести больше вреда, чем пользы, поскольку он может повредить / удалить данные.
Как выполняется непрерывное / добавочное резервное копирование zfs?
ZFS - невероятная файловая система, которая решает многие из моих потребностей в локальном и общем хранилище данных.
В то же время мне нравится идея кластеризованной файловой системы ZFS где угодно возможно, иногда это непрактично, или мне нужно какое-то географическое разделение узлов хранения.
Один из вариантов использования - высокопроизводительное реплицированное хранилище на серверах приложений Linux. Например, я поддерживаю устаревший программный продукт, который использует SSD-диски NVMe с малой задержкой для хранения своих данных. В приложении есть опция зеркалирования на уровне приложения, которая может реплицироваться на вторичный сервер, но часто неточна и составляет 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 //
Syncoid (Sanoid) - 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
У вас есть два разных способа сделать это:
rsync
или Bacula
. Здесь вы протестировали и (надеюсь) стабильное крупное программное обеспечение, которое можно настроить для крупных развертываний и которое можно использовать, даже если вы откажетесь от ZFS send / recv
. Это может быть ваше собственное решение, сценарий или расширенный сценарий из различных на Github и др., Или более многофункциональные инструменты, такие как Sanoid или ZnapZend (отправка / получение с поддержкой mbuffer и планами хранения) . В этом случае вы, скорее всего, не найдете больших, «корпоративных» (в отрицательном смысле) решений, но инструменты, которые выполняют только одну задачу и могут быть объединены с другими инструментами, чтобы удовлетворить вашу конкретную настройку. В целом , Я бы доверял только инструменту, исходный код которого доступен, и старался бы сделать его максимально простым. Если вы используете send / recv
, вам не нужно много управлять, вам просто нужно удалить снимок n-1 на локальной стороне при передаче и создании снимка n на удаленной стороне прошло успешно.
Вы можете разделить свой транспорт по своему усмотрению, он может быть даже асинхронным (моментальные снимки не нужно получать немедленно), если вы просто соблюдаете железное правило, что вы можете только отправить различие между локальным текущим / новым и предыдущим локальным снимком, и что предыдущий локальный снимок является самым последним на удаленной стороне (до тех пор, пока резервное копирование не завершится и все не будет сброшено).
Теперь, когда я думаю об этом, вы могли бы, вероятно, закодировать это в конечном автомате, а затем убедиться, что никакие непредвиденные случаи не могут проскользнуть.
Также проверьте автоматическое резервное копирование ZFS. Он прост в использовании и очень мощный. Он имеет больше возможностей по сравнению с другими упомянутыми решениями:https://github.com/psy0rz/zfs_autobackup