Назад | Перейти на главную страницу

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

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

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

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

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

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

Это «продолжение» ответа 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, поэтому две четверки будут записаны на немного больше.

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

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

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

zfs send tank/bar > bar.zvol

zfs receive tank/bar < bar.zvol

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