включить редактирование

ZFS в Linux

Создан:

В Linux есть две крупные файловые системы — brtfs и ZFS. Вообще-то это даже не файловые системы, а полноценные решения по управлению хранением данных.
Сама ZFS — не новинка: она существует уже довольно долго. Изначально она была написана в Sun Microsystems в районе 2001-2005 гг. для Solaris, где интенсивно применялась.
Но до очень недавнего времени единственной реализацией ZFS в Linux была реализация через FUSE (функция ядра, позволяющая располагать системный код, такой как обработчик файловой системы, в адресном пространстве пользователя), и она с самого начала не была рассчитана на серьезный уровень. А теперь появилась «родная» версия ZFS для Linux от Ливерморской национальной лаборатории им. Лоуренса. Она доступна на zfsonlinux.orq.

Хотя и ZFS, и ядро Linux выпускаются под открытыми лицензиями, небольшой фрагмент этих лицензий, к сожалению, запрещает включать ZFS напрямую в двоичные файлы ядра. Поэтому дистрибутивов, в которых ZFS можно было бы выбрать во время установки, не существует (да, полагаю, и не появится, если лицензии не изменятся). Однако на сайте можно найти пакеты для нескольких крупных дистрибутивов Linux. Установка этих пакетов проста.

Установка
Хотя ZFS не включена ни в один дистрибутив Linux, ее достаточно легко установить в дистрибутив, ее поддерживающий, а к таковым относятся Debian, Fedora, Ubuntu, RHEL и CentOS. В Debian (которым пользуюсь я) это сделают четыре следующих команды:

# wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_1%7Ewheezy_all.deb
# dpkg -i zfsonlinux_1~wheezy_all.deb
# apt-get update
# apt-get install debian-zfs

При установке первого пакета в систему просто копируется несколько файлов, которые добавляют zfsonlinux в список репозиториев apt-get; вторая команда устанавливает пользовательские утилиты и собирает модуль ядра. На сборку потребовалось некоторое время.
В своих экспериментах (это только экспери-менты, я не назвал бы их реалистичным развертыванием — тогда мне понадобилась бы дюжина терабайтных дисков) я пользуюсь Debian 7, установленным на виртуальную машину. Я установил Debian на один диск размером 20 ГБ, затем создал еще четыре диска по 20 ГБ. На языке Linux это sdb, sdc, sdd и sde. Я не делал попытки использовать ZFS для корневого раздела, хотя уверен, что это возможно, и начал с создания zpool:

# zpool create data mirror sdb sdc mirror sdd sde

Давайте разберемся. Сперва мы создали пару зеркал: одно включает диски sdb и sdc, другое — sdd и sde. За счет этих зеркал мы получаем избыточность — и благодаря ей можем пережить потерю sdb или sdc и sdd или sde. Потом мы создали пул хранилища (так называемый zpool), распределенный на эти два зеркала. Такая конфигурация иногда называется RAID 10. Кроме того, мы создали набор данных (называемый «данными [data]» — можно было бы назвать его как угодно; более распространенный термин — «резервуар [tank]*), записали в него файловую систему и смонтировали его в каталог/data.
Команды, необходимые для того, чтобы сделать это на ext3 или ext4, оставим в качестве самостоятельного упражнения.
С помощью следующих команд можно посмотреть, что происходит:

# zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
data 39.8G 108K 39.7G 0% l.OOx ONLINE -
# zpool status data
pool: data.
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
data ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data

# df -h /data
Filesystem Size Used Avail Use% Mounted on
data 40G 0 40G 0% /data

Вывод ясно говорит о том. что у нас смонтирована файловая система объемом 40 ГБ, распределенная по двум зеркалам, mirror-0 и mirror-1. Я нарисовал небольшой рисунок, чтобы показать, что у нас получилось.

Создание наборов данных
Теперь я создаю наборы данных в своем zpool:

# zfs create data/home
# zfs list
MOUNTPOINT /data
/data/home /data/mysql /data/web
NAME USED AVAIL REFER MOUNTPOINT
data 146K 39.1G 31K /data
data/home 30K 39.1G 30K /data/home

#zfs create data/mysql
#zfs create data/web
#zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 224K 39.1G 33K /data
data/home 30K 39.1G 30K /data/home
data/mysql 30K 39.1G 30K /data/mysql
data/web 30K 39.1G 30K /data/web
#df-h/data/*
Filesystem Size Used Avail Use% Mounted on
data/home 40G 0 40G 0% /data/home
data/mysql 40G 0 40G 0% /data/mysql
data/web 40G 0 40G 0% /data/web

Внимательно рассмотрите, что происходит. У меня есть три новых набора данных (которым соответствовали бы три логических тома, пользуйся я LVM), но каждый из них видит все 40 ГБ пула. Обратите внимание, что каждый набор данных автоматически монтируется в соответствующую точку монтирования. После перезагрузки нужно перемонтировать наборы данных:

# zfs mount -а

Обратите внимание: записей в fstab нет, наборы данных «знают», куда им монтироваться. Попытаемся заполнить набор данных /data/home и скопируем туда все файлы из ISO-образа Debian (это порядка 3,8 ГБ):

# ср -a /media/cdromO/* /data/home

Пришлось подождать, но потом мы обнаружили следующее:

#zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 3.88G 35.2G 33K /data
data/home 3.88G 35.2G 3.88G /data/home
data/mysql 30K 35.2G 30K /data/mysql
data/web 30K 35.2G 30K /data/web
#df-h/data/*
Filesystem Size Used Avail Use% Mounted on
data/home 40G 3.9G 36G 10% /data/home
data/mysql 36G 0 36G 0% /data/mysql
data/web 36G 0 36G 0% /data/web
#du -sh /data/home
3.9G/data/home

Заметьте, что набор данных /data/home все еще видит все 40 ГБ доступного пространства, тогда как другие два набора данных уже знают, что из пула забрали около 4 ГБ.
Я решил повторить эксперимент старомодным способом — с файловыми системами ext4 на логических уровнях и программных устройствах RAID. Воспользуемся еще четырьмя виртуальными дисками (sdf, sdg, sdh and sdi), и дело пойдет примерно так.
Сначала мы устанавливаем модули ядра и пользовательские утилиты:

# apt-get install mdadm
# apt-get install lvm2

Затем создаем несколько зеркал:

# mdadm -C /dev/md0 -l 1 -n 2 /dev/sdf /dev/sdg
# mdadm -C /dev/md1 -l 1 -n 2 /dev/sdh /dev/sdi Создаем группу томов, распределенную по зеркалам:
# pvcreate /dev/md0
# pvcreate /dev/md1
# vgcreate data /dev/md0 /dev/md1

Создаем три логических тома, используя группу томов:

# Ivcreate -l 33%PV --name home data
# Ivcreate -l 33%PV --name mysql data
# Ivcreate -l 100%FREE --name web data

Создаем файловые системы:

# mkfs.ext4 /dev/data/home
# mkfs.ext4 /dev/data/web
# mkfs.ext4 /dev/data/mysql

Наконец, создаем точки монтирования и монтируем их:

# mkdir /home2 /web2 /mysql2
# mount/dev/data/home /поте2
# mount /dev/data/web /web2
# mount/dev/data/mysql /mysql2

В ZFS есть еще несколько важных возможностей. Вот три из них:

  •  Многоуровневое кэширование ZFS использует в качестве дискового кэша оперативную память и твердотельные жесткие диски, ускоряя операции чтения и записи.
  •  Дедупликация ZFS экономит дисковое пространство, поскольку хранит только одну копию блока данных, являющегося общим для нескольких файлов. Однако на таблицу дедупликации тоже расходуется память.
  •  Сжатие ZFS может прозрачно сжимать каждый записываемый файл. Нужно просто включить сжатие. Поддерживается несколько алгоритмов сжатия.
# df -h /*2
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-home 13G 161M 136 2% /home2
/dev/mapper/data-mysql 13G 161M 13G 2% /mysql2
/dev/mapper/data-web 14G 162M 13G 2% /web




Я нарисовал еще одну картинку, чтобы показать, что у нас получилось. Более важно то, что при создании логических дисков пришлось выделять конкретную долю группы томов на каждый из них. Если один из логических дисков запопнится, то в отличие от наборов данных ZFS он не сможет использовать свободное место с других логических дисков.
Как и в btrfs, в ZFS можно делать снимки, хотя здесь они устроены немного иначе.
Снимок можно создать командой

# zfs snapshot data/web@web-snap1


А на следующий день —

# zfs snapshot data/web@web-snap2

Список снимков выводится так:

# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
data/web@web-snap1 18K - 30.5K -
data/web@web-snap2 0 - 30.5K -

Откатит к снимку (обязательно к самому последнему) команда:

# zfs rollback data/web@web-snap2

Можно даже смонтировать снимок:

# mount -t zfs data/web@web-snap1 /mnt

Но учтите, что он доступен только для чтения.

Целостность данных
Внутри ZFS есть несколько важных возможностей, которые наши эксперименты не выявляют. Во-первых, она абсолютно параноидальна в вопросе целостности данных. Блоки пула ZFS образуют дерево Меркла [Merkie], в котором у каждого блока есть контрольная сумма дочерних блоков. А если вы в университете прогуляли лекцию о деревьях Меркла, не волнуйтесь — просто поймите, что они позволяют ZFS обнаруживать повреждение данных даже тогда, когда на аппаратном уровне нет ошибок контрольной суммы. Вместе с зеркалированием эта возможность позволяет ZFS самостоятельно исправлять ошибки, то есть неисправный блок на одной стороне зеркала будет автоматически обнаружен и перезаписан блоком с другой стороны.
Чтобы проверить это, я провел эксперимент, который вряд ли поставил бы над реальной системой: намеренно испортил один из дисков, обнулив его первые 100 Мбайт—

# dd if=/dev/zero of=/dev/sdb bs=1M count=100

и произошло нечто удивительное: все просто продолжило работать как обычно. Только когда я явно попросил пул просканировать себя на ошибки, что-то появилось:

# zpool scrub data
# zpool status data pool: data
state: ONLINE
status: One or more devices has experienced an unrecoverable error. [В одном или более устройствах неисправимая ошибка]
An attempt was made to correct the error. Applications are unaffected. [Сделана попытка исправить ошибку. Приложения не затронуты]
action: Determine if the device needs to be replaced, and clear the errors [Действия: Определите, требуется ли замена устройства, и исправьте ошибки]
using 'zpool clear1 or replace the device with 'zpool replace'
see: http://zfsonlinux.org/msg/ZFS-8000-9P scan: scrub in progress since Thu Apr 20 12:31:04 2013 77.7M scanned out of 3.75G at 7.77M/S, 0h8m to go 26.5K repaired, 2.02% done
config:
NAME STATE READ WRITE CKSUM
data ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 38 (repairing)
Sdc ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0

Важно отметить, что «ошибки», внесенные моей командой dd, не приводят к ошибкам контрольной суммы, которые могли бы быть обнаружены дисковым контроллером и помечены как ошибки чтения. Это «тихие ошибки», с которыми традиционная файловая система просто вернула бы пользователю неверные данные в полной уверенности, что с ними все в порядке.
У наборов данных довольно много свойств; некоторые из них (например, "creation" — время создания) доступны только для чтения, а некоторые (например, "mountpoint" — точка монтирования) — для чтения и записи.
Просмотреть значение свойства для набора данных можно таким образом:

# zfs get creation data/home
NAME PROPERTY VALUE SOURCE data/home creation Thu Apr 20 12:33 2013 -а установить его — так:
# zfs set mountpoint=/data/foobar data/web

Команда zfs get выведет список поддерживаемых свойств. Обратите внимание, что свойство "encryption", которое есть в руководстве по администрированию ZFS от Solaris, на данный момент в Linux не поддерживается.
Теоретические пределы ZFS находятся далеко за пределами воображения. Максимальный размер одного файла — 16 экса-байт (то есть 16 милпионов терабайт), а максимальный размер пула — 256 зетабайт -это очень много.
В наших экспериментах мы лишь слегка коснулись ZFS.
В заключение.
btrtfs, и ZFS являют собой огромный шаг вперед в управлении хранилищами данных и файловыми системами в Linux. Из этих двух я бы голосовал за ZFS, как лучше отработанную и технически более развитую. К сожалению, нестыковка между лицензиями CDDL и GPL (из-за которой ZFS нельзя включить в дистрибутив Linux) может серьезно замедлить распространение ZFS, по крайней мере, в корпоративных версиях.

Автор: join Просмотров: 6026


Рейтинг статьи: 0

Общий рейтинг по отношению ко всем статьям автора :
{0 [0]}[max] [ - - - - - - - - - - ]

Общий рейтинг из всех статей на сайте :
{0 [888]} [ - - - - - - - - - - ]

[?]
комментариев к данной статье нет

Добавить комментарий к статье


Ctrl+Enter

Для активации кнопки, введите символы, которые Вы видите на картинки.

новая

тема

Заметки на тему IT

Монитор поиска
[x]
Новое сообщение

Сообщения в чате

Вы спрашиваете у гостей/у зарегистрированных/ У Вас спрашивают
всем Ctrl+Enter
зарегистрированным Ctrl+Enter
Ctrl+Enter

Краткая инструкция по работе с чатом

  • Вы должны ввести имя, которое будет запомнено и применяться для чата и комментариев на сайте.
  • Выбрать одну из возможностей
    "Вы спрашиваете у гостей/
    у зарегистрированных/
    У Вас спрашивают"
  • Кликните на один из способов и появиться дополнительная информация