zfs - файловая система будущего
DESCRIPTION
Доклад на конференции "Использование технологий ОС Solaris в облачной инфраструктуре"TRANSCRIPT
Git in Sky, 2013
ZFS — файловая система будущего
Git in Sky, 2013
Пара слов о будущем
● Первый релиз ZFS был в 2005-м● 2005-й — не совсем «будущее»● «Конверсионные военные технологии»?● «Нанопокрытие» в «Телемагазине»?● «Парадокс близнецов»:● Пока коллеги несли вахту в космосе, здесь,● на Земле, многое изменилось
Git in Sky, 2013
Итак, кто я?
● Ваш проводник по современной Земле● (Веб) разработчик с большим стажем● Инженер по эксплуатации веб-проектов с большим стажем
● Инженер компании Git in Sky● ZFS-аддикт● ^ а можно ли верить словам наркомана?
Git in Sky, 2013
Кто вы?
● Вернувшиеся на Землю космо(астро?)навты● Архитекторы программных систем● CIO, CTO● Веб-разработчики● Системные администраторы (инженеры)
Git in Sky, 2013
Зачем?
● Файловая система хранит данные● Хорошая файловая система обеспечивает быстрый доступ и быструю модификацию
● UNIX way:● Файловая система хранит данные● Менеджер томов управляет томами● fdisk создает разделы на дисках● <другая программа> делает бэкапы● Engineer's way:● challenge the UNIX way
Git in Sky, 2013
В чем проблема?
● Языков программирования — 100 и больше● Современных FS — 10 и вряд ли больше ● http://en.wikipedia.org/wiki/Memory_hierarchy● Rotational media — медленно● Non-rotational media — дорого, относительно ненадежно, относительно ново
● Нужен компромисс● ^ (пока еще)
Git in Sky, 2013
Немного истории
● FAT — 1977● HFS — 1985● JFS — 1990● VxFS — 1991● ext2 — 1993● NTFS — 1993● ReiserFS — 2001● ZFS — 2005● btrfs — 2009
Git in Sky, 2013
Возможности ZFS
● Управление томами● Управление разделами● Двухуровневое кэширование● Контроль целостности данных● Сжатие данных● Дедупликация● Снэпшоты● (псевдо)Репликация
Git in Sky, 2013
Словарик
● «физический том» - «пул»● «раздел» - «дейтасет»● «логический том» - «ZVOL»● «RAID1» - «mirror»
● «RAID5» ~ «raidz», «raidz1»● «RAID6» ~ «raidz2»● ^ нет времени объяснять, создавайте пул!● Бывает также «raidz3»● ^ цифра — просто число parity disks
Git in Sky, 2013
Создание пула
● zpool create <name> <vdev1> ... <vdevN>● vdev - <type> <dev1> ... <devN> ● vdev types: «disk», «file», «mirror», «raidz», «raidz2», «raidz3», «spare», «log», «cache»
● «raidz» - это такой RAID5 без проблемы «RAID5 write hole»
● vdevs не могут быть вложенными (нельзя сделать зеркало зеркал и т.п.)
● Про «log» и «cache» поговорим отдельно
Git in Sky, 2013
Операции с пулом
● zpool destory - никогда так не делайте!● zpool export - «отключить» пул● zpool import - «подключить» пул● zpool replace <name> <dev1> <dev2> - заменить устройство dev1 устройством dev2
● ^ при этом выполнится операция «resilvering», при которой вся занятая часть пула прочитывается и перераспределяется с учетом добавленного устройства
● Это еще не всё!
Git in Sky, 2013
Управление дейтасетами
● pool0 исходно смонтирован в /pool0● /etc/fstab по умолчанию не используется● точка монтирования — свойство раздела● zfs create pool0/nfs-exports● ^ точка монтирования наследуется и будет /pool0/nfs-exports
● zfs set mountpoint=/var/lib/nfs-exports pool0/nfs-exports
● ^ установим другую точку монтирования (целевой каталог обязательно должен быть пустым!), изменения мгновенны
Git in Sky, 2013
Управление дейтасетами
● zfs umount <name>● zfs mount <name>● zfs rename <oldname> <newname>
● zfs userspace <name>● zfs groupspace <name>● ^ показывают, сколько места занимают файлы пользователей/групп
Git in Sky, 2013
Управление дейтасетами
● zfs set userquota@name=size ● ^ ограничивает выделенное пространство
Git in Sky, 2013
Свойства дейтасетов
● zfs get all zpool/live● пул свойство значение происхождение● zpool/live quota 3.91T local● zpool/live recordsize 128K default● zpool/live compression lz4 local● zpool/live primarycache all default● zpool/live secondarycache all default● zpool/live sync disabled local● И это еще не всё!
Git in Sky, 2013
Кэширование
● ARC (adaptive replacement cache) — одна из главных составляющих ZFS
● Кэширует frequently used и recently used records, динамически распределяя память между ними
● L2ARC — кэш второго уровня (тип vdev «cache», обычно используется SSD)
● Необходимо помнить, что при использовании L2ARC из ARC выделяется память под headers, что сказывается на эффективном размере ARC
Git in Sky, 2013
Размер ARC в памяти
Git in Sky, 2013
Сколько отдать под ARC?
● MRU Ghost / MFU Ghost — «уже были в кэше, но быливытеснены,и попалив негоопять»
● меньше - лучше
Git in Sky, 2013
Размер L2ARC
Git in Sky, 2013
Снова свойства дейтасетов
● zpool/live primarycache all default● zpool/live secondarycache all default● Варианты вместо «all»:● «metadata» - только метаданные● «none» - вообще ничего● По умолчанию - «all», что означает «кэшировать всё»
Git in Sky, 2013
Снова операции с пулом
● Контроль целостности данных:● zpool scrub pool0 — запустить проверку● zpool scrub -s pool0 — прервать проверку● ZFS хранит контрольные суммы каждой записи и проверяет их соответствие
● В связи с тем, что под действием злых сил из космоса битики протухают — это очень здравая идея
● А иногда и космос не при чем● zpool status <name>
Git in Sky, 2013
Иногда протухает сама железка
● Да, я уже заказал новую
Git in Sky, 2013
Сжатие данных
● zpool/live compression lz4 local● compression: «on», «off», «lzjb», «gzip-N» (1-9), «gzip» (6), «zle», «lz4»
● Раньше default был «lzjb», сейчас — «lz4»● Каждый record сжимается отдельно, чем больше recordsize, тем лучше сжатие
● Я включаю сжатие всегда — чем меньше данных на диске, тем быстрее они читаются
● Если данные уже сжаты — можно отключать● zroot/nfs/old-mysql refcompressratio 2.49x
Git in Sky, 2013
Дедупликация?
● Нет, не слышал!● Сравниваются контрольные суммы записей, если совпадают — вторая копия не хранится
● Не бесплатно — таблицы дедупликации хранятся в RAM (есть патчи для хранения их на SSD, но они не в открытом доступе)
● ^ вот поэтому я ее никогда не использую — RAM более дорогой ресурс, чем пространство на диске
Git in Sky, 2013
Снэпшоты
● Снэпшот — мгновенное состояние системы● ZFS работает при помощи механизма CoW — данные никогда не перезаписываются
● Создание снэпшота происходит мгновенно● Практически не потребляют ресурсов (кроме места на диске)
● Проблемы начинались при 3000-6000 снэпшотов
● Сравните с LVM!● Но чудес не бывает — удаление снэпшотов достаточно ресурсоемко
Git in Sky, 2013
Работа со снэпшотами
● zfs snapshot <dataset>@<snapshot_name>● zfs snapshot zroot/vbox-images/client@clean ● Снэпшоты можно только читать● ^ на самом деле, их можно клонировать● zfs clone zroot/vbox-images/client@clean zroot/vbox-images/client-2
● Клоны снэпшотов — обычные дейтасеты (r/w)● Иерархия — дерево
Git in Sky, 2013
Сценарий использования №1
● Снэпшоты — отличная защита от логического сбоя («хакер удалил весь контент»)
● Их можно делать хоть каждый час● Восстановление:● zfs rollback <snapshot_name>● ^ я никогда не использовал, деструктивно, убьет все более поздние данные
● zfs set mountpoint=/tmp1 zroot/orig_ds● zfs clone zroot/orig_ds@snap zroot/new_ds● zfs set mountpoint=/orig zroot/new_ds● ^ так мне нравится гораздо больше
Git in Sky, 2013
Сценарий использования №2
● Окружения разработчиков — большой дамп базы, нужен каждому свежий
● 10 окружений — 10 баз● 10 раз вливать дамп?● Дамп вливается один раз, после чего zfs snapshot, zfs clone и ряд других манипуляций
● ^ очень сильно экономятся время и место
Git in Sky, 2013
Репликация
● zfs send <snap_name> | zfs receive <name>● send читает данные с диска и пишет в stdout, receive — с stdin пишет на диск
● Это не было бы похоже на репликацию, если бы не
● zfs send -i <base_snapshot> <target_snapshot>● ^ генерит инкрементальные апдейты● Их можно пересылать по сети● Чтобы применять инкрементальные апдейты, целевой дейтасет должен быть немодифицированным (я ставлю в r/o)
Git in Sky, 2013
ZFS не умеет
● Наливать пиво● Работать на low-end железе● Быть кластерной файловой системой● Поддерживать флаг O_DIRECT вызова open()● ^ cache=none для KVM не работает● innodb_flush_method=O_DIRECT не работает
● ^ свойство sync=disabled — это то же самое
Git in Sky, 2013
ZFS бывает под
● Oracle Solaris 11● OpenSolaris — Illumos — Illumos-based distros (тысячи их!)
● FreeBSD● NetBSD (не пытайтесь дома)● MacOS X● Linux:● ZFS-FUSE● ZoL — kernel module● нельзя включить в ядро, CDDL — GPL
Git in Sky, 2013
В ZFS нельзя
● Начинать использование, не настраивая:● Нужно понимать характер нагрузки● Базы данных и системы виртуализации требуют recordsize=8k, а не 128k default
● Разделу, экспортированному по NFS, лучше поставить sync=disabled, иначе высокое latency
● Занимать пул более чем на 70-80%● ^ помните, у меня стояла quota? Специально поставлена!
Git in Sky, 2013
Бывают ли проблемы?
● http://goo.gl/GulrMQ — пишут , что нет (врут)● http://goo.gl/AUguXi — восстановление пула после сбоя вручную (ZFS не была причиной сбоя)
● За два года использования у меня был один сбой (ZFS не была причиной сбоя)
● Я поступил как читер — вместо ручного восстановления просто импортировал пул в Solaris 11, в версии ZFS которого проблема уже была исправлена
Git in Sky, 2013
Выводы
● ZFS — отличный продукт инженерной мысли● Вы можете не использовать ZFS, но теперь, после того, как я вам все рассказал,
● Вы должны придумать ответ на вопрос:● «Почему я еще не использую ZFS?»● (И это должен быть не стыдный ответ)
Git in Sky, 2013
Обязательный слайд
● Спасибо! С вами был● Александр Чистяков, инженер● Компания Git in Sky● [email protected]