ZFS: распространять zvol по всем дискам в zpool?

12

Есть ли способ, с помощью которого ZFS может быть предложено перераспределить данную файловую систему по всем дискам в ее zpool?

Я думаю о сценарии, в котором у меня есть том ZFS фиксированного размера, который экспортируется как LUN поверх FC. Текущий zpool небольшой, всего два зеркальных диска по 1 ТБ, а zvol всего 750 ГБ. Если бы я вдруг увеличил размер zpool до, скажем, 12 дисков по 1 ТБ, я считаю, что zvol все равно будет эффективно «размещаться» только на первых двух шпинделях.

Учитывая, что больше шпинделей = больше IOPS, какой метод я мог бы использовать, чтобы «перераспределить» zvol по всем 12 шпинделям, чтобы воспользоваться ими?

growse
источник

Ответы:

8

Вам нужно будет переписать ваши данные в расширенный zpool, чтобы сбалансировать их. В противном случае с течением времени ваши записи будут распределены по всему пулу.

ewwhite
источник
Я не думаю, что есть быстрый и простой способ сделать это ...?
Growse
7
zfs send | zfs recv
the-wabbit
Я собираюсь проверить это - не могу поверить, что что-то настолько простое сделало бы это. :)
вырасти
3
Отчитайтесь, я никогда этого не делал и мне тоже любопытно.
Странно,
3

Нет причин хранить zvol только на начальных устройствах. Если вы увеличите пул, ZFS распространит обновленные данные на все доступные базовые устройства. В ZFS нет фиксированных разделов.

jlliagre
источник
4
По моему опыту, это не так. Хотя «фиксированного разделения» не существует, ZFS по собственному желанию не будет перемещать данные за пределы клиентских запросов ввода-вывода. Если вы создадите сценарий, который я описал, добавите больше дисков, а затем выполните тяжелый ввод-вывод на исходном LUN, вы увидите активность только на первых двух дисках в массиве, потому что именно там находятся данные. Он отмечает, что со временем он становится сбалансированным, но мне любопытно узнать, есть ли более быстрый способ сделать это.
Growse
1
Извините, если мне было неясно. Конечно, существующие данные не будут перемещаться волшебным образом. Только обновленные данные будут перемещены равномерно. Вот что я имел в виду под "новыми IO". Что касается существующих статических данных, кэширование также улучшит производительность, если блоки читаются более одного раза.
Jlliagre
0

Это «продолжение» ответа Ewwhite:

Вам нужно будет переписать ваши данные в расширенный zpool, чтобы сбалансировать их

Я написал PHP-скрипт ( доступный на github ) для автоматизации этого на моем хосте Ubuntu 14.04.

Нужно просто установить PHP CLI sudo apt-get install php5-cliи запустить скрипт, передавая путь к данным ваших пулов в качестве первого аргумента. Например

php main.php /path/to/my/files

В идеале вы должны запустить скрипт дважды для всех данных в пуле. При первом запуске будет сбалансировано использование дисков, но отдельные файлы будут чрезмерно выделены дискам, которые были добавлены последними. Второй запуск гарантирует, что каждый файл «справедливо» распределен по дискам. Я говорю честно, а не равномерно, потому что он будет распределен равномерно, только если вы не смешиваете емкость дисков, как я с моим рейдом 10 пар разных размеров (зеркало 4 ТБ + зеркало 3 ТБ + зеркало 3 ТБ).

Причины использования скрипта

  • Я должен решить проблему "на месте". Например, я не могу записать данные в другую систему, удалить их здесь и записать все обратно.
  • Я заполнил свой пул более чем на 50%, поэтому я не мог просто скопировать всю файловую систему сразу перед удалением оригинала.
  • Если есть только определенные файлы, которые должны работать хорошо, тогда можно просто запустить скрипт дважды над этими файлами. Однако второй запуск эффективен только в том случае, если при первом запуске удалось сбалансировать использование дисков.
  • У меня много данных, и я хочу видеть информацию о достигнутом прогрессе.

Как я могу узнать, достигнуто ли даже использование диска?

Используйте инструмент iostat в течение определенного периода времени (например, iostat -m 5) и проверьте записи. Если они одинаковы, то вы добились равномерного распространения. Они не совсем даже на скриншоте ниже, потому что я использую пару 4 ТБ с 2 парами 3 ТБ дисков в RAID 10, поэтому две 4 будут записаны немного больше. введите описание изображения здесь

Если загрузка вашего диска «несбалансированная», то iostat покажет нечто похожее на скриншот ниже, где новые диски записываются непропорционально. Вы также можете сказать, что они являются новыми дисками, потому что чтения равны 0, поскольку у них нет данных на них. введите описание изображения здесь

Сценарий не идеален, только обходной путь, но он работает для меня тем временем, пока однажды в ZFS не будет реализована функция балансировки, как в BTRFS (пальцы скрещены).

Programster
источник
Ой ... да ...
ewwhite
0

Что ж, это немного хакерство, но, учитывая, что вы остановили машину с помощью zvol, вы могли бы zfs отправить файловую систему в локальный файл на локальном хосте с именем bar.zvol, а затем снова получить систему возврата файлов. Это должно сбалансировать данные для вас.

zfs send tank/bar > bar.zvol

zfs receive tank/bar < bar.zvol
Кристиан
источник
-1

лучшее решение, которое я нашел, было дублировать половину ваших данных в расширенном пуле, а затем удалить исходные дублированные данные.

выздоровеет
источник
3
Можете ли вы уточнить?
Ewwhite
@reco: zvols не являются файловыми системами, поэтому вы не можете удалять или дублировать данные на них. Вы можете перезаписать данные, но это может повредить их, если вы не сделаете это с тем же контентом, который эффективно охватит данные на базовых томах, но это то, что ewwhite уже предложило год назад.
Jlliagre
да ты прав. я осматривался и исследовал ту же тему. я понял, что с zfs перераспределение данных по vdevs не нужно. но если вы все же захотите по какой-либо причине дублировать данные и удалять оригиналы, это ускорит то, что zfs сделает со временем.
Реко
1
Перераспределение данных через vdevs является законным запросом. Я боюсь, что вы все еще пропускаете вопрос о zvols, а не о файловых системах. Вы не можете дублировать или удалять данные на томе, это не имеет смысла.
Jlliagre
привет jlliagre. да вы правы извините
reco