четверг, 7 февраля 2019 г.

FreeNAS, репликация данных между серверами (ZFS snapshots)

Для репликации данных между серверами FreeNAS существует 2 механизма:
  1. Механизм ZFS снэпшотов(снимки файловой системы)
  2. Rsync, имеющий 2 режима использования, в рамках статьи рассмотрю только один из них.
Мое личное убеждение - для репликации данных на серверах FreNAS между собой, а также с другими системами, использующими ZFS, необходимо применять механизм ZFS снимков, Rsync стоит применять только для репликации с прочими файловыми системами. Исключением, для применения Rsync на  ZFS, может быть только случай, когда необходимо реплицировать не всю файловую систему, а только одну папку на ней, и то правильнее оформить эту папку в виде ZFS датасета.

Немного теории:

Для подробностей рекомендую  раздел "репликация" книги "Мастерство FreeBSD:ZFS для профессионалов" авторы Michael W Lucas and Allan Jude.(ZFS отлично документирован и у Oracle, но следует иметь ввиду, что версия ZFS во FreeBSD и других портах ZFS  отличаются по доступному функционалу).
О понятиях:
  1. Dataset(набор данных) - элемент логической организации данных в пределах тома ZFS. При наличии точки монтирования, с точки зрения пользователя выглядит как каталог, создается с помощью zfs create....,(mkdir - не создает датасета).
  2. Snapshot(снимок набора данных), хранит в себе данные, которые были изменены после создания снимка,  в момент создания snapshot=dataset и его размер = 0, по мере роста изменений размер снимка растет(надо понимать, что в момент создания снимка не создается никаких копий данных, а происходит фиксация состояния файловой системы, дальнейшая модификация происходит в свободные области дискового пространства. Нельзя сделать снимок папки созданной при помощи mkdir.
  3. Клон - датасет, созданный из снимка. Содержит в себе изменения, которые в нем произошли относительно исходного снимка, может быть сделан основной веткой файловой системы с помошью комманды ZFS "promote"  (при этом основной датасет становится клоном).
  4. Уничтожение датасета влечет уничтожение всех снимков и клонов, родителем которых он является.
Из коммандной строки снимок датасета создается коммандой:
zfs snapshot mypool/mydataset@snapshot_Id 
После чего снимок может быть отправлен в файл следующей коммандой:
zfs send mypool/mydataset@snapshot_Id > backup_file
Будучи перенесенным на целевую систему снимок может быть восстановлен из файла коммандой:
zfs receive mypool/copy_dataset < backup_file
Для успешного проведения вышеуказанных манипуляций, пользователь, под которым они осуществляются, должен обладать правами ZFS snapshot, send на датасет - источник, а так же правами ZFS compression, create, mount, mountpoint и receive на целевом наборе данных. Права на набор данных устанавливаются коммандой:
zfs allow -u myuser permission1,permission2,permissionN mypool/mydataset
Это вся информация по коммандной строке, которая необходима в рамках данной темы. Для настройки собственно репликации между серверами она не нужна, но в случае необходимости отреплицировать большой набор данных по не очень быстрому соединению лучше первый снимок передать с помощью перемещения backup файла, как описано выше.

Настройка репликации через UI FreeNAS

исходные данные:
1. Необходимо на целевом хосте запустить службу sshd, для этого перейти во вкладку интерфейса "Службы" и активировать службу SSH
В настройках службы
разрешаем пользователю root подключение по паролю
Может потребоваться перезагрузка сервера.
На сервере источнике под пользователем root генерируем комплект ключей пользователя
ssh-keygen
копируем публичный ключ на целевой хост:
ssh-copy-id -i .ssh/id_rsa.pub remote_ip
вводим пароль рута удаленного хоста.
Проверяем результат:
ssh remote_ip
В итоге мы должны без пароля подключиться к целевому хосту.

Настройка заданий создания снимков(snapshots)

На хосте-источнике идем в меню "хранилище", вкладка "задания создания снимков", кнопка "добавить задание создания снимков"

Выбираем реплицируемый набор данных и настраиваем остальные параметры.

Во вкладке снимки, можем наблюдать созданные снимки.
Далее идем во вкладку "Задания репликации" и жмем добавить репликацию
Настраиваем создаваемое задание:

  1. Выбираем реплицируемый набор данных(можно выбрать только набор, для которого есть задание создания снимков)
  2. Указываем удаленный набор - будет корневым для реплицируемого, должен существовать на целевом хосте.
  3. Выбираем режим создания задания(настоятельно советую полуавтомат, ручной режим описываться не будет)
  4. IP/DNS-имя целевого хоста
  5. Временный токен удаленного хоста(только в полуавтоматическом режиме).
Временный токен получаем следующим образом: на целевом хосте идем во вкладку  задания репликации и жмем кнопку
Копируем токен из всплывающего окна
Вставляем в поле 5 на форме создания задания на хосте-источнике.
Задание создано и через время начнет выполняться.
Следует иметь ввиду, что на целевом хосте набор данных-реплика имеет режим "readonly" разрешить изменение датасета можно коммандой
zfs set readonly=off volume/backup
Но если мы его изменим, он не сможет принимать новые реплики. Лучше отклонировать желаемый снимок с указанием создаваемой из снимка системы. Для чего идем в снимки, и напротив желаемого снимка жмем кнопку
в открывшемся окне исправляем путь с названием снимка на желаемый
Наблюдаем среди томов вновь созданный.
С полученным датасетом можно полноценно работать, но помним что это клон, для того, чтоб сделать его основной веткой надо выполнить для него Promote

В итоге мы произведем восстановление датасета из снимка и можем полноценно ее использовать.
P.S.
Мною опробован вариант клонирования файловой системы из последнего снимка в саму себя, что так же привело к получению рабочей, доступной для записи файловой системы.

Комментариев нет:

Отправить комментарий