ZFS
Общая информация
В разделе Хранилища - ZFS основного меню содержится информация обо всех хранилищах ZFS, сконфигурированных в системе. ZFS-хранилища являются локальными, но возможности данных хранилищ значительно шире, чем у локальных файловых хранилищ. Создавая хранилище ZFS, необходимо подготовить сервер к созданию на нем пула данных типа zfs.
Создание
Для создания ZFS-хранилища необходимо в разделе Хранилища - ZFS основного меню нажать кнопку Добавить ZFS. В открывшемся окне необходимо выполнить следующие действия:
-
Выбрать сервер размещения ZFS.
-
Выбрать тип пула.
В типе пула необходимо выбрать режим RAID, который будет применяться к входящим в состав ZFS-хранилища дискам. Доступны следующие режимы: stripe, mirror, raidz1, raidz2. Режимы raidz1 и raidz2 соответствуют RAID5 и RAID6.
-
Выбрать локальные устройства.
-
Выбрать LUN-устройства.
-
Указать название пула.
-
Указать описание пула.
После заполнения полей необходимо подтвердить операцию, нажав кнопку ОК.
Порядок действий при отсутствии доступных устройств в списке
В списке доступных блочных устройств отображаются только устройства без разметки (разделов).
Чтобы очистить требуемое устройство от ранее созданной разметки, необходимо воспользоваться
командой CLI wipefs, после этого устройство появится в списке.
В случае устройств LUN может потребоваться отключить и заново подключить устройство.
Если устройство отсутствует и в списке доступных для создания
ZFS-пулов, и в списке доступных для очистки, возможно,
оно сохранилось в кэше ZFS, а сам пул уже не существует или
не активен. Чтобы убедится в этом, необходимо воспользоваться
командой zdb. Если в полях path вывода
команды есть нужные устройства, а ZFS-пул, указанный в поле
name вывода и к которому относятся данные устройства,
отсутствует на узле, то можно убрать этот пул из кэша командой
zpool destroy <pool_name>
. После этого нужные устройства можно
будет очистить командой CLI wipefs
и использовать далее.
Операции
Управление работой ZFS-хранилища происходит в окне подробного просмотра хранилища, которое открывается при нажатии на название хранилища.
Логика управления ZFS соответствует управлению работой RAID-контроллера.
В окне подробного просмотра ZFS-хранилища доступны следующие операции:
-
Расширение (добавление блочных устройств верхнего уровня). Расширение доступно для ZFS с типом пула stripe. Операция добавляет дополнительные устройства к имеющемуся хранилищу. После нажатия кнопки Расширить в открывшемся окне необходимо выбрать из раскрывающегося списка НЖМД сервера (Локальные устройства) или подключенные к серверу сетевые блочные устройства (LUN-устройства).
Примечание
Добавлять можно только по одному устройству. Если нет доступных устройств, то списки будут пустыми.
-
Добавление реплики. Операция доступна для ZFS с типами пула stripe и mirror, в составе которого только один диск. Операция преобразует хранилище в тип mirror. После нажатия кнопки Добавить реплику в открывшемся окне необходимо выбрать из раскрывающегося списка тип блочного устройства и присоединяемое устройство (НЖМД или LUN).
-
Добавление устройства горячей замены. Данная операция позволяет отметить неиспользуемое системой устройство как hot-swap для данного хранилища. После нажатия кнопки Добавить устройства горячей замены в открывшемся окне необходимо выбрать из раскрывающегося списка локальные устройства или подключенные к серверу LUN-устройства.
-
Добавление устройства под журналы. Операция вызывается нажатием кнопки Добавить устройства под журналы, в открывшемся окне необходимо выбрать из раскрывающегося списка локальные устройства или подключенные к серверу LUN-устройства.
-
Добавление устройства кэширования. Операция добавления устройства кэширования позволяет добавить кэш для ZFS RAID-массива. После нажатия кнопки Добавить устройства кэширования в открывшемся окне необходимо выбрать из раскрывающегося списка локальные устройства или подключенные к серверу LUN-устройства.
-
Сброс ошибок в пуле.
-
Проверка целостности данных (scrub).
-
Получение расширенных сведений о ZFS.
-
Удаление пула. Операция удаления позволяет расформировать ZFS-хранилище.
В окне подробного просмотра хранилища содержатся сведения, разделенные на следующие группы: Информация, Пулы данных, События, Задачи, Теги.
Информация
В разделе Информация подробного просмотра ZFS-хранилища отображаются сведения о ZFS-хранилище:
-
Название.
-
Описание (редактируемый параметр).
-
Сервер.
-
Состояние.
-
Общий размер.
-
Свободное пространство.
-
Дата и время создания.
-
Дата и время изменения.
-
Локальные устройства (раскрывающийся список). Каждое устройство содержит следующие сведения: Название, Размер, Состояние, Кэширование, Устройства под журналы, Устройства горячей замены.
Для каждого устройства доступны операции:
-
Включение (выключение) устройства.
-
Замена устройства.
-
Демонтирование устройства.
Удаление диска из состава ZFS возможно только для хранилища, в составе которого два или более дисков. Если в составе ZFS с типом mirror останется только один диск, то он преобразуется в тип stripe.
-
-
Устройства LUN (раскрывающийся список).
-
Дополнительные характеристики (раскрывающийся список):
-
Автозамена (вкл/выкл).
-
Точка монтирования.
-
Сдвиг (ashift).
-
Пулы данных
В разделе Пулы данных подробного просмотра ZFS-хранилища отображаются созданные в хранилище пулы данных в табличном виде, включая для каждого из них следующие сведения: Название, Тип, Количество серверов, Количество виртуальных дисков, Количество образов, Количество файлов, Использованный объем, Приоритет и Статус.
При нажатии на название пула открывается окно подробного просмотра, в котором доступны следующие операции:
-
Извлечение пула. Операция осуществляется с помощью кнопки Извлечь, также при извлечении можно включить или выключить опцию Форсированное извлечение.
-
Очистка пула. Операция осуществляется с помощью кнопки Очистить, также при очистке можно включить или выключить опцию Очистить принудительно.
-
Очистка несвязанных снимков дисков и памяти. Операция осуществляется нажатием на кнопку Очистить несвязанные снимки дисков и памяти и производит удаление несвязанных файлов снимков дисков и памяти с расширением .snapshot и .memory.
-
Сканирование. Операция осуществляется с помощью кнопки Сканировать и производит сканирование пула данных для обнаружения отсутствующих образов дисков и файлов. Также при сканировании можно включить или выключить опцию Удалять недопустимые.
-
Удаление пула данных. Операция осуществляется с помощью кнопки Удалить, также при удалении можно включить или выключить опцию Форсированное удаление.
Подробное описание раздела Пулы данных.
События
В разделе События подробного просмотра ZFS-хранилища отображаются зарегистрированные в системе события, связанные с работой выбранного хранилища.
Возможна их сортировка по признакам:
-
По всем типам.
-
Ошибки.
-
Предупреждения.
-
Информационные.
Также можно включить опцию Только непрочитанные, чтобы в списке событий отображались только непрочитанные события.
Задачи
В разделе Задачи отображаются зарегистрированные в системе задачи, возникающие при выполнении действий с выбранным ZFS-хранилищем.
Теги
В разделе Теги содержится список назначенных выбранному хранилищу тегов. Существует возможность создать, удалить, применить тег и обновить список назначенных хранилищу тегов.
ARC-кэш
При создании ZFS-пулов необходимо учитывать адаптивное использование памяти сервера под ARC-кэш.
Подробнее про ARC-кэш
Одним из основных моментов, о котором необходимо помнить при использовании ZFS на гипервизоре, является тот факт, что balloon ВМ, использующийся для оптимизации выделения и возвращения неиспользуемой памяти, некорректно работает вместе с динамическим ARC. Поэтому рекомендуется произвести выделение фиксированной памяти для ВМ: balloon=0 и указать максимальный размер ARC, таким образом, чтобы суммарная утилизация памяти для машин и кэша была меньше общего количества RAM на 2 Гбайта.
Минимальный размер ARC для комфортной работы ФС без активного режима записи/перезаписи в файлы ВМ примерно равен 1 Гбайт на хост + 1 Гбайт на 1 Тбайт, но при кэше меньше 3 Гбайт могут возникнуть проблемы с подключением к хранилищу, и для работы с активной перезаписью лучше использовать формулу 1 Гбайт + 4–5 Гбайт на 1 Тбайт без дедупликации, 5–6 Гбайт — с дедупликацией. Разово задать максимальный размер кэша до перезагрузки можно командой:
echo $[ N*1048576*1024 ] > /sys/module/zfs/parameters/zfs_arc_max
Параметр zfs_arc_max не может быть ниже текущего минимального размера кэша (zfs_arc_min), который можно посмотреть в выводе команды arc_summary в строке Min size (hard limit). Чтобы указать zfs_arc_max ниже данного значения, необходимо сперва таким же образом задать параметр zfs_arc_min. Важно помнить, что эти параметры не могут быть менее 64 Мбайт, а также больше объёма ОЗУ на узле. В противном случае заданные значения параметров будут проигнорированы.
Пример временного изменения максимального размера кэша до перезагрузки (видно изменение Max size (high water))
3гб: 3221225472
6гб: 6442450944
10гб: 10737418240
15гб: 16106127360
echo options zfs zfs_arc_max=16106127360>> /etc/modprobe.d/zfs.conf
update-initramfs -u
-
l2arc — на чтение — он собирает используемые в данный момент обращения и передает их через себя, что ускоряет запросы чтения к файловой системе хранилища. Минимальный размер l2arc примерно рассчитывается по формуле 2000 байт ARC на 1 блок l2arc, размер которого зависит от ashift ZFS-пула. Чем больше ashift, тем больше должен быть l2arc, но увеличивать его за пределы 500 байт на 1 блок данных пула не целесообразно — нельзя отдавать весь ARC под нужды l2arc, т.к. при максимальной загрузке вместо оперативной памяти система будет работать с устройством кэширования.
-
zil (slog) — кэширование записи. Каждая операция записи на пул будет считаться совершённой при попадании в zil, а на устройства хранения будет попадать уже «дельта» всех операций с минимальным количеством необработанных данных. Минимальный размер zil устройства примерно рассчитывается из скорости работы устройства, где будет размещён лог, и времени задержки записи необработанных данных * 2. Максимальный размер для конкретной системы нужно определять индивидуально, но на практике размер больше, чем скорость устройства * 10 с, имеет смысл только в узкоспециализированных системах, направленных на постоянное краткосрочное изменение данных с минимальной задержкой.
Пример размеров разделов кэширования и логов:
zil
приблизительная скорость записи на устройство:
[root@04bdd07c-5b93-40b3-9b52-148993161241 ~]#`sync; dd if=/dev/urandom of=tempfile bs=1M count=1024; sync`
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.10459 s, 176 MB/s
[root@04bdd07c-5b93-40b3-9b52-148993161241 ~]#`sync; dd if=/dev/urandom of=tempfile bs=1M count=1024; sync`
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.31901 s, 170 MB/s
[root@04bdd07c-5b93-40b3-9b52-148993161241 ~]#`sync; dd if=/dev/urandom of=tempfile bs=1M count=1024; sync`
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 7.0737 s, 152 MB/s
[root@04bdd07c-5b93-40b3-9b52-148993161241 ~]#`sync; dd if=/dev/urandom of=tempfile bs=1M count=1024; sync`
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.9285 s, 181 MB/s
Получается примерно 170 Mбайт/с, следовательно, раздел свыше 1700 Мбайт (1.7 Гбайт) будет бесполезным для данной системы. Округлив полученное значение, можно получить необходимый размер раздела под zil. Если переопределить время сброса данных на диск, то можно увеличить этот раздел, но это является не целесообразным.
Далее необходимо вычислить l2arc. Размер zfs_arc_max определён, например, в 10 Гбайтов.
ashift раздела:
zpool get all "ваш_пул_zfs" | grep ashift`
"ваш_пул_zfs" ashift 13 local
ashift это размер логического блока ZFS, равный степени двойки. ashift 13 = 2^13 = 8192 байт — размер сектора ZFS.
¾ ARC необходимо оставить свободной при максимальной загрузке (можно использовать без особых потерь до ⅔ ARC, но для
невысоконагруженных на чтение систем ¼ более чем достаточно), помня что в ARC 1 блок занимает примерно 400 байт,
необходимо взять 512 для упрощения чисел и рассчитать размер, при котором l2arc максимально занял бы примерно ¼ основного кэша:
10737418240/4 = 2684354560/512 = 5242880 — количество возможных блоков в l2arc.
Далее 5242880*8192 = 42949672960/1024 = 41943040/1024 = 40960/1024 = 40 Гбайт.
Итого при ashift 13 и 10 Гбайт ARC размер l2arc может варьироваться от 40 до 100 Гбайтов.
Больший размер или не даст улучшения скорости работы хранилища, или даже приведет к ее уменьшению.
Импорт ZFS-пулов
Импорт ZFS-пулов осуществляется с помощью следующих команд:
- Получение имен и параметров импортируемых ZFS-пулов:
zpool import
- Импорт в систему ZFS-пулов:
zpool import -C <pool_name>
— импорт из файла кэша, если пул там указан,
zpool import -d /dev/disk/by-id <pool_name>
— при проблемах с файлом кэша или если запись о ZFS-пуле из кэша отсутствует (например, если ZFS-пул не импортировался ввиду отсутствия дисков на этапе загрузки, а потом с исправными пулами проводились какие-либо манипуляции, не импортированные ZFS-пулы «забываются» кэшем).
Внимание
Важно указать каталог /dev/disk/by-id
, так как в противном случае возможен импорт ZFS-пула с короткими именами устройств, например, /dev/sdc
. Это может привести при последующей перезагрузке к пропаданию устройства из ZFS-пула, так как такие короткие имена назначаются устройствам лишь на основе порядка их определения, что может меняться от загрузки к загрузке, и одно и то же устройство может получать различные короткие имена.
- Проверка появления пула в системе:
zpool list
- Чтобы пул сохранился после перезагрузки, нужно пересоздать кэш с указанием этого ZFS-пула:
zpool set cachefile=/etc/zfs/zpool.cache <pool_name>
Загрузка системы с неполным набором устройств (дисков, LUN), входящих в ZFS-пулы
Если ZFS-пул, в котором не достаёт устройств, обладает достаточной избыточностью, чтобы компенсировать их отсутствие (для типа mirror должно остаться хотя бы одно устройство, для типа raidz1 возможно остаться без одного, для raidz2 — без двух устройств, устройства горячего резерва и кэша чтения на работоспособность не влияют), то такой ZFS-пул импортируется при старте системы обычным образом. В противном случае этот ZFS-пул не импортируется. Если есть техническая возможность вернуть в систему недостающие устройства под теми же именами, то после их возврата пострадавший ZFS-пул будет импортирован автоматически при перезагрузке узла, либо сразу через CLI — после проверки возможности импорта ZFS-пула командой zpool import
или zpool import -d /dev/disk/by-id
. Для проверки состояния кэша используют команду CLI zdb
. Она отображает сохраненные в кэше ZFS-пулы, входящие в них устройства, их типы, а также некоторую дополнительную информацию.
Внимание
Чтобы ZFS-пул был автоматически импортирован при старте системы, он должен быть указан в кэше /etc/zfs/zpool.cache
. Записи о ZFS-пулах появляются в кэше при их создании, также записи модифицируются при манипуляциях с ZFS-пулами. Если какой-то ZFS-пул не импортирован из-за повреждений, т.е. не виден в системе, то в момент модификации кэша (изменений имеющихся или создания новых ZFS-пулов) записи о нём удаляются из кэша, и при следующей перезагрузке данный ZFS-пул не будет импортирован автоматически. Это необходимо учитывать, и если есть необходимость и возможность вернуть данный ZFS-пул в работу, и в тоже время проводить какие-то действия над имеющимися ZFS-пулами узла, то нужно обеспечить работоспособность повреждённого ZFS-пула и импортировать его вручную до перезагрузки системы, либо импортировать его вручную после перезагрузки. Первый вариант предпочтительней, особенно если ZFS-пул участвует, например, в кластерном хранилище.
Также может быть полезна информация из меток устройств, входивших в ZFS-пул — zdb -l <device>
. Будет показано, принадлежит ли устройство ZFS-пулу, какому именно, какой GUID у этого устройства и на каком хосте создан данный ZFS-пул.
Пример информации из кэша о ZFS-пуле
Команда zdb
# zdb
zfs_115:
version: 5000
name: 'zfs_115'
state: 0
txg: 4
pool_guid: 879109887279304795
errata: 0
hostid: 4212788997
hostname: 'f96b4837-a7e3-43a1-ab52-37bdc4677b82'
com.delphix:has_per_vdev_zaps
vdev_children: 1
vdev_tree:
type: 'root'
id: 0
guid: 879109887279304795
create_txg: 4
children[0]:
type: 'disk'
id: 0
guid: 15989658986416599112
path: '/dev/disk/by-id/scsi-SATA_ST1000NX0313_S470HK28-part1'
devid: 'ata-ST1000NX0313_S470HK28-part1'
phys_path: 'pci-0000:00:1f.2-ata-1.0'
whole_disk: 1
metaslab_array: 256
metaslab_shift: 33
ashift: 13
asize: 1000189984768
is_log: 0
create_txg: 4
com.delphix:vdev_zap_leaf: 129
com.delphix:vdev_zap_top: 130
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
Видно, что ZFS-пул имеет имя name: 'zfs_115'
, GUID pool_guid: 879109887279304795
, содержит одно устройство /dev/disk/by-id/scsi-SATA_ST1000NX0313_S470HK28-part1 с GUID в пределах ZFS-пула guid: 15989658986416599112
. Пул принадлежит хосту hostname: 'f96b4837-a7e3-43a1-ab52-37bdc4677b82'
.
Информация из метки устройства, содержащегося на ZFS-пуле:
zdb -l /dev/disk/by-id/scsi-SATA_ST1000NX0313_S470HK28-part1
------------------------------------
LABEL 0
------------------------------------
version: 5000
name: 'zfs_115'
state: 0
txg: 2321441
pool_guid: 879109887279304795
errata: 0
hostid: 4212788997
hostname: 'f96b4837-a7e3-43a1-ab52-37bdc4677b82'
top_guid: 15989658986416599112
guid: 15989658986416599112
vdev_children: 1
vdev_tree:
type: 'disk'
id: 0
guid: 15989658986416599112
path: '/dev/disk/by-id/scsi-SATA_ST1000NX0313_S470HK28-part1'
devid: 'ata-ST1000NX0313_S470HK28-part1'
phys_path: 'pci-0000:00:1f.2-ata-1.0'
whole_disk: 1
metaslab_array: 256
metaslab_shift: 33
ashift: 13
asize: 1000189984768
is_log: 0
DTL: 50892
create_txg: 4
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
labels = 0 1 2 3
Видно, что устройство принадлежит ZFS-пулу с именем name: 'zfs_115'
, GUID пула pool_guid: 879109887279304795
, а само устройство имеет GUID в ZFS-пуле guid: 15989658986416599112
. Имя хоста hostname: 'f96b4837-a7e3-43a1-ab52-37bdc4677b82'
.