Увеличение размера 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
Свободное место увеличилось, контрольные суммы совпадают.