Глава 9. Тонкая настройка

Изучающий ZFS системный администратор обычно чешет свою голову над использованием пространства ZFS. Объединение собранных в пул хранилищ, наборов данных, снимков и клонов делает использование пространства ZFS очень сложным, занимающим целую главу в книге Мастерство FreeBSD: ZFS. Когда вы начинаете разгребать свои свойства recordsize и volblocksize для баз данных и zvol, использование пространства может свернуть прямиком в Сумеречную Зону.

Свойство volblocksize задаёт размер блока хранения в zvol. Размер блока должен представлять размер блока вашей файловой системы, используемый в данном zvol. Значение volblocksize по умолчанию равно 8кБ, что может содержать два 4кБ или 16 512-байтных сектора файловой системы.

Свойство recordsize задаёт максимальный размер логического блока в наборе данных файловой системы ZFS. Значение по умолчанию для recordsizeравно 128кБ, которое приводит к 32 секторам на диске с 4кБ секторами или 256 секторам на диске с 512 байтовым секторами. Максимальный размер записи был увеличен до 1МБ при введении в 2015г флага свойства large_blocks. Многие механизмы баз данных предпочитают блоки меньшего размера, например 4кБ или 8кБ. Имеет смысл изменить recordsize на наборах данных, выделенных для подобных файлов. Даже если вы не измените recordsize, ZFS автоматически откалибрует записи как нужно. Запись файла 16кБ должна занять только 16кБ пространства (плюс метаданные и пространство для избыточности), не растрачиваясь на целую запись в 128кБ.

Взаимодействие между размером блока и RAID-Z означает, что диски сервера могут неожиданно заполниться, даже если они имеют только 25 процентов данных, которые вы ожидали там разместить.

Понимание почему это происходит требует более глубоко погружения в то как ZFS выделяет блоки.

 Выделение чередований ZFS

Полосы создаются из секторов вашего физического диска (или других поставщиков, например, GELI). Если ваш диск имеет 4кБ секторы, выделение 128кБ потребует 32 физических сектора.

Zpool-ы хранят всю информацию контрольных сумм (parity) в дисковых секторах, или блоках. Каждый уровень чётности (parity) требует блока для каждой полосы. Пулу RAID-Z3 требуется три блока для контрольной информации для каждой размещаемой на диске порции.

Пулы RAID-Z всегда размещают блоки в множителях равных размеру чётности (parity) плюс один. То есть, RAID-Z1 размещает за раз два блока, RAID-Z2 три блока за раз, а RAID-Z3- четыре блока за раз. Это помогает ZFS предотвращать фрагментацию и уменьшает опасность потери большего пространства. Если полосе не требуется столько пространства, ZFS дополняет его чтобы заполнить всё размещение. Для обычных размеров полос не имеет значения дополнительный сектор или пара на файл. RAID-Z размещается в блоках согласованного размера, поэтому при освобождении блока он легко может применяться повторно.

Рассмотрим выделение 8кБ пространства в RAID-Z2. Хотя 8кБ требуют всего двух секторов {Прим. пер.: в оригинале: четырёх}, RAID-Z2 выделяет только со множителем три, следовательно оно требует шести блоков. Вы удаляете этот файл и выделяете для 4кБ файла в тех же самых секторах. Этому 4кБ файлу нужно только три блока. Если бы RAID-Z не заполнял до множителя N+1, вы бы получили единственный неиспользуемый дисковый блок между 4кБ файлом и вашим следующим файлом. Такой одинокий блок, осиротевший сектор, никогда не будет использован.

Записывайте и удаляйте, а ещё записывайте связки файлов различных размеров, и в скором времени ваш диск получит целую кучу свободного пространства- но всё оно будет из неприменимых одноблоковых кусочков. Ваш диск будет парализован.

Каждому файлу также необходимы прочие метаданные для присоединения его к вашему дереву ZFS, предоставления блоков содержащих этот файл, их хэш-сумм и тому подобного. Каждый такой блок метаданных содержит информацию по многим файлам и может быть опущен в данном обсуждении. Всё это кажется простым и не вызывает беспокойства, но давайте посмотрим как эти факторы факторы взаимодействуют с файловыми системами при использовании секторов 4кБ и 512-байт.

  Зеркалирование и чередование

Зеркалам и чередующимся записям требуется подключать блоки к вашему дереву ZFS, однако им не требуются дополнительные избыточные блоки. Наш файл с 8кБ использует два 4кБ или 16'512-байтные сектора диска.

  RAID-Z1

  RAID-Z2

  RAID-Z3

  Чередующиеся зеркала

  Изменение выделенного размера

  Рекомендации

 Выделение чередований ZFS

  Все базы данных

  MySQL – InnoDB/XtraDB

  MySQL – MyISAM

  PostgreSQL

 Выделение чередований ZFS

  Маленькие файлы

  Большие файлы

 Выделение чередований ZFS

 Выделение чередований ZFS