Увеличение размера ZFS пула
Увеличение размера ZFS пула путём замены дисков
Имеется пул с данными, например mirror или raidz. Заканчивается место, хочется поставить жёсткие диски побольше и тем самым увеличить размер пула. Задача, скажем так, достаточно нетривиальная для аппаратных и даже программных RAID. С ZFS эта задача решается легко и просто. Всё, что для этого нужно - по очереди заменить все диски на более объёмные. После замены каждого диска нужно выполнять синхронизацию (по-умолчанию она запускается автоматически после замены диска). Продемонстрирую пример того как это сделать на виртуальных дисках.
Создам 3 диска по 200 Мб:
# mdconfig -s 200m -u md0 # mdconfig -s 200m -u md1 # mdconfig -s 200m -u md2 # mdconfig -lv md0 swap 200M md1 swap 200M md2 swap 200M
И пул TEST с raidz на их основе:
# zpool create -m /mnt TEST raidz md0 md1 md2 # zpool status TEST pool: TEST state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM TEST ONLINE 0 0 0 raidz1 ONLINE 0 0 0 md0 ONLINE 0 0 0 md1 ONLINE 0 0 0 md2 ONLINE 0 0 0 errors: No known data errors # zpool list TEST NAME SIZE USED AVAIL CAP HEALTH ALTROOT TEST 584M 153K 584M 0% ONLINE -
Теперь сюда можно скопировать какой-нибудь файл, для проверки целостности результата:
# dd if=/dev/random of=/mnt/test.file bs=1m count=100 100+0 records in 100+0 records out 104857600 bytes transferred in 2.463299 secs (42567958 bytes/sec) # md5 /mnt/test.file > /mnt/test.file.md5 # cat /mnt/test.file.md5 MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468
Теперь заменим диск md0 на больший, размером 300Мб. Предварительно выведем в offline текущий диск:
# zpool offline TEST md0 # zpool status TEST pool: TEST state: DEGRADED status: One or more devices has been taken offline by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Online the device using 'zpool online' or replace the device with 'zpool replace'. scrub: none requested config: NAME STATE READ WRITE CKSUM TEST DEGRADED 0 0 0 raidz1 DEGRADED 0 0 0 md0 OFFLINE 0 0 0 md1 ONLINE 0 0 0 md2 ONLINE 0 0 0 errors: No known data errors # mdconfig -du md0 # mdconfig -s 300m -u md0
Теперь заменяем этот диск:
# zpool replace TEST md0 md0 # zpool status TEST pool: TEST state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Mon Aug 3 14:52:54 2009 config: NAME STATE READ WRITE CKSUM TEST ONLINE 0 0 0 raidz1 ONLINE 0 0 0 md0 ONLINE 0 0 0 50,2M resilvered md1 ONLINE 0 0 0 147K resilvered md2 ONLINE 0 0 0 148K resilvered errors: No known data errors
Так как диски маленькие и виртуальные, то синхронизация тут проходит быстро, на реальных дисках эта операция занимает времени побольше. Теперь то же самое нужно проделать с md1 и md2.
# zpool offline TEST md1 # mdconfig -du md1 # mdconfig -s 300m -u md1 # zpool replace TEST md1 md1 # zpool status TEST pool: TEST state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Mon Aug 3 14:55:27 2009 config: NAME STATE READ WRITE CKSUM TEST ONLINE 0 0 0 raidz1 ONLINE 0 0 0 md0 ONLINE 0 0 0 83K resilvered md1 ONLINE 0 0 0 50,1M resilvered md2 ONLINE 0 0 0 86K resilvered errors: No known data errors # zpool offline TEST md2 # mdconfig -du md2 # mdconfig -s 300m -u md2 # zpool replace TEST md2 md2 # zpool status TEST pool: TEST state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Mon Aug 3 14:57:01 2009 config: NAME STATE READ WRITE CKSUM TEST ONLINE 0 0 0 raidz1 ONLINE 0 0 0 md0 ONLINE 0 0 0 83,5K resilvered md1 ONLINE 0 0 0 86K resilvered md2 ONLINE 0 0 0 50,1M resilvered errors: No known data errors # zpool list TEST NAME SIZE USED AVAIL CAP HEALTH ALTROOT TEST 584M 151M 433M 25% ONLINE -
Проверяем контрольную сумму:
# cat /mnt/test.file.md5 && md5 /mnt/test.file MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468 MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468
Что же в итоге? Размер не изменился. Для того чтобы ZFS "увидела" появившееся свободное место нужно выключить пул из работы и подключить обратно.
# zpool export TEST # zpool import TEST # zpool list TEST NAME SIZE USED AVAIL CAP HEALTH ALTROOT TEST 884M 150M 734M 17% ONLINE - # zpool status TEST pool: TEST state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM TEST ONLINE 0 0 0 raidz1 ONLINE 0 0 0 md0 ONLINE 0 0 0 md1 ONLINE 0 0 0 md2 ONLINE 0 0 0 errors: No known data errors # cat /mnt/test.file.md5 && md5 /mnt/test.file MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468 MD5 (/mnt/test.file) = 70694d6c958368c1337c909211625468
Свободное место увеличилось, контрольные суммы совпадают.