Пришлось наконец столкнуться на практике с передачей сравнительного большого
снимка ZFS по сети. В учебных материалах и официальной документации сказано, что
для передачи по сети следует использовать команды send\recv в сочетании с ssh
через пайп. На практике же это решение оказывается абсолютно не работоспособным
для больших объемов. Лично у меня скорость передачи уперлась примерно в 8 MB/sec
по гигабитной сети, что привело к тому что за 12 часов скопировалось лишь 300
гигабайт данных.
Что же делать?
Во-первых, требуется
собрать на обеих машинах программу mbuffer. Отличная альтернатива
ssh для передачи данных в защищенной сети.
Делаем снапшот:
# zfs snapshot
tank/tones@$(date +%y%m%d%H%M)
Запускаем на приемнике ожидание потока
данных
# /usr/local/bin/mbuffer -s 128k -m 1G -I 9090 | zfs receive
zshare/test
Запускаем передачу снимка на передатчике
# zfs send
tank/tones@1105101812 | /usr/local/bin/mbuffer -s 128k -m 1G -O
10.99.88.55:9090
Подробное описание ключей прочитаете в манах к mbuffer - там
все понятно. Наблюдаем около сотни метров в секунду, радуемся.
Если же вы все
же решили передать снимок по ssh (малый объем\незащищенная сеть), то делать надо
это следующим образом.
Делаем снимок как сказано выше. На приемнике даем
следующие разрешения пользователю, под которым происходит соединение
# zfs
allow user create,mount,receive zshare
Запускаем передачу на источнике
#
zfs send tank/tones@1105101812 | ssh -C -b 10.0.64.50 user@10.99.88.55
/usr/sbin/zfs recv zshare/tones
Вторая задача: поддерживать 2 датасета на разный хостах в состоянии максимально
возможной идентичности. Используем возможность передачи
инкримента двух снапшотов.
Вначале был передан полный снапшот объемом около террабайта с помощью mbuffer, как это было описано в выше. Также предоставлены соответствующие права пользователю и
прописаны rsa-ключи. Процесс занял примерно 4 часа по гигабитному
каналу.
Дальше в планировщик добавляем вот такой скрипт:
Частоту вызова данного скрипта следует выбирать исходя из следующих факторов:
Скорость роста снапшотов
Ширина канала между хостами
Нагрузка на активном пуле
Ориентировочно: двухгигобайтный инкримент
у меня передался примерно за 12 минут по гигабитному каналу. Причем узким местом
была не сеть. Скорее всего это была реализация инкриментации в самом zfs,
глубоко не копал.
Так же на приемнике следует подчищять старые снапшоты,
чтобы их число не росло бесконечно, что быстро приведет к исчерпанию свободных
блоков. Но при этом требуется оставлять как минимум последний снимок, чтобы
иметь возможность накатить следующий инкримент.
#!/usr/bin/bash
#=== Options ==============
zfs_pool=zshare
zfs_dataset=dataset
#=========================
nsnap=$(zfs list -o name -r ${zfs_pool}/${zfs_dataset}|egrep"@auto_1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"|wc-l)
if[[ ${nsnap} -gt 3 ]]
then
let"nsnap_destroy = $nsnap - 2"
snap_destroy_list=$(zfs list -o name -r ${zfs_pool}/${zfs_dataset}|egrep"@auto_[0-9]10"|head-n ${nsnap_destroy})