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

Как «перебалансировать» данные в zfs? (Убедитесь, что данные распределены по всем полосатым зеркалам)

Используя полосатое зеркало (Raid 10) в качестве примера, если два диска расширены до четырех, как можно «повторно сбалансировать» (распределить) данные с двух дисков между двумя зеркалами?

То есть, как файлы, записанные на одно зеркало, можно записать на два зеркала, чтобы использовать чередующиеся диски?

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

Два возможных решения:

  1. Подождите, пока все старые данные будут снова записаны (из-за CoW это может занять очень много времени, в худшем случае вдвое больше, чем потребуется для полной записи на диск).
  2. Удалите все данные и запишите их заново (zfs send / recv помогает получить все данные из пула и обратно без потери чего-либо). Необязательно делать все за один раз, и это можно сделать в одном пуле.

Чтобы быть более точным, я бы выбрал второе решение и передавал каждую файловую систему отдельно в моменты, когда загрузка системы низкая (например, ночью):

  • Сделайте снимок (zfs snapshot -r) файловой системы приличного размера (и последующих файловых систем рекурсивно)
  • Использовать zfs send | zfs recv с соответствующими параметрами для отправки снимка во вновь созданную временную файловую систему (может находиться в том же пуле, если позволяет пространство); эта файловая система должна находиться в том же месте иерархии, что и старая
  • После того, как копирование будет выполнено (это может занять некоторое время, потому что диски должны читать и писать), zfs destroy старый снимок и старая файловая система
  • zfs rename временная система на старое имя
  • Проверьте и измените точки монтирования с помощью zfs mount, изменяя предыдущую ситуацию для вашей замененной файловой системы
  • Повторяйте, пока все файловые системы не будут перемещены

возможное третье решение (как упоминалось SirMaster на этом форуме FreeNAS Почта):

  • добавить новый диск (и) в zpool
  • скопируйте много файлов в другой новый каталог / mnt / pool / temp /
  • удалить исходные файлы: rm -rf original/
  • переименовать каталог обратно: mv temp/ original/

Это работает, потому что ZFS будет пропорционально размещать записи на тот vdev, у которого больше всего свободного места, в данном случае на новые диски, которые были пустыми. (начиная с версии 0.7 zfs будет предпочитают более быстрые диски для записи, но предположим, что ваши 2 новых диска имеют такую ​​же или большую производительность, чем исходные диски)

Наверное, медленнее, чем zfs send | zfs recv, но проще, потому что вам не нужно создавать / уничтожать снимки.

Вы можете запустить zpool list -v до и после, чтобы увидеть использование каждого vdev.

Также нашел php сценарий который выполняет процедуру копирования / удаления / переименования для каждого файла отдельно. Это было связано в ответ из аналогичного (но звол) вопрос на несколько лет старше. (лично не тестировал этот скрипт)