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