ZFS - це неймовірна файлова система і вирішує багато моїх місцевих та спільних потреб у сховищі даних.
Хоча мені подобається ідея кластеризації ZFS, де це можливо, іноді це не практично, або мені потрібно певне географічне розділення вузлів зберігання.
Один із випадків використання у мене - це високоефективне реплікуване зберігання на серверах додатків Linux. Наприклад, я підтримую застарілий програмний продукт, який отримує вигоду з низькозатримних SSD-накопичувачів 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 //
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/
Моніт є надзвичайно гнучким планувальником роботи та керівником виконання. За замовчуванням він працює на 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