Все о Linux. LinuxRSP.Ru

[an error occurred while processing this directive]

Cвежие новости Linux и BSD, анонсы статей и книг прямо в почтовый ящик!
Подписаться письмом


 Сегодняшние новости:

25 лет исполнилось ядру Linux

Релиз KDevelop 5.0

Oracle открывает код JDK9 для ARM

Выпущен Timewarrior 1.0.0

Релиз Android 7.0

Percona Memory Engine для MongoDB на базе WiredTiger

PowerShell открыт и доступен для Linux

Форк TrueCrypt: VeraCrypt 1.18

Релиз Snapcraft 2.14

Релиз Go 1.7

Стабильный выпуск рабочего стола Lumina

Вышла первая версия аналога OpenCV - DCV 0.1

Выпуск минималистичной программы для мониторинга jsonmon 3

В MIT разработали новый язык программирования

Первый релиз Qt5Gtk2

Godot 2.1 - новая версия открытого игрового движка

Свободная цифровая станция звукозаписи: Ardour 5.0

Обновление SkypeWeb Plugin for Pidgin

Вышла версия 3.0 Android File Transfer для Linux (и для OS X)

Программный аналог MIDI-контроллера для создания музыки: Launchpadd v1.3

Mozilla спонсирует поддержку Python 3.5 в PyPy

Ef 0.08 - программа для моделирования динамики заряженных частиц

Обновление текстового редактора TEA до версии 42.0.0

Релиз OpenOrienteering Mapper 0.6.4

Вышли Guix и GuixSD 0.11

Релиз Opera 39

Выпуск LibreOffice 5.2

В OpenSSH обнаружены и устранены некоторые уязвимости

Эмулятор FCEUX 2.2.3

Компания Билайн переходит на российскую СУБД с открытым исходным кодом Tarantool

Google

 Новые статьи :

Утилиты для восстановления потерянных данных в Linux

Лучшие файловые менеджеры для Android

20 лучших бесплатных книг о Linux

Как сгенерировать открытый/закрытый SSH-ключ в Linux

Grive - клиент Google Drive для Linux с открытым исходным кодом

Протокол IPv6: варианты подключения

Сервер из образа: DHCP + TFTP + Initrd + OpenVZ

Обзор веб-панелей управления хостингом

Приёмы работы с Vim

Nginx как Reverse Proxy для сайта, использующего SSL

Разработка модулей ядра Linux

Мониторинг нагрузки http-сервера Apache 2

Перевод комментариев к файлу конфигурации Squid

Решение проблем при использовании "1c предприятие" 8.2 в Linux

Advanced Bash-Scripting Guide Искусство программирования на языке сценариев командной оболочки







Rambler's Top100





 
 

Передача снапшота ZFS по сети

Пришлось наконец столкнуться на практике с передачей сравнительного большого
снимка 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 часа по гигабитному
каналу.
Дальше в планировщик добавляем вот такой скрипт:

#!/usr/bin/bash
#=== Options ==============
zfs_pool=zshare
zfs_dataset=dataset
lockfile="/var/run/zfs_operation.lock"
zsnapname=auto_$(date +%y%m%d%H%M)
mail_recipients="admin@tele2.com"
RHOST=192.168.0.1
RUSER=snapuser
#==========================
function check_result {
last_comm_res=$?
if [[ "${last_comm_res}" -ne 0 ]]
then
echo "Script: an error occurred"
cat /var/log/tones_backup.log|mailx -s "${HOSTNAME}:Pool backup error" ${mail_recipients}
exit ${last_comm_res}
fi
}
if [ -f ${lockfile} ]
then
echo "Previous runjob does not complitted successfully"
exit 1
fi
touch ${lockfile}
if [[ ! -z $(ps -ef|grep zfs|grep send|grep ${zfs_pool}) ]]
then
echo "Sending data from pool ${zfs_pool} detected! Try again later!"
exit 1
fi
rlast_snapshot=$(ssh ${RUSER}@${RHOST} "/usr/sbin/zfs list -o name -r ${zfs_pool}/${zfs_dataset}|tail -1"|awk -F@ '{print $2}')
zfs list -o name ${zfs_pool}/${zfs_dataset}@${rlast_snapshot} ; check_result
zfs snapshot ${zfs_pool}/${zfs_dataset}@${zsnapname} ; check_result
zfs send -i ${zfs_pool}/${zfs_dataset}@${rlast_snapshot} ${zfs_pool}/${zfs_dataset}@${zsnapname} | ssh ${RUSER}@${RHOST} "/usr/sbin/zfs recv -F ${zfs_pool}/${zfs_dataset}"
check_result
rm ${lockfile}

Частоту вызова данного скрипта следует выбирать исходя из следующих факторов:

  • Скорость роста снапшотов
  • Ширина канала между хостами
  • Нагрузка на активном пуле

Ориентировочно: двухгигобайтный инкримент
у меня передался примерно за 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})
for dsnap in ${snap_destroy_list}
do
zfs destroy ${dsnap}
done
fi


Иcтoчник
      

Связь | О проекте LinuxRSP | Реклама | О Linux
© 1999-2024 LinuxRSP